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