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