Home | History | Annotate | Line # | Download | only in rpc
getrpcent.c revision 1.3
      1 /*
      2  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
      3  * unrestricted use provided that this legend is included on all tape
      4  * media and as a part of the software program in whole or part.  Users
      5  * may copy or modify Sun RPC without charge, but are not authorized
      6  * to license or distribute it to anyone else except as part of a product or
      7  * program developed by the user or with the express written consent of
      8  * Sun Microsystems, Inc.
      9  *
     10  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     11  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     12  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     13  *
     14  * Sun RPC is provided with no support and without any obligation on the
     15  * part of Sun Microsystems, Inc. to assist in its use, correction,
     16  * modification or enhancement.
     17  *
     18  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     19  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     20  * OR ANY PART THEREOF.
     21  *
     22  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     23  * or profits or other special, indirect and consequential damages, even if
     24  * Sun has been advised of the possibility of such damages.
     25  *
     26  * Sun Microsystems, Inc.
     27  * 2550 Garcia Avenue
     28  * Mountain View, California  94043
     29  */
     30 
     31 #if defined(LIBC_SCCS) && !defined(lint)
     32 /*static char *sccsid = "from: @(#)getrpcent.c 1.14 91/03/11 Copyr 1984 Sun Micro";*/
     33 static char *rcsid = "$Id: getrpcent.c,v 1.3 1994/12/04 01:13:18 cgd Exp $";
     34 #endif
     35 
     36 /*
     37  * Copyright (c) 1984 by Sun Microsystems, Inc.
     38  */
     39 
     40 #include <stdio.h>
     41 #include <stdlib.h>
     42 #include <sys/types.h>
     43 #include <string.h>
     44 #include <rpc/rpc.h>
     45 
     46 /*
     47  * Internet version.
     48  */
     49 struct rpcdata {
     50 	FILE	*rpcf;
     51 	int	stayopen;
     52 #define	MAXALIASES	35
     53 	char	*rpc_aliases[MAXALIASES];
     54 	struct	rpcent rpc;
     55 	char	line[BUFSIZ+1];
     56 } *rpcdata;
     57 
     58 static	struct rpcent *interpret();
     59 struct	hostent *gethostent();
     60 char	*inet_ntoa();
     61 
     62 static char RPCDB[] = "/etc/rpc";
     63 
     64 static struct rpcdata *
     65 _rpcdata()
     66 {
     67 	register struct rpcdata *d = rpcdata;
     68 
     69 	if (d == 0) {
     70 		d = (struct rpcdata *)calloc(1, sizeof (struct rpcdata));
     71 		rpcdata = d;
     72 	}
     73 	return (d);
     74 }
     75 
     76 struct rpcent *
     77 getrpcbynumber(number)
     78 	register int number;
     79 {
     80 	register struct rpcdata *d = _rpcdata();
     81 	register struct rpcent *p;
     82 
     83 	if (d == 0)
     84 		return (0);
     85 	setrpcent(0);
     86 	while (p = getrpcent()) {
     87 		if (p->r_number == number)
     88 			break;
     89 	}
     90 	endrpcent();
     91 	return (p);
     92 }
     93 
     94 struct rpcent *
     95 getrpcbyname(name)
     96 	char *name;
     97 {
     98 	struct rpcent *rpc;
     99 	char **rp;
    100 
    101 	setrpcent(0);
    102 	while (rpc = getrpcent()) {
    103 		if (strcmp(rpc->r_name, name) == 0)
    104 			return (rpc);
    105 		for (rp = rpc->r_aliases; *rp != NULL; rp++) {
    106 			if (strcmp(*rp, name) == 0)
    107 				return (rpc);
    108 		}
    109 	}
    110 	endrpcent();
    111 	return (NULL);
    112 }
    113 
    114 void
    115 setrpcent(f)
    116 	int f;
    117 {
    118 	register struct rpcdata *d = _rpcdata();
    119 
    120 	if (d == 0)
    121 		return;
    122 	if (d->rpcf == NULL)
    123 		d->rpcf = fopen(RPCDB, "r");
    124 	else
    125 		rewind(d->rpcf);
    126 	d->stayopen |= f;
    127 }
    128 
    129 void
    130 endrpcent()
    131 {
    132 	register struct rpcdata *d = _rpcdata();
    133 
    134 	if (d == 0)
    135 		return;
    136 	if (d->rpcf && !d->stayopen) {
    137 		fclose(d->rpcf);
    138 		d->rpcf = NULL;
    139 	}
    140 }
    141 
    142 struct rpcent *
    143 getrpcent()
    144 {
    145 	struct rpcent *hp;
    146 	int reason;
    147 	register struct rpcdata *d = _rpcdata();
    148 
    149 	if (d == 0)
    150 		return(NULL);
    151 	if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL)
    152 		return (NULL);
    153         if (fgets(d->line, BUFSIZ, d->rpcf) == NULL)
    154 		return (NULL);
    155 	return (interpret(d->line, strlen(d->line)));
    156 }
    157 
    158 static struct rpcent *
    159 interpret(val, len)
    160 	char *val;
    161 	int len;
    162 {
    163 	register struct rpcdata *d = _rpcdata();
    164 	char *p;
    165 	register char *cp, **q;
    166 
    167 	if (d == 0)
    168 		return (0);
    169 	(void) strncpy(d->line, val, len);
    170 	p = d->line;
    171 	d->line[len] = '\n';
    172 	if (*p == '#')
    173 		return (getrpcent());
    174 	cp = strpbrk(p, "#\n");
    175 	if (cp == NULL)
    176 		return (getrpcent());
    177 	*cp = '\0';
    178 	cp = strpbrk(p, " \t");
    179 	if (cp == NULL)
    180 		return (getrpcent());
    181 	*cp++ = '\0';
    182 	/* THIS STUFF IS INTERNET SPECIFIC */
    183 	d->rpc.r_name = d->line;
    184 	while (*cp == ' ' || *cp == '\t')
    185 		cp++;
    186 	d->rpc.r_number = atoi(cp);
    187 	q = d->rpc.r_aliases = d->rpc_aliases;
    188 	cp = strpbrk(cp, " \t");
    189 	if (cp != NULL)
    190 		*cp++ = '\0';
    191 	while (cp && *cp) {
    192 		if (*cp == ' ' || *cp == '\t') {
    193 			cp++;
    194 			continue;
    195 		}
    196 		if (q < &(d->rpc_aliases[MAXALIASES - 1]))
    197 			*q++ = cp;
    198 		cp = strpbrk(cp, " \t");
    199 		if (cp != NULL)
    200 			*cp++ = '\0';
    201 	}
    202 	*q = NULL;
    203 	return (&d->rpc);
    204 }
    205 
    206