Add NIS support to getservent(3) functions (getservbyport() and getservbyname()

both call getservent() to do most of the work, so we only need to modify
this file to take care of everybody).

Note that there is only one NIS services map (services.byname) even
though there are getservbyname() and getservbyport() library functions.
This commit is contained in:
Bill Paul 1995-11-04 19:07:27 +00:00
parent 722fb3ef2c
commit 215032be8c
1 changed files with 68 additions and 0 deletions

View File

@ -41,6 +41,12 @@ static char sccsid[] = "@(#)getservent.c 8.1 (Berkeley) 6/4/93";
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef YP
#include <rpc/rpc.h>
#include <rpcsvc/yp_prot.h>
#include <rpcsvc/ypclnt.h>
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");