Home | History | Annotate | Line # | Download | only in rpc
getrpcent.c revision 1.16
      1  1.16     lukem /*	$NetBSD: getrpcent.c,v 1.16 1999/09/20 04:39:21 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.16     lukem __RCSID("$NetBSD: getrpcent.c,v 1.16 1999/09/20 04:39:21 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.15     lukem #include <assert.h>
     54  1.11     lukem #include <netdb.h>
     55   1.1       cgd #include <stdio.h>
     56   1.3       cgd #include <stdlib.h>
     57   1.1       cgd #include <string.h>
     58  1.11     lukem 
     59   1.1       cgd #include <rpc/rpc.h>
     60   1.1       cgd 
     61   1.8       jtc #ifdef __weak_alias
     62   1.8       jtc __weak_alias(endrpcent,_endrpcent);
     63   1.8       jtc __weak_alias(getrpcbyname,_getrpcbyname);
     64   1.8       jtc __weak_alias(getrpcbynumber,_getrpcbynumber);
     65   1.8       jtc __weak_alias(getrpcent,_getrpcent);
     66   1.8       jtc __weak_alias(setrpcent,_setrpcent);
     67   1.8       jtc #endif
     68   1.8       jtc 
     69   1.1       cgd /*
     70   1.1       cgd  * Internet version.
     71   1.1       cgd  */
     72  1.14    kleink static struct rpcdata {
     73   1.1       cgd 	FILE	*rpcf;
     74   1.1       cgd 	int	stayopen;
     75   1.1       cgd #define	MAXALIASES	35
     76   1.1       cgd 	char	*rpc_aliases[MAXALIASES];
     77   1.1       cgd 	struct	rpcent rpc;
     78   1.1       cgd 	char	line[BUFSIZ+1];
     79   1.1       cgd } *rpcdata;
     80   1.1       cgd 
     81  1.13  christos static	struct rpcent *interpret __P((char *val, size_t len));
     82   1.1       cgd 
     83  1.12   mycroft #define	RPCDB	"/etc/rpc"
     84   1.1       cgd 
     85   1.7  christos static struct rpcdata *_rpcdata __P((void));
     86   1.7  christos 
     87   1.1       cgd static struct rpcdata *
     88   1.1       cgd _rpcdata()
     89   1.1       cgd {
     90  1.11     lukem 	struct rpcdata *d = rpcdata;
     91   1.1       cgd 
     92  1.10     lukem 	if (d == 0) {
     93   1.1       cgd 		d = (struct rpcdata *)calloc(1, sizeof (struct rpcdata));
     94   1.1       cgd 		rpcdata = d;
     95   1.1       cgd 	}
     96   1.1       cgd 	return (d);
     97   1.1       cgd }
     98   1.1       cgd 
     99   1.1       cgd struct rpcent *
    100   1.1       cgd getrpcbynumber(number)
    101  1.11     lukem 	int number;
    102   1.1       cgd {
    103   1.6   mycroft 	struct rpcent *rpc;
    104   1.1       cgd 
    105   1.1       cgd 	setrpcent(0);
    106   1.7  christos 	while ((rpc = getrpcent()) != NULL) {
    107   1.6   mycroft 		if (rpc->r_number == number)
    108   1.1       cgd 			break;
    109   1.1       cgd 	}
    110   1.1       cgd 	endrpcent();
    111   1.6   mycroft 	return (rpc);
    112   1.1       cgd }
    113   1.1       cgd 
    114   1.1       cgd struct rpcent *
    115   1.1       cgd getrpcbyname(name)
    116  1.10     lukem 	char *name;
    117   1.1       cgd {
    118   1.1       cgd 	struct rpcent *rpc;
    119   1.1       cgd 	char **rp;
    120   1.1       cgd 
    121  1.15     lukem 	_DIAGASSERT(name != NULL);
    122  1.15     lukem 
    123   1.1       cgd 	setrpcent(0);
    124   1.7  christos 	while ((rpc = getrpcent()) != NULL) {
    125   1.1       cgd 		if (strcmp(rpc->r_name, name) == 0)
    126   1.6   mycroft 			break;
    127   1.1       cgd 		for (rp = rpc->r_aliases; *rp != NULL; rp++) {
    128   1.1       cgd 			if (strcmp(*rp, name) == 0)
    129   1.6   mycroft 				break;
    130   1.1       cgd 		}
    131   1.1       cgd 	}
    132   1.1       cgd 	endrpcent();
    133   1.6   mycroft 	return (rpc);
    134   1.1       cgd }
    135   1.1       cgd 
    136   1.1       cgd void
    137   1.1       cgd setrpcent(f)
    138   1.1       cgd 	int f;
    139   1.1       cgd {
    140  1.11     lukem 	struct rpcdata *d = _rpcdata();
    141   1.1       cgd 
    142  1.10     lukem 	if (d == 0)
    143   1.1       cgd 		return;
    144   1.1       cgd 	if (d->rpcf == NULL)
    145   1.1       cgd 		d->rpcf = fopen(RPCDB, "r");
    146   1.1       cgd 	else
    147   1.1       cgd 		rewind(d->rpcf);
    148   1.1       cgd 	d->stayopen |= f;
    149   1.1       cgd }
    150   1.1       cgd 
    151   1.1       cgd void
    152   1.1       cgd endrpcent()
    153   1.1       cgd {
    154  1.11     lukem 	struct rpcdata *d = _rpcdata();
    155   1.1       cgd 
    156  1.10     lukem 	if (d == 0)
    157   1.1       cgd 		return;
    158   1.1       cgd 	if (d->rpcf && !d->stayopen) {
    159   1.1       cgd 		fclose(d->rpcf);
    160   1.1       cgd 		d->rpcf = NULL;
    161   1.1       cgd 	}
    162   1.1       cgd }
    163   1.1       cgd 
    164   1.1       cgd struct rpcent *
    165   1.1       cgd getrpcent()
    166   1.1       cgd {
    167  1.11     lukem 	struct rpcdata *d = _rpcdata();
    168   1.1       cgd 
    169  1.10     lukem 	if (d == 0)
    170   1.1       cgd 		return(NULL);
    171   1.1       cgd 	if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL)
    172   1.1       cgd 		return (NULL);
    173   1.1       cgd         if (fgets(d->line, BUFSIZ, d->rpcf) == NULL)
    174   1.1       cgd 		return (NULL);
    175   1.1       cgd 	return (interpret(d->line, strlen(d->line)));
    176   1.1       cgd }
    177   1.1       cgd 
    178   1.1       cgd static struct rpcent *
    179   1.1       cgd interpret(val, len)
    180   1.1       cgd 	char *val;
    181  1.13  christos 	size_t len;
    182   1.1       cgd {
    183  1.11     lukem 	struct rpcdata *d = _rpcdata();
    184   1.1       cgd 	char *p;
    185  1.11     lukem 	char *cp, **q;
    186  1.15     lukem 
    187  1.15     lukem 	_DIAGASSERT(val != NULL);
    188   1.1       cgd 
    189  1.10     lukem 	if (d == 0)
    190   1.1       cgd 		return (0);
    191   1.1       cgd 	(void) strncpy(d->line, val, len);
    192   1.1       cgd 	p = d->line;
    193   1.1       cgd 	d->line[len] = '\n';
    194   1.1       cgd 	if (*p == '#')
    195   1.1       cgd 		return (getrpcent());
    196   1.1       cgd 	cp = strpbrk(p, "#\n");
    197   1.1       cgd 	if (cp == NULL)
    198   1.1       cgd 		return (getrpcent());
    199   1.1       cgd 	*cp = '\0';
    200   1.1       cgd 	cp = strpbrk(p, " \t");
    201   1.1       cgd 	if (cp == NULL)
    202   1.1       cgd 		return (getrpcent());
    203   1.1       cgd 	*cp++ = '\0';
    204   1.1       cgd 	/* THIS STUFF IS INTERNET SPECIFIC */
    205   1.1       cgd 	d->rpc.r_name = d->line;
    206   1.1       cgd 	while (*cp == ' ' || *cp == '\t')
    207   1.1       cgd 		cp++;
    208   1.1       cgd 	d->rpc.r_number = atoi(cp);
    209   1.1       cgd 	q = d->rpc.r_aliases = d->rpc_aliases;
    210   1.1       cgd 	cp = strpbrk(cp, " \t");
    211   1.1       cgd 	if (cp != NULL)
    212   1.1       cgd 		*cp++ = '\0';
    213   1.1       cgd 	while (cp && *cp) {
    214   1.1       cgd 		if (*cp == ' ' || *cp == '\t') {
    215   1.1       cgd 			cp++;
    216   1.1       cgd 			continue;
    217   1.1       cgd 		}
    218   1.1       cgd 		if (q < &(d->rpc_aliases[MAXALIASES - 1]))
    219   1.1       cgd 			*q++ = cp;
    220   1.1       cgd 		cp = strpbrk(cp, " \t");
    221   1.1       cgd 		if (cp != NULL)
    222   1.1       cgd 			*cp++ = '\0';
    223   1.1       cgd 	}
    224   1.1       cgd 	*q = NULL;
    225   1.1       cgd 	return (&d->rpc);
    226   1.1       cgd }
    227