summaryrefslogtreecommitdiffstats
path: root/lib/libc/net/getnetbynis.c
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2006-04-15 16:20:27 +0000
committerume <ume@FreeBSD.org>2006-04-15 16:20:27 +0000
commitb6bb84cf9e6c9d871a17bcf962cf63180af70e95 (patch)
tree7f8977d8ba3a31812862992c940fc48d67e9a71c /lib/libc/net/getnetbynis.c
parent65a640e4f05dfa0b6ed9cf426628b7a1106b767b (diff)
downloadFreeBSD-src-b6bb84cf9e6c9d871a17bcf962cf63180af70e95.zip
FreeBSD-src-b6bb84cf9e6c9d871a17bcf962cf63180af70e95.tar.gz
- make reentrant version of netdb functions glibc style API, and
expose them to outside of libc. - make netdb functions NSS friendly. Reviewed by: arch@ and current@ (no objection)
Diffstat (limited to 'lib/libc/net/getnetbynis.c')
-rw-r--r--lib/libc/net/getnetbynis.c84
1 files changed, 64 insertions, 20 deletions
diff --git a/lib/libc/net/getnetbynis.c b/lib/libc/net/getnetbynis.c
index ea7c3d4..d00c7f2 100644
--- a/lib/libc/net/getnetbynis.c
+++ b/lib/libc/net/getnetbynis.c
@@ -64,16 +64,16 @@ _getnetbynis(const char *name, char *map, int af, struct netent *ne,
default:
case AF_INET6:
errno = EAFNOSUPPORT;
- return -1;
+ return (-1);
}
if (ned->yp_domain == (char *)NULL)
if (yp_get_default_domain (&ned->yp_domain))
- return -1;
+ return (-1);
if (yp_match(ned->yp_domain, map, name, strlen(name), &result,
&resultlen))
- return -1;
+ return (-1);
bcopy((char *)result, (char *)&ypbuf, resultlen);
ypbuf[resultlen] = '\0';
@@ -90,7 +90,7 @@ _getnetbynis(const char *name, char *map, int af, struct netent *ne,
len = strlen(result) + 1;
if (ep - bp < len) {
RES_SET_H_ERRNO(__res_state(), NO_RECOVERY);
- return -1;
+ return (-1);
}
strlcpy(bp, result, ep - bp);
ne->n_name = bp;
@@ -125,7 +125,7 @@ _getnetbynis(const char *name, char *map, int af, struct netent *ne,
cp = p;
}
*q = NULL;
- return 0;
+ return (0);
}
#endif /* YP */
@@ -134,18 +134,39 @@ _nis_getnetbyname(void *rval, void *cb_data, va_list ap)
{
#ifdef YP
const char *name;
- struct netent *ne;
+ char *buffer;
+ size_t buflen;
+ int *errnop, *h_errnop;
+ struct netent *nptr, ne;
struct netent_data *ned;
- int error;
+ res_state statp;
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 *);
+
+ 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);
+ }
- error = _getnetbynis(name, "networks.byname", AF_INET, ne, ned);
- return (error == 0) ? NS_SUCCESS : NS_NOTFOUND;
+ if (_getnetbynis(name, "networks.byname", AF_INET, &ne, ned) != 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);
#else
- return NS_UNAVAIL;
+ return (NS_UNAVAIL);
#endif
}
@@ -156,23 +177,38 @@ _nis_getnetbyaddr(void *rval, void *cb_data, va_list ap)
#ifdef YP
uint32_t addr;
int af;
- struct netent *ne;
+ char *buffer;
+ size_t buflen;
+ int *errnop, *h_errnop;
+ struct netent *nptr, ne;
struct netent_data *ned;
char *str, *cp;
uint32_t net2;
int nn;
unsigned int netbr[4];
char buf[MAXDNAME];
- int error;
+ res_state statp;
addr = va_arg(ap, uint32_t);
af = 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 *);
+
+ 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);
+ }
if (af != AF_INET) {
+ RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
+ *h_errnop = statp->res_h_errno;
errno = EAFNOSUPPORT;
- return NS_UNAVAIL;
+ return (NS_UNAVAIL);
}
for (nn = 4, net2 = addr; net2; net2 >>= 8) {
@@ -203,9 +239,17 @@ _nis_getnetbyaddr(void *rval, void *cb_data, va_list ap)
cp = str + (strlen(str) - 2);
}
- error = _getnetbynis(str, "networks.byaddr", af, ne, ned);
- return (error == 0) ? NS_SUCCESS : NS_NOTFOUND;
+ if (_getnetbynis(str, "networks.byaddr", af, &ne, ned) != 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);
#else
- return NS_UNAVAIL;
+ return (NS_UNAVAIL);
#endif /* YP */
}
OpenPOWER on IntegriCloud