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