diff --git a/lib/libc/net/getservent.c b/lib/libc/net/getservent.c index 6bee5d3a8be..9fb47b61a61 100644 --- a/lib/libc/net/getservent.c +++ b/lib/libc/net/getservent.c @@ -41,6 +41,12 @@ static char sccsid[] = "@(#)getservent.c 8.1 (Berkeley) 6/4/93"; #include #include #include +#ifdef YP +#include +#include +#include +static int serv_stepping_yp = 0; +#endif #define MAXALIASES 35 @@ -50,6 +56,54 @@ static struct servent serv; static char *serv_aliases[MAXALIASES]; int _serv_stayopen; +#ifdef YP +static int +_getypservent(line) + char *line; +{ + static char *key = NULL; + static int keylen; + static char *yp_domain = NULL; + char *lastkey, *result; + int resultlen; + int rv; + + if(!yp_domain) { + if(yp_get_default_domain(&yp_domain)) + return (0); + } + + if (!serv_stepping_yp) { + if (key) + free(key); + if ((rv = yp_first(yp_domain, "services.byname", &key, &keylen, + &result, &resultlen))) { + free(result); + serv_stepping_yp = 0; + return(0); + } + serv_stepping_yp = 1; + } else { + lastkey = key; + rv = yp_next(yp_domain, "services.byname", key, keylen, &key, + &keylen, &result, &resultlen); + free(lastkey); + if (rv) { + serv_stepping_yp = 0; + return (0); + } + } + + strncpy(line, result, BUFSIZ - 1); + /* getservent() expects lines terminated with \n -- make it happy */ + strcat(line, "\n"); + + free(result); + + return(1); +} +#endif + void setservent(f) int f; @@ -77,11 +131,25 @@ getservent() char *p; register char *cp, **q; +#ifdef YP + if (serv_stepping_yp && _getypservent(line)) { + p = (char *)&line; + goto unpack; + } +tryagain: +#endif if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) return (NULL); again: if ((p = fgets(line, BUFSIZ, servf)) == NULL) return (NULL); +#ifdef YP + if (*p == '+') { + if (!_getypservent(&line)) + goto tryagain; + } +unpack: +#endif if (*p == '#') goto again; cp = strpbrk(p, "#\n");