This commit was manufactured by cvs2svn to create tag 'FreeBSD-release/1.0'.
[unix-history] / lib / librpc / rpc / getrpcent.c
index a69dc1f..5252f2a 100644 (file)
@@ -1,66 +1,75 @@
-/* @(#)getrpcent.c     2.2 88/07/29 4.0 RPCSRC */
-#if !defined(lint) && defined(SCCSIDS)
-static  char sccsid[] = "@(#)getrpcent.c 1.9 87/08/11  Copyr 1984 Sun Micro";
-#endif
-
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
  * media and as a part of the software program in whole or part.  Users
  * may copy or modify Sun RPC without charge, but are not authorized
  * to license or distribute it to anyone else except as part of a product or
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
  * media and as a part of the software program in whole or part.  Users
  * may copy or modify Sun RPC without charge, but are not authorized
  * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- * 
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- * 
+ *
  * Sun RPC is provided with no support and without any obligation on the
  * part of Sun Microsystems, Inc. to assist in its use, correction,
  * modification or enhancement.
  * Sun RPC is provided with no support and without any obligation on the
  * part of Sun Microsystems, Inc. to assist in its use, correction,
  * modification or enhancement.
- * 
+ *
  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  * OR ANY PART THEREOF.
  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  * OR ANY PART THEREOF.
- * 
+ *
  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  * or profits or other special, indirect and consequential damages, even if
  * Sun has been advised of the possibility of such damages.
  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  * or profits or other special, indirect and consequential damages, even if
  * Sun has been advised of the possibility of such damages.
- * 
+ *
  * Sun Microsystems, Inc.
  * 2550 Garcia Avenue
  * Mountain View, California  94043
  */
 
  * Sun Microsystems, Inc.
  * 2550 Garcia Avenue
  * Mountain View, California  94043
  */
 
+#if defined(LIBC_SCCS) && !defined(lint)
+/*static char *sccsid = "from: @(#)getrpcent.c 1.14 91/03/11 Copyr 1984 Sun Micro";*/
+static char *rcsid = "$Id: getrpcent.c,v 1.7 1993/08/26 00:53:23 jtc Exp $";
+#endif
+
 /*
 /*
- * Copyright (c) 1985 by Sun Microsystems, Inc.
+ * Copyright (c) 1984 by Sun Microsystems, Inc.
  */
 
 #include <stdio.h>
 #include <sys/types.h>
  */
 
 #include <stdio.h>
 #include <sys/types.h>
+#include <string.h>
 #include <rpc/rpc.h>
 #include <rpc/rpc.h>
-#include <netdb.h>
-#include <sys/socket.h>
+#ifdef YP
+#include <rpcsvc/yp_prot.h>
+#include <rpcsvc/ypclnt.h>
+#endif
 
 /*
  * Internet version.
  */
 struct rpcdata {
        FILE    *rpcf;
 
 /*
  * Internet version.
  */
 struct rpcdata {
        FILE    *rpcf;
-       char    *current;
-       int     currentlen;
        int     stayopen;
 #define        MAXALIASES      35
        char    *rpc_aliases[MAXALIASES];
        struct  rpcent rpc;
        char    line[BUFSIZ+1];
        int     stayopen;
 #define        MAXALIASES      35
        char    *rpc_aliases[MAXALIASES];
        struct  rpcent rpc;
        char    line[BUFSIZ+1];
+#ifdef YP
        char    *domain;
        char    *domain;
-} *rpcdata, *_rpcdata();
+       char    *current;
+       int     currentlen;
+#endif
+} *rpcdata;
+
+#ifdef YP
+static int     __yp_nomap = 0;
+#endif /* YP */
 
 static struct rpcent *interpret();
 struct hostent *gethostent();
 char   *inet_ntoa();
 
 static struct rpcent *interpret();
 struct hostent *gethostent();
 char   *inet_ntoa();
-static char *index();
 
 static char RPCDB[] = "/etc/rpc";
 
 
 static char RPCDB[] = "/etc/rpc";
 
@@ -82,12 +91,36 @@ getrpcbynumber(number)
 {
        register struct rpcdata *d = _rpcdata();
        register struct rpcent *p;
 {
        register struct rpcdata *d = _rpcdata();
        register struct rpcent *p;
+#ifdef YP
        int reason;
        int reason;
-       char adrstr[16], *val = NULL;
-       int vallen;
+       char adrstr[16];
+#endif
 
        if (d == 0)
                return (0);
 
        if (d == 0)
                return (0);
+#ifdef YP
+        if (!__yp_nomap && _yp_check(&d->domain)) {
+                sprintf(adrstr, "%d", number);
+                reason = yp_match(d->domain, "rpc.bynumber", adrstr, strlen(adrstr),
+                                  &d->current, &d->currentlen);
+                switch(reason) {
+                case 0:
+                        break;
+                case YPERR_MAP:
+                        __yp_nomap = 1;
+                        goto no_yp;
+                        break;
+                default:
+                        return(0);
+                        break;
+                }
+                d->current[d->currentlen] = '\0';
+                p = interpret(d->current, d->currentlen);
+                (void) free(d->current);
+                return p;
+        }
+no_yp:
+#endif /* YP */
        setrpcent(0);
        while (p = getrpcent()) {
                if (p->r_number == number)
        setrpcent(0);
        while (p = getrpcent()) {
                if (p->r_number == number)
@@ -105,7 +138,7 @@ getrpcbyname(name)
        char **rp;
 
        setrpcent(0);
        char **rp;
 
        setrpcent(0);
-       while(rpc = getrpcent()) {
+       while (rpc = getrpcent()) {
                if (strcmp(rpc->r_name, name) == 0)
                        return (rpc);
                for (rp = rpc->r_aliases; *rp != NULL; rp++) {
                if (strcmp(rpc->r_name, name) == 0)
                        return (rpc);
                for (rp = rpc->r_aliases; *rp != NULL; rp++) {
@@ -117,6 +150,7 @@ getrpcbyname(name)
        return (NULL);
 }
 
        return (NULL);
 }
 
+void
 setrpcent(f)
        int f;
 {
 setrpcent(f)
        int f;
 {
@@ -124,26 +158,40 @@ setrpcent(f)
 
        if (d == 0)
                return;
 
        if (d == 0)
                return;
+#ifdef YP
+        if (!__yp_nomap && _yp_check(NULL)) {
+                if (d->current)
+                        free(d->current);
+                d->current = NULL;
+                d->currentlen = 0;
+                return;
+        }
+        __yp_nomap = 0;
+#endif /* YP */
        if (d->rpcf == NULL)
                d->rpcf = fopen(RPCDB, "r");
        else
                rewind(d->rpcf);
        if (d->rpcf == NULL)
                d->rpcf = fopen(RPCDB, "r");
        else
                rewind(d->rpcf);
-       if (d->current)
-               free(d->current);
-       d->current = NULL;
        d->stayopen |= f;
 }
 
        d->stayopen |= f;
 }
 
+void
 endrpcent()
 {
        register struct rpcdata *d = _rpcdata();
 
        if (d == 0)
                return;
 endrpcent()
 {
        register struct rpcdata *d = _rpcdata();
 
        if (d == 0)
                return;
-       if (d->current && !d->stayopen) {
-               free(d->current);
-               d->current = NULL;
-       }
+#ifdef YP
+        if (!__yp_nomap && _yp_check(NULL)) {
+               if (d->current && !d->stayopen)
+                        free(d->current);
+                d->current = NULL;
+                d->currentlen = 0;
+                return;
+        }
+        __yp_nomap = 0;
+#endif /* YP */
        if (d->rpcf && !d->stayopen) {
                fclose(d->rpcf);
                d->rpcf = NULL;
        if (d->rpcf && !d->stayopen) {
                fclose(d->rpcf);
                d->rpcf = NULL;
@@ -155,48 +203,74 @@ getrpcent()
 {
        struct rpcent *hp;
        int reason;
 {
        struct rpcent *hp;
        int reason;
+       register struct rpcdata *d = _rpcdata();
+#ifdef YP
        char *key = NULL, *val = NULL;
        int keylen, vallen;
        char *key = NULL, *val = NULL;
        int keylen, vallen;
-       register struct rpcdata *d = _rpcdata();
+#endif
 
        if (d == 0)
                return(NULL);
 
        if (d == 0)
                return(NULL);
+#ifdef YP
+        if (!__yp_nomap && _yp_check(&d->domain)) {
+                if (d->current == NULL && d->currentlen == 0) {
+                        reason = yp_first(d->domain, "rpc.bynumber",
+                                          &d->current, &d->currentlen,
+                                          &val, &vallen);
+                } else {
+                        reason = yp_next(d->domain, "rpc.bynumber",
+                                         d->current, d->currentlen,
+                                         &d->current, &d->currentlen,
+                                         &val, &vallen);
+                }
+                switch(reason) {
+                case 0:
+                        break;
+                case YPERR_MAP:
+                        __yp_nomap = 1;
+                        goto no_yp;
+                        break;
+                default:
+                        return(0);
+                        break;
+                }
+                val[vallen] = '\0';
+                hp = interpret(val, vallen);
+                (void) free(val);
+                return hp;
+        }
+no_yp:
+#endif /* YP */
        if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL)
                return (NULL);
        if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL)
                return (NULL);
-    if (fgets(d->line, BUFSIZ, d->rpcf) == NULL)
+        if (fgets(d->line, BUFSIZ, d->rpcf) == NULL)
                return (NULL);
                return (NULL);
-       return interpret(d->line, strlen(d->line));
+       return (interpret(d->line, strlen(d->line)));
 }
 
 static struct rpcent *
 interpret(val, len)
 }
 
 static struct rpcent *
 interpret(val, len)
+       char *val;
+       int len;
 {
        register struct rpcdata *d = _rpcdata();
        char *p;
        register char *cp, **q;
 
        if (d == 0)
 {
        register struct rpcdata *d = _rpcdata();
        char *p;
        register char *cp, **q;
 
        if (d == 0)
-               return;
-       strncpy(d->line, val, len);
+               return (0);
+       (void) strncpy(d->line, val, len);
        p = d->line;
        d->line[len] = '\n';
        if (*p == '#')
                return (getrpcent());
        p = d->line;
        d->line[len] = '\n';
        if (*p == '#')
                return (getrpcent());
-       cp = index(p, '#');
+       cp = strpbrk(p, "#\n");
        if (cp == NULL)
        if (cp == NULL)
-    {
-               cp = index(p, '\n');
-               if (cp == NULL)
-                       return (getrpcent());
-       }
+               return (getrpcent());
        *cp = '\0';
        *cp = '\0';
-       cp = index(p, ' ');
+       cp = strpbrk(p, " \t");
        if (cp == NULL)
        if (cp == NULL)
-    {
-               cp = index(p, '\t');
-               if (cp == NULL)
-                       return (getrpcent());
-       }
+               return (getrpcent());
        *cp++ = '\0';
        /* THIS STUFF IS INTERNET SPECIFIC */
        d->rpc.r_name = d->line;
        *cp++ = '\0';
        /* THIS STUFF IS INTERNET SPECIFIC */
        d->rpc.r_name = d->line;
@@ -204,15 +278,9 @@ interpret(val, len)
                cp++;
        d->rpc.r_number = atoi(cp);
        q = d->rpc.r_aliases = d->rpc_aliases;
                cp++;
        d->rpc.r_number = atoi(cp);
        q = d->rpc.r_aliases = d->rpc_aliases;
-       cp = index(p, ' ');
-       if (cp != NULL)
+       cp = strpbrk(cp, " \t");
+       if (cp != NULL) 
                *cp++ = '\0';
                *cp++ = '\0';
-       else
-    {
-               cp = index(p, '\t');
-               if (cp != NULL)
-                       *cp++ = '\0';
-       }
        while (cp && *cp) {
                if (*cp == ' ' || *cp == '\t') {
                        cp++;
        while (cp && *cp) {
                if (*cp == ' ' || *cp == '\t') {
                        cp++;
@@ -220,16 +288,11 @@ interpret(val, len)
                }
                if (q < &(d->rpc_aliases[MAXALIASES - 1]))
                        *q++ = cp;
                }
                if (q < &(d->rpc_aliases[MAXALIASES - 1]))
                        *q++ = cp;
-               cp = index(p, ' ');
+               cp = strpbrk(cp, " \t");
                if (cp != NULL)
                        *cp++ = '\0';
                if (cp != NULL)
                        *cp++ = '\0';
-               else
-           {
-                       cp = index(p, '\t');
-                       if (cp != NULL)
-                               *cp++ = '\0';
-               }
        }
        *q = NULL;
        return (&d->rpc);
 }
        }
        *q = NULL;
        return (&d->rpc);
 }
+