summaryrefslogtreecommitdiffstats
path: root/lib/libc/net
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/net')
-rw-r--r--lib/libc/net/getservent.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/libc/net/getservent.c b/lib/libc/net/getservent.c
index 6bee5d3..9fb47b6 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 <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");
OpenPOWER on IntegriCloud