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