From c2ee427f58870a57f71f4e20d3f83c4e6bdde733 Mon Sep 17 00:00:00 2001 From: ume Date: Thu, 28 Apr 2005 15:32:55 +0000 Subject: make getnetby*() thread-safe. --- lib/libc/net/getnetbydns.c | 82 +++++++++++++------------- lib/libc/net/getnetbyht.c | 135 ++++++++++++++++++++++++++----------------- lib/libc/net/getnetbynis.c | 91 ++++++++++++++++++----------- lib/libc/net/getnetent.3 | 2 +- lib/libc/net/getnetnamadr.c | 133 +++++++++++++++++++++++++++++++++--------- lib/libc/net/getprotoent.c | 4 +- lib/libc/net/getservent.c | 10 ++-- lib/libc/net/netdb_private.h | 57 +++++++++++++----- 8 files changed, 339 insertions(+), 175 deletions(-) diff --git a/lib/libc/net/getnetbydns.c b/lib/libc/net/getnetbydns.c index 60c79a7..e4f0ae8 100644 --- a/lib/libc/net/getnetbydns.c +++ b/lib/libc/net/getnetbydns.c @@ -82,13 +82,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include "netdb_private.h" #include "res_config.h" extern int h_errno; #define BYADDR 0 #define BYNAME 1 -#define MAXALIASES 35 #define MAXPACKET (64*1024) @@ -158,11 +158,9 @@ ipreverse(char *in, char *out) *p = '\0'; } -static struct netent * -getnetanswer(answer, anslen, net_i) - querybuf *answer; - int anslen; - int net_i; +static int +getnetanswer(querybuf *answer, int anslen, int net_i, struct netent *ne, + struct netent_data *ned) { HEADER *hp; @@ -171,10 +169,8 @@ getnetanswer(answer, anslen, net_i) u_char *eom; int type, class, ancount, qdcount, haveanswer; char aux[MAXHOSTNAMELEN]; + char ans[MAXHOSTNAMELEN]; char *in, *bp, *ep, **ap; -static struct netent net_entry; -static char *net_aliases[MAXALIASES], netbuf[PACKETSZ]; -static char ans[MAXHOSTNAMELEN]; /* * find first satisfactory answer @@ -194,21 +190,21 @@ static char ans[MAXHOSTNAMELEN]; hp = &answer->hdr; ancount = ntohs(hp->ancount); /* #/records in the answer section */ qdcount = ntohs(hp->qdcount); /* #/entries in the question section */ - bp = netbuf; - ep = netbuf + sizeof(netbuf); + bp = ned->netbuf; + ep = ned->netbuf + sizeof(ned->netbuf); cp = answer->buf + HFIXEDSZ; if (!qdcount) { if (hp->aa) h_errno = HOST_NOT_FOUND; else h_errno = TRY_AGAIN; - return (NULL); + return -1; } while (qdcount-- > 0) cp += __dn_skipname(cp, eom) + QFIXEDSZ; - ap = net_aliases; + ap = ned->net_aliases; *ap = NULL; - net_entry.n_aliases = net_aliases; + ne->n_aliases = ned->net_aliases; haveanswer = 0; while (--ancount >= 0 && cp < eom) { n = dn_expand(answer->buf, eom, cp, bp, ep - bp); @@ -226,14 +222,13 @@ static char ans[MAXHOSTNAMELEN]; n = dn_expand(answer->buf, eom, cp, bp, ep - bp); if ((n < 0) || !res_hnok(bp)) { cp += n; - return (NULL); + return -1; } cp += n; *ap++ = bp; n = strlen(bp) + 1; bp += n; - net_entry.n_addrtype = - (class == C_IN) ? AF_INET : AF_UNSPEC; + ne->n_addrtype = (class == C_IN) ? AF_INET : AF_UNSPEC; haveanswer++; } } @@ -241,26 +236,33 @@ static char ans[MAXHOSTNAMELEN]; *ap = NULL; switch (net_i) { case BYADDR: - net_entry.n_name = *net_entry.n_aliases; - net_entry.n_net = 0L; + ne->n_name = *ne->n_aliases; + ne->n_net = 0L; break; case BYNAME: - in = *net_entry.n_aliases; - net_entry.n_name = &ans[0]; + in = *ne->n_aliases; + n = strlen(ans) + 1; + if (ep - bp < n) { + h_errno = NETDB_INTERNAL; + errno = ENOBUFS; + return -1; + } + strlcpy(bp, ans, ep - bp); + ne->n_name = bp; if (strlen(in) + 1 > sizeof(aux)) { h_errno = NETDB_INTERNAL; errno = ENOBUFS; - return (NULL); + return -1; } ipreverse(in, aux); - net_entry.n_net = inet_network(aux); + ne->n_net = inet_network(aux); break; } - net_entry.n_aliases++; - return (&net_entry); + ne->n_aliases++; + return 0; } h_errno = TRY_AGAIN; - return (NULL); + return -1; } int @@ -268,17 +270,18 @@ _dns_getnetbyaddr(void *rval, void *cb_data, va_list ap) { unsigned long net; int net_type; + struct netent *ne; + struct netent_data *ned; unsigned int netbr[4]; - int nn, anslen; + int nn, anslen, error; querybuf *buf; char qbuf[MAXDNAME]; unsigned long net2; - struct netent *net_entry; net = va_arg(ap, unsigned long); net_type = va_arg(ap, int); - - *(struct netent **)rval = NULL; + ne = va_arg(ap, struct netent *); + ned = va_arg(ap, struct netent_data *); if (net_type != AF_INET) return NS_UNAVAIL; @@ -321,16 +324,15 @@ _dns_getnetbyaddr(void *rval, void *cb_data, va_list ap) #endif return NS_UNAVAIL; } - net_entry = getnetanswer(buf, anslen, BYADDR); + error = getnetanswer(buf, anslen, BYADDR, ne, ned); free(buf); - if (net_entry) { + if (error == 0) { unsigned u_net = net; /* maybe net should be unsigned ? */ /* Strip trailing zeros */ while ((u_net & 0xff) == 0 && u_net != 0) u_net >>= 8; - net_entry->n_net = u_net; - *(struct netent **)rval = net_entry; + ne->n_net = u_net; return NS_SUCCESS; } return NS_NOTFOUND; @@ -340,13 +342,15 @@ int _dns_getnetbyname(void *rval, void *cb_data, va_list ap) { const char *net; - int anslen; + struct netent *ne; + struct netent_data *ned; + int anslen, error; querybuf *buf; char qbuf[MAXDNAME]; net = va_arg(ap, const char *); - - *(struct netent**)rval = NULL; + ne = va_arg(ap, struct netent *); + ned = va_arg(ap, struct netent_data *); if ((_res.options & RES_INIT) == 0 && res_init() == -1) { h_errno = NETDB_INTERNAL; @@ -374,9 +378,9 @@ _dns_getnetbyname(void *rval, void *cb_data, va_list ap) #endif return NS_UNAVAIL; } - *(struct netent**)rval = getnetanswer(buf, anslen, BYNAME); + error = getnetanswer(buf, anslen, BYNAME, ne, ned); free(buf); - return (*(struct netent**)rval != NULL) ? NS_SUCCESS : NS_NOTFOUND; + return (error == 0) ? NS_SUCCESS : NS_NOTFOUND; } void diff --git a/lib/libc/net/getnetbyht.c b/lib/libc/net/getnetbyht.c index 2aeb706..716deec 100644 --- a/lib/libc/net/getnetbyht.c +++ b/lib/libc/net/getnetbyht.c @@ -58,68 +58,72 @@ __FBSDID("$FreeBSD$"); #include #include #include - -#define MAXALIASES 35 - -static FILE *netf; -static char line[BUFSIZ+1]; -static struct netent net; -static char *net_aliases[MAXALIASES]; -static int _net_stayopen; +#include "netdb_private.h" void -_setnethtent(f) - int f; +_setnethtent(int f, struct netent_data *ned) { - if (netf == NULL) - netf = fopen(_PATH_NETWORKS, "r" ); + if (ned->netf == NULL) + ned->netf = fopen(_PATH_NETWORKS, "r"); else - rewind(netf); - _net_stayopen |= f; + rewind(ned->netf); + ned->stayopen |= f; } void -_endnethtent() +_endnethtent(struct netent_data *ned) { - if (netf) { - fclose(netf); - netf = NULL; + if (ned->netf) { + fclose(ned->netf); + ned->netf = NULL; } - _net_stayopen = 0; + ned->stayopen = 0; } -struct netent * -getnetent() +int +getnetent_r(struct netent *ne, struct netent_data *ned) { - char *p; + char *p, *bp, *ep; char *cp, **q; + int len; + char line[BUFSIZ + 1]; - if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL) - return (NULL); + if (ned->netf == NULL && + (ned->netf = fopen(_PATH_NETWORKS, "r")) == NULL) + return -1; again: - p = fgets(line, sizeof line, netf); + p = fgets(line, sizeof line, ned->netf); if (p == NULL) - return (NULL); + return -1; if (*p == '#') goto again; cp = strpbrk(p, "#\n"); if (cp != NULL) *cp = '\0'; - net.n_name = p; + bp = ned->netbuf; + ep = ned->netbuf + sizeof ned->netbuf; + ne->n_name = bp; cp = strpbrk(p, " \t"); if (cp == NULL) goto again; *cp++ = '\0'; + len = strlen(p) + 1; + if (ep - bp < len) { + h_errno = NETDB_INTERNAL; + return -1; + } + strlcpy(bp, p, ep - bp); + bp += len; while (*cp == ' ' || *cp == '\t') cp++; p = strpbrk(cp, " \t"); if (p != NULL) *p++ = '\0'; - net.n_net = inet_network(cp); - net.n_addrtype = AF_INET; - q = net.n_aliases = net_aliases; + ne->n_net = inet_network(cp); + ne->n_addrtype = AF_INET; + q = ne->n_aliases = ned->net_aliases; if (p != NULL) { cp = p; while (cp && *cp) { @@ -127,39 +131,61 @@ again: cp++; continue; } - if (q < &net_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; + if (q >= &ned->net_aliases[_MAXALIASES - 1]) + break; + p = strpbrk(cp, " \t"); + if (p != NULL) + *p++ = '\0'; + len = strlen(cp) + 1; + if (ep - bp < len) + break; + strlcpy(bp, cp, ep - bp); + *q++ = bp; + bp += len; + cp = p; } } *q = NULL; - return (&net); + return 0; +} + +struct netent * +getnetent(void) +{ + struct netdata *nd; + + if ((nd = __netdata_init()) == NULL) + return NULL; + if (getnetent_r(&nd->net, &nd->data) != 0) + return NULL; + return &nd->net; } int _ht_getnetbyname(void *rval, void *cb_data, va_list ap) { const char *name; - struct netent *p; + struct netent *ne; + struct netent_data *ned; char **cp; + int error; name = va_arg(ap, const char *); + ne = va_arg(ap, struct netent *); + ned = va_arg(ap, struct netent_data *); - setnetent(_net_stayopen); - while ( (p = getnetent()) ) { - if (strcasecmp(p->n_name, name) == 0) + setnetent_r(ned->stayopen, ned); + while ((error = getnetent_r(ne, ned)) == 0) { + if (strcasecmp(ne->n_name, name) == 0) break; - for (cp = p->n_aliases; *cp != 0; cp++) + for (cp = ne->n_aliases; *cp != 0; cp++) if (strcasecmp(*cp, name) == 0) goto found; } found: - if (!_net_stayopen) - endnetent(); - *(struct netent **)rval = p; - return (p != NULL) ? NS_SUCCESS : NS_NOTFOUND; + if (!ned->stayopen) + endnetent_r(ned); + return (error == 0) ? NS_SUCCESS : NS_NOTFOUND; } int @@ -167,17 +193,20 @@ _ht_getnetbyaddr(void *rval, void *cb_data, va_list ap) { unsigned long net; int type; - struct netent *p; + struct netent *ne; + struct netent_data *ned; + int error; net = va_arg(ap, unsigned long); type = va_arg(ap, int); + ne = va_arg(ap, struct netent *); + ned = va_arg(ap, struct netent_data *); - setnetent(_net_stayopen); - while ( (p = getnetent()) ) - if (p->n_addrtype == type && p->n_net == net) + setnetent_r(ned->stayopen, ned); + while ((error = getnetent_r(ne, ned)) == 0) + if (ne->n_addrtype == type && ne->n_net == net) break; - if (!_net_stayopen) - endnetent(); - *(struct netent **)rval = p; - return (p != NULL) ? NS_SUCCESS : NS_NOTFOUND; + if (!ned->stayopen) + endnetent_r(ned); + return (error == 0) ? NS_SUCCESS : NS_NOTFOUND; } diff --git a/lib/libc/net/getnetbynis.c b/lib/libc/net/getnetbynis.c index abeb093..de5ccd1 100644 --- a/lib/libc/net/getnetbynis.c +++ b/lib/libc/net/getnetbynis.c @@ -44,22 +44,18 @@ __FBSDID("$FreeBSD$"); #include #include #endif - -#define MAXALIASES 35 -#define MAXADDRS 35 +#include "netdb_private.h" #ifdef YP -static char *host_aliases[MAXALIASES]; - -static struct netent * -_getnetbynis(const char *name, char *map, int af) +static int +_getnetbynis(const char *name, char *map, int af, struct netent *ne, + struct netent_data *ned) { + char *p, *bp, *ep; char *cp, **q; - static char *result; - int resultlen; - static struct netent h; - static char *domain = (char *)NULL; - static char ypbuf[YPMAXRECORD + 2]; + char *result; + int resultlen, len; + char ypbuf[YPMAXRECORD + 2]; switch(af) { case AF_INET: @@ -67,15 +63,16 @@ _getnetbynis(const char *name, char *map, int af) default: case AF_INET6: errno = EAFNOSUPPORT; - return NULL; + return -1; } - if (domain == (char *)NULL) - if (yp_get_default_domain (&domain)) - return (NULL); + if (ned->yp_domain == (char *)NULL) + if (yp_get_default_domain (&ned->yp_domain)) + return -1; - if (yp_match(domain, map, name, strlen(name), &result, &resultlen)) - return (NULL); + if (yp_match(ned->yp_domain, map, name, strlen(name), &result, + &resultlen)) + return -1; bcopy((char *)result, (char *)&ypbuf, resultlen); ypbuf[resultlen] = '\0'; @@ -87,15 +84,24 @@ _getnetbynis(const char *name, char *map, int af) cp = strpbrk(result, " \t"); *cp++ = '\0'; - h.n_name = result; + bp = ned->netbuf; + ep = ned->netbuf + sizeof ned->netbuf; + len = strlen(result) + 1; + if (ep - bp < len) { + h_errno = NETDB_INTERNAL; + return -1; + } + strlcpy(bp, result, ep - bp); + ne->n_name = bp; + bp += len; while (*cp == ' ' || *cp == '\t') cp++; - h.n_net = inet_network(cp); - h.n_addrtype = AF_INET; + ne->n_net = inet_network(cp); + ne->n_addrtype = AF_INET; - q = h.n_aliases = host_aliases; + q = ne->n_aliases = ned->net_aliases; cp = strpbrk(cp, " \t"); if (cp != NULL) *cp++ = '\0'; @@ -104,14 +110,21 @@ _getnetbynis(const char *name, char *map, int af) cp++; continue; } - if (q < &host_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; + if (q > &ned->net_aliases[_MAXALIASES - 1]) + break; + p = strpbrk(cp, " \t"); + if (p != NULL) + *p++ = '\0'; + len = strlen(cp) + 1; + if (ep - bp < len) + break; + strlcpy(bp, cp, ep - bp); + *q++ = bp; + bp += len; + cp = p; } *q = NULL; - return (&h); + return 0; } #endif /* YP */ @@ -120,11 +133,16 @@ _nis_getnetbyname(void *rval, void *cb_data, va_list ap) { #ifdef YP const char *name; + struct netent *ne; + struct netent_data *ned; + int error; name = va_arg(ap, const char *); - - *(struct netent **)rval = _getnetbynis(name, "networks.byname", AF_INET); - return (*(struct netent **)rval != NULL) ? NS_SUCCESS : NS_NOTFOUND; + ne = va_arg(ap, struct netent *); + ned = va_arg(ap, struct netent_data *); + + error = _getnetbynis(name, "networks.byname", AF_INET, ne, ned); + return (error == 0) ? NS_SUCCESS : NS_NOTFOUND; #else return NS_UNAVAIL; #endif @@ -137,16 +155,19 @@ _nis_getnetbyaddr(void *rval, void *cb_data, va_list ap) #ifdef YP unsigned long addr; int af; + struct netent *ne; + struct netent_data *ned; char *str, *cp; unsigned long net2; int nn; unsigned int netbr[4]; char buf[MAXDNAME]; + int error; addr = va_arg(ap, unsigned long); af = va_arg(ap, int); - - *(struct netent **)rval = NULL; + ne = va_arg(ap, struct netent *); + ned = va_arg(ap, struct netent_data *); if (af != AF_INET) { errno = EAFNOSUPPORT; @@ -181,8 +202,8 @@ _nis_getnetbyaddr(void *rval, void *cb_data, va_list ap) cp = str + (strlen(str) - 2); } - *(struct netent **)rval = _getnetbynis(str, "networks.byaddr", af); - return (*(struct netent**)rval != NULL) ? NS_SUCCESS : NS_NOTFOUND; + error = _getnetbynis(str, "networks.byaddr", af, ne, ned); + return (error == 0) ? NS_SUCCESS : NS_NOTFOUND; #else return NS_UNAVAIL; #endif /* YP */ diff --git a/lib/libc/net/getnetent.3 b/lib/libc/net/getnetent.3 index b6cd944..80c2fcb94 100644 --- a/lib/libc/net/getnetent.3 +++ b/lib/libc/net/getnetent.3 @@ -167,7 +167,7 @@ functions appeared in .Bx 4.2 . .Sh BUGS The data space used by -these functions is static; if future use requires the data, it should be +these functions is a thread-specific; if future use requires the data, it should be copied before any subsequent calls to these functions overwrite it. Only Internet network numbers are currently understood. diff --git a/lib/libc/net/getnetnamadr.c b/lib/libc/net/getnetnamadr.c index eec3d9a..7b8aaa6 100644 --- a/lib/libc/net/getnetnamadr.c +++ b/lib/libc/net/getnetnamadr.c @@ -27,6 +27,7 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" +#include "reentrant.h" #include #include #include @@ -34,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -54,10 +56,53 @@ static const ns_src default_src[] = { { 0 } }; -struct netent * -getnetbyname(const char *name) +static struct netdata netdata; +static thread_key_t netdata_key; +static once_t netdata_init_once = ONCE_INITIALIZER; +static int netdata_thr_keycreated = 0; + +static void +netdata_free(void *ptr) +{ + struct netdata *nd = ptr; + + if (nd == NULL) + return; + nd->data.stayopen = 0; + _endnethtent(&nd->data); + free(nd); +} + +static void +netdata_keycreate(void) +{ + netdata_thr_keycreated = + (thr_keycreate(&netdata_key, netdata_free) == 0); +} + +struct netdata * +__netdata_init(void) +{ + struct netdata *nd; + + if (thr_main() != 0) + return &netdata; + if (thr_once(&netdata_init_once, netdata_keycreate) != 0 || + !netdata_thr_keycreated) + return NULL; + if ((nd = thr_getspecific(netdata_key)) != NULL) + return nd; + if ((nd = calloc(1, sizeof(*nd))) == NULL) + return NULL; + if (thr_setspecific(netdata_key, nd) == 0) + return nd; + free(nd); + return NULL; +} + +int +getnetbyname_r(const char *name, struct netent *ne, struct netent_data *ned) { - struct netent *hp = 0; int rval; @@ -66,21 +111,17 @@ getnetbyname(const char *name) { NSSRC_DNS, _dns_getnetbyname, NULL }, NS_NIS_CB(_nis_getnetbyname, NULL) /* force -DHESIOD */ { 0 } - }; - - rval = _nsdispatch((void *)&hp, dtab, NSDB_NETWORKS, "getnetbyname", - default_src, name); + }; - if (rval != NS_SUCCESS) - return NULL; - else - return hp; + rval = _nsdispatch(NULL, dtab, NSDB_NETWORKS, "getnetbyname", + default_src, name, ne, ned); + + return (rval == NS_SUCCESS) ? 0 : -1; } -struct netent * -getnetbyaddr(u_long addr, int af) +int +getnetbyaddr_r(u_long addr, int af, struct netent *ne, struct netent_data *ned) { - struct netent *hp = 0; int rval; static const ns_dtab dtab[] = { @@ -88,28 +129,68 @@ getnetbyaddr(u_long addr, int af) { NSSRC_DNS, _dns_getnetbyaddr, NULL }, NS_NIS_CB(_nis_getnetbyaddr, NULL) /* force -DHESIOD */ { 0 } - }; + }; - rval = _nsdispatch((void *)&hp, dtab, NSDB_NETWORKS, "getnetbyaddr", - default_src, addr, af); + rval = _nsdispatch(NULL, dtab, NSDB_NETWORKS, "getnetbyaddr", + default_src, addr, af, ne, ned); - if (rval != NS_SUCCESS) - return NULL; - else - return hp; + return (rval == NS_SUCCESS) ? 0 : -1; } void -setnetent(stayopen) - int stayopen; +setnetent_r(int stayopen, struct netent_data *ned) { - _setnethtent(stayopen); + _setnethtent(stayopen, ned); _setnetdnsent(stayopen); } void -endnetent() +endnetent_r(struct netent_data *ned) { - _endnethtent(); + _endnethtent(ned); _endnetdnsent(); } + +struct netent * +getnetbyname(const char *name) +{ + struct netdata *nd; + + if ((nd = __netdata_init()) == NULL) + return NULL; + if (getnetbyname_r(name, &nd->net, &nd->data) != 0) + return NULL; + return &nd->net; +} + +struct netent * +getnetbyaddr(u_long addr, int af) +{ + struct netdata *nd; + + if ((nd = __netdata_init()) == NULL) + return NULL; + if (getnetbyaddr_r(addr, af, &nd->net, &nd->data) != 0) + return NULL; + return &nd->net; +} + +void +setnetent(int stayopen) +{ + struct netdata *nd; + + if ((nd = __netdata_init()) == NULL) + return; + setnetent_r(stayopen, &nd->data); +} + +void +endnetent(void) +{ + struct netdata *nd; + + if ((nd = __netdata_init()) == NULL) + return; + endnetent_r(&nd->data); +} diff --git a/lib/libc/net/getprotoent.c b/lib/libc/net/getprotoent.c index 037547b..705ba42 100644 --- a/lib/libc/net/getprotoent.c +++ b/lib/libc/net/getprotoent.c @@ -130,7 +130,7 @@ getprotoent_r(struct protoent *pe, struct protoent_data *ped) if (ped->fp == NULL && (ped->fp = fopen(_PATH_PROTOCOLS, "r")) == NULL) return (-1); again: - if ((p = fgets(ped->line, BUFSIZ, ped->fp)) == NULL) + if ((p = fgets(ped->line, sizeof ped->line, ped->fp)) == NULL) return (-1); if (*p == '#') goto again; @@ -159,7 +159,7 @@ again: cp++; continue; } - if (q < &ped->aliases[PROTOENT_MAXALIASES - 1]) + if (q < &ped->aliases[_MAXALIASES - 1]) *q++ = cp; cp = strpbrk(cp, " \t"); if (cp != NULL) diff --git a/lib/libc/net/getservent.c b/lib/libc/net/getservent.c index b4f603d..e232e32 100644 --- a/lib/libc/net/getservent.c +++ b/lib/libc/net/getservent.c @@ -150,7 +150,7 @@ _getservbyport_yp(struct servent_data *sed) } /* getservent() expects lines terminated with \n -- make it happy */ - snprintf(sed->line, BUFSIZ, "%.*s\n", resultlen, result); + snprintf(sed->line, sizeof sed->line, "%.*s\n", resultlen, result); free(result); return(1); @@ -179,7 +179,7 @@ _getservbyname_yp(struct servent_data *sed) } /* getservent() expects lines terminated with \n -- make it happy */ - snprintf(sed->line, BUFSIZ, "%.*s\n", resultlen, result); + snprintf(sed->line, sizeof sed->line, "%.*s\n", resultlen, result); free(result); return(1); @@ -219,7 +219,7 @@ _getservent_yp(struct servent_data *sed) } /* getservent() expects lines terminated with \n -- make it happy */ - snprintf(sed->line, BUFSIZ, "%.*s\n", resultlen, result); + snprintf(sed->line, sizeof sed->line, "%.*s\n", resultlen, result); free(result); @@ -265,7 +265,7 @@ tryagain: if (sed->fp == NULL && (sed->fp = fopen(_PATH_SERVICES, "r")) == NULL) return (-1); again: - if ((p = fgets(sed->line, BUFSIZ, sed->fp)) == NULL) + if ((p = fgets(sed->line, sizeof sed->line, sed->fp)) == NULL) return (-1); #ifdef YP if (*p == '+' && _yp_check(NULL)) { @@ -312,7 +312,7 @@ unpack: cp++; continue; } - if (q < &sed->aliases[SERVENT_MAXALIASES - 1]) + if (q < &sed->aliases[_MAXALIASES - 1]) *q++ = cp; cp = strpbrk(cp, " \t"); if (cp != NULL) diff --git a/lib/libc/net/netdb_private.h b/lib/libc/net/netdb_private.h index 270b198..141d554 100644 --- a/lib/libc/net/netdb_private.h +++ b/lib/libc/net/netdb_private.h @@ -28,28 +28,35 @@ #ifndef _NETDB_PRIVATE_H_ #define _NETDB_PRIVATE_H_ -#include /* XXX: for BUFSIZ */ +#include /* XXX: for FILE */ -#define PROTOENT_MAXALIASES 35 -#define SERVENT_MAXALIASES 35 +#define _MAXALIASES 35 +#define _MAXLINELEN 1024 +#define _MAXADDRS 35 +#define _NETBUFSIZE 1025 -struct protoent_data { - FILE *fp; - char *aliases[PROTOENT_MAXALIASES]; +struct netent_data { + char *net_aliases[_MAXALIASES]; + char netbuf[_NETBUFSIZE]; + FILE *netf; int stayopen; - char line[BUFSIZ + 1]; +#ifdef YP + char *yp_domain; +#endif }; -struct protodata { - struct protoent proto; - struct protoent_data data; +struct protoent_data { + FILE *fp; + char *aliases[_MAXALIASES]; + int stayopen; + char line[_MAXLINELEN + 1]; }; struct servent_data { FILE *fp; - char *aliases[SERVENT_MAXALIASES]; + char *aliases[_MAXALIASES]; int stayopen; - char line[BUFSIZ + 1]; + char line[_MAXLINELEN + 1]; #ifdef YP int yp_stepping; char *yp_name; @@ -61,28 +68,44 @@ struct servent_data { #endif }; +struct netdata { + struct netent net; + struct netent_data data; +}; + +struct protodata { + struct protoent proto; + struct protoent_data data; +}; + struct servdata { struct servent serv; struct servent_data data; }; +#define endnetent_r __endnetent_r #define endprotoent_r __endprotoent_r #define endservent_r __endservent_r +#define getnetbyaddr_r __getnetbyaddr_r +#define getnetbyname_r __getnetbyname_r +#define getnetent_r __getnetent_r #define getprotobyname_r __getprotobyname_r #define getprotobynumber_r __getprotobynumber_r #define getprotoent_r __getprotoent_r #define getservbyname_r __getservbyname_r #define getservbyport_r __getservbyport_r #define getservent_r __getservent_r +#define setnetent_r __setnetent_r #define setprotoent_r __setprotoent_r #define setservent_r __setservent_r +struct netdata *__netdata_init(void); struct protodata *__protodata_init(void); struct servdata *__servdata_init(void); void _endhostdnsent(void); void _endhosthtent(void); void _endnetdnsent(void); -void _endnethtent(void); +void _endnethtent(struct netent_data *); struct hostent *_gethostbynisaddr(const char *, int, int); struct hostent *_gethostbynisname(const char *, int); void _map_v4v6_address(const char *, char *); @@ -90,9 +113,14 @@ void _map_v4v6_hostent(struct hostent *, char **, char **); void _sethostdnsent(int); void _sethosthtent(int); void _setnetdnsent(int); -void _setnethtent(int); +void _setnethtent(int, struct netent_data *); +void endnetent_r(struct netent_data *); void endprotoent_r(struct protoent_data *); void endservent_r(struct servent_data *); +int getnetbyaddr_r(unsigned long addr, int af, struct netent *, + struct netent_data *); +int getnetbyname_r(const char *, struct netent *, struct netent_data *); +int getnetent_r(struct netent *, struct netent_data *); int getprotobyname_r(const char *, struct protoent *, struct protoent_data *); int getprotobynumber_r(int, struct protoent *, struct protoent_data *); int getprotoent_r(struct protoent *, struct protoent_data *); @@ -101,6 +129,7 @@ int getservbyname_r(const char *, const char *, struct servent *, int getservbyport_r(int, const char *, struct servent *, struct servent_data *); int getservent_r(struct servent *, struct servent_data *); +void setnetent_r(int, struct netent_data *); void setprotoent_r(int, struct protoent_data *); void setservent_r(int, struct servent_data *); -- cgit v1.1