summaryrefslogtreecommitdiffstats
path: root/lib/libc/net/getnetbyht.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/net/getnetbyht.c')
-rw-r--r--lib/libc/net/getnetbyht.c125
1 files changed, 98 insertions, 27 deletions
diff --git a/lib/libc/net/getnetbyht.c b/lib/libc/net/getnetbyht.c
index 30422d5..580345a 100644
--- a/lib/libc/net/getnetbyht.c
+++ b/lib/libc/net/getnetbyht.c
@@ -83,8 +83,8 @@ _endnethtent(struct netent_data *ned)
ned->stayopen = 0;
}
-int
-getnetent_r(struct netent *ne, struct netent_data *ned)
+static int
+getnetent_p(struct netent *ne, struct netent_data *ned)
{
char *p, *bp, *ep;
char *cp, **q;
@@ -93,11 +93,11 @@ getnetent_r(struct netent *ne, struct netent_data *ned)
if (ned->netf == NULL &&
(ned->netf = fopen(_PATH_NETWORKS, "r")) == NULL)
- return -1;
+ return (-1);
again:
p = fgets(line, sizeof line, ned->netf);
if (p == NULL)
- return -1;
+ return (-1);
if (*p == '#')
goto again;
cp = strpbrk(p, "#\n");
@@ -113,7 +113,7 @@ again:
len = strlen(p) + 1;
if (ep - bp < len) {
RES_SET_H_ERRNO(__res_state(), NO_RECOVERY);
- return -1;
+ return (-1);
}
strlcpy(bp, p, ep - bp);
bp += len;
@@ -147,46 +147,94 @@ again:
}
}
*q = NULL;
- return 0;
+ return (0);
+}
+
+int
+getnetent_r(struct netent *nptr, char *buffer, size_t buflen,
+ struct netent **result, int *h_errnop)
+{
+ struct netent_data *ned;
+ struct netent ne;
+ res_state statp;
+
+ statp = __res_state();
+ if ((ned = __netent_data_init()) == NULL) {
+ RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
+ *h_errnop = statp->res_h_errno;
+ return (-1);
+ }
+ if (getnetent_p(&ne, ned) != 0)
+ return (-1);
+ if (__copy_netent(&ne, nptr, buffer, buflen) != 0)
+ return (-1);
+ *result = nptr;
+ return (0);
}
struct netent *
getnetent(void)
{
struct netdata *nd;
+ struct netent *rval;
+ int ret_h_errno;
if ((nd = __netdata_init()) == NULL)
- return NULL;
- if (getnetent_r(&nd->net, &nd->data) != 0)
- return NULL;
- return &nd->net;
+ return (NULL);
+ if (getnetent_r(&nd->net, nd->data, sizeof(nd->data), &rval,
+ &ret_h_errno) != 0)
+ return (NULL);
+ return (rval);
}
int
_ht_getnetbyname(void *rval, void *cb_data, va_list ap)
{
const char *name;
- struct netent *ne;
+ char *buffer;
+ size_t buflen;
+ int *errnop, *h_errnop;
+ struct netent *nptr, ne;
struct netent_data *ned;
char **cp;
+ res_state statp;
int error;
name = va_arg(ap, const char *);
- ne = va_arg(ap, struct netent *);
- ned = va_arg(ap, struct netent_data *);
+ nptr = va_arg(ap, struct netent *);
+ buffer = va_arg(ap, char *);
+ buflen = va_arg(ap, size_t);
+ errnop = va_arg(ap, int *);
+ h_errnop = va_arg(ap, int *);
- setnetent_r(ned->stayopen, ned);
- while ((error = getnetent_r(ne, ned)) == 0) {
- if (strcasecmp(ne->n_name, name) == 0)
+ statp = __res_state();
+ if ((ned = __netent_data_init()) == NULL) {
+ RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
+ *h_errnop = statp->res_h_errno;
+ return (NS_UNAVAIL);
+ }
+
+ _setnethtent(ned->stayopen, ned);
+ while ((error = getnetent_p(&ne, ned)) == 0) {
+ if (strcasecmp(ne.n_name, name) == 0)
break;
- for (cp = ne->n_aliases; *cp != 0; cp++)
+ for (cp = ne.n_aliases; *cp != 0; cp++)
if (strcasecmp(*cp, name) == 0)
goto found;
}
found:
if (!ned->stayopen)
- endnetent_r(ned);
- return (error == 0) ? NS_SUCCESS : NS_NOTFOUND;
+ _endnethtent(ned);
+ if (error != 0) {
+ *h_errnop = statp->res_h_errno;
+ return (NS_NOTFOUND);
+ }
+ if (__copy_netent(&ne, nptr, buffer, buflen) != 0) {
+ *h_errnop = statp->res_h_errno;
+ return (NS_NOTFOUND);
+ }
+ *((struct netent **)rval) = nptr;
+ return (NS_SUCCESS);
}
int
@@ -194,20 +242,43 @@ _ht_getnetbyaddr(void *rval, void *cb_data, va_list ap)
{
uint32_t net;
int type;
- struct netent *ne;
+ char *buffer;
+ size_t buflen;
+ int *errnop, *h_errnop;
+ struct netent *nptr, ne;
struct netent_data *ned;
+ res_state statp;
int error;
net = va_arg(ap, uint32_t);
type = va_arg(ap, int);
- ne = va_arg(ap, struct netent *);
- ned = va_arg(ap, struct netent_data *);
+ nptr = va_arg(ap, struct netent *);
+ buffer = va_arg(ap, char *);
+ buflen = va_arg(ap, size_t);
+ errnop = va_arg(ap, int *);
+ h_errnop = va_arg(ap, int *);
- setnetent_r(ned->stayopen, ned);
- while ((error = getnetent_r(ne, ned)) == 0)
- if (ne->n_addrtype == type && ne->n_net == net)
+ statp = __res_state();
+ if ((ned = __netent_data_init()) == NULL) {
+ RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
+ *h_errnop = statp->res_h_errno;
+ return (NS_UNAVAIL);
+ }
+
+ _setnethtent(ned->stayopen, ned);
+ while ((error = getnetent_p(&ne, ned)) == 0)
+ if (ne.n_addrtype == type && ne.n_net == net)
break;
if (!ned->stayopen)
- endnetent_r(ned);
- return (error == 0) ? NS_SUCCESS : NS_NOTFOUND;
+ _endnethtent(ned);
+ if (error != 0) {
+ *h_errnop = statp->res_h_errno;
+ return (NS_NOTFOUND);
+ }
+ if (__copy_netent(&ne, nptr, buffer, buflen) != 0) {
+ *h_errnop = statp->res_h_errno;
+ return (NS_NOTFOUND);
+ }
+ *((struct netent **)rval) = nptr;
+ return (NS_SUCCESS);
}
OpenPOWER on IntegriCloud