diff options
author | ume <ume@FreeBSD.org> | 2006-04-15 16:20:27 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2006-04-15 16:20:27 +0000 |
commit | b6bb84cf9e6c9d871a17bcf962cf63180af70e95 (patch) | |
tree | 7f8977d8ba3a31812862992c940fc48d67e9a71c /lib/libc/net/getnetbynis.c | |
parent | 65a640e4f05dfa0b6ed9cf426628b7a1106b767b (diff) | |
download | FreeBSD-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.c | 84 |
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 */ } |