|
1 | 1 | /* @(#)getrpcent.c 2.2 88/07/29 4.0 RPCSRC */
|
2 | 2 | #if !defined(lint) && defined(SCCSIDS)
|
3 |
| -static char sccsid[] = "@(#)getrpcent.c 1.9 87/08/11 Copyr 1984 Sun Micro"; |
| 3 | +static char sccsid[] = "@(#)getrpcent.c 1.9 87/08/11 Copyr 1984 Sun Micro"; |
4 | 4 | #endif
|
5 | 5 |
|
6 | 6 | /*
|
@@ -42,192 +42,195 @@ static char sccsid[] = "@(#)getrpcent.c 1.9 87/08/11 Copyr 1984 Sun Micro";
|
42 | 42 | #include <netdb.h>
|
43 | 43 | #include <sys/socket.h>
|
44 | 44 |
|
45 |
| -extern void __setrpcent (int __stayopen) __THROW; |
46 |
| -extern void __endrpcent (void) __THROW; |
47 |
| -extern struct rpcent *__getrpcbyname (__const char *__name) __THROW; |
48 |
| -extern struct rpcent *__getrpcbynumber (int __number) __THROW; |
49 |
| -extern struct rpcent *__getrpcent (void) __THROW; |
50 |
| - |
51 |
| -#if __GNUC_PREREQ(8, 0) |
52 |
| -# pragma GCC diagnostic ignored "-Wstringop-truncation" |
| 45 | +#if defined(__PUREC__) && !defined(_SYS_POLL_H) |
| 46 | +struct pollfd { int dummy; }; |
53 | 47 | #endif
|
54 | 48 |
|
55 | 49 |
|
56 | 50 | /*
|
57 | 51 | * Internet version.
|
58 | 52 | */
|
59 |
| -struct rpcdata { |
60 |
| - FILE *rpcf; |
61 |
| - char *current; |
62 |
| - int currentlen; |
63 |
| - int stayopen; |
| 53 | +static struct rpcdata |
| 54 | +{ |
| 55 | + FILE *rpcf; |
| 56 | + int stayopen; |
64 | 57 | #define MAXALIASES 35
|
65 |
| - char *rpc_aliases[MAXALIASES]; |
66 |
| - struct rpcent rpc; |
67 |
| - char line[BUFSIZ+1]; |
68 |
| - char *domain; |
| 58 | + char *rpc_aliases[MAXALIASES]; |
| 59 | + struct rpcent rpc; |
| 60 | + char line[BUFSIZ + 1]; |
| 61 | + char *domain; |
69 | 62 | } *rpcdata;
|
70 | 63 |
|
71 |
| -static char RPCDB[] = "/etc/rpc"; |
| 64 | +static char const RPCDB[] = "U:\\etc\\rpc"; |
| 65 | +static char const RPCDB2[] = "C:\\etc\\rpc"; |
72 | 66 |
|
73 | 67 | static struct rpcdata *_rpcdata(void)
|
74 | 68 | {
|
75 |
| - register struct rpcdata *d = rpcdata; |
76 |
| - |
77 |
| - if (d == 0) { |
78 |
| - d = (struct rpcdata *)calloc(1, sizeof (struct rpcdata)); |
79 |
| - rpcdata = d; |
80 |
| - } |
81 |
| - return (d); |
82 |
| -} |
83 |
| - |
84 |
| -struct rpcent *__getrpcbynumber (int number) |
85 |
| -{ |
86 |
| - register struct rpcdata *d = _rpcdata(); |
87 |
| - register struct rpcent *p; |
| 69 | + struct rpcdata *d = rpcdata; |
88 | 70 |
|
89 | 71 | if (d == 0)
|
90 |
| - return (0); |
91 |
| - __setrpcent(0); |
92 |
| - while ((p = __getrpcent())) { |
93 |
| - if (p->r_number == number) |
94 |
| - break; |
| 72 | + { |
| 73 | + d = (struct rpcdata *) calloc(1, sizeof(struct rpcdata)); |
| 74 | + rpcdata = d; |
95 | 75 | }
|
96 |
| - __endrpcent(); |
97 |
| - return (p); |
| 76 | + return d; |
98 | 77 | }
|
99 |
| -weak_alias (__getrpcbynumber, getrpcbynumber) |
100 | 78 |
|
101 |
| -struct rpcent *__getrpcbyname (const char *name) |
102 |
| -{ |
103 |
| - struct rpcent *rpc; |
104 |
| - char **rp; |
105 |
| - |
106 |
| - __setrpcent(0); |
107 |
| - while((rpc = __getrpcent())) { |
108 |
| - if (strcmp(rpc->r_name, name) == 0) |
109 |
| - return (rpc); |
110 |
| - for (rp = rpc->r_aliases; *rp != NULL; rp++) { |
111 |
| - if (strcmp(*rp, name) == 0) |
112 |
| - return (rpc); |
113 |
| - } |
114 |
| - } |
115 |
| - __endrpcent(); |
116 |
| - return (NULL); |
117 |
| -} |
118 |
| -weak_alias (__getrpcbyname, getrpcbyname) |
119 | 79 |
|
120 |
| -void __setrpcent (int f) |
| 80 | +void setrpcent(int f) |
121 | 81 | {
|
122 |
| - register struct rpcdata *d = _rpcdata(); |
| 82 | + struct rpcdata *d = _rpcdata(); |
123 | 83 |
|
124 | 84 | if (d == 0)
|
125 | 85 | return;
|
126 | 86 | if (d->rpcf == NULL)
|
| 87 | + { |
127 | 88 | d->rpcf = fopen(RPCDB, "r");
|
128 |
| - else |
| 89 | + if (d->rpcf == NULL) |
| 90 | + d->rpcf = fopen(RPCDB2, "r"); |
| 91 | + } else |
| 92 | + { |
129 | 93 | rewind(d->rpcf);
|
130 |
| - if (d->current) |
131 |
| - free(d->current); |
132 |
| - d->current = NULL; |
| 94 | + } |
133 | 95 | d->stayopen |= f;
|
134 | 96 | }
|
135 |
| -weak_alias (__setrpcent, setrpcent) |
136 | 97 |
|
137 |
| -void __endrpcent (void) |
| 98 | + |
| 99 | +void endrpcent(void) |
138 | 100 | {
|
139 |
| - register struct rpcdata *d = _rpcdata(); |
| 101 | + struct rpcdata *d = _rpcdata(); |
140 | 102 |
|
141 | 103 | if (d == 0)
|
142 | 104 | return;
|
143 |
| - if (d->current && !d->stayopen) { |
144 |
| - free(d->current); |
145 |
| - d->current = NULL; |
146 |
| - } |
147 |
| - if (d->rpcf && !d->stayopen) { |
| 105 | + if (d->rpcf && !d->stayopen) |
| 106 | + { |
148 | 107 | fclose(d->rpcf);
|
149 | 108 | d->rpcf = NULL;
|
150 | 109 | }
|
151 | 110 | }
|
152 |
| -weak_alias (__endrpcent, endrpcent) |
153 | 111 |
|
154 |
| -static struct rpcent *interpret (char *val, int len); |
155 | 112 |
|
156 |
| -struct rpcent *__getrpcent (void) |
| 113 | +static int interpret(struct rpcdata *d) |
157 | 114 | {
|
158 |
| - register struct rpcdata *d = _rpcdata(); |
159 |
| - |
160 |
| - if (d == 0) |
161 |
| - return(NULL); |
162 |
| - if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL) |
163 |
| - return (NULL); |
164 |
| - if (fgets(d->line, BUFSIZ, d->rpcf) == NULL) |
165 |
| - return (NULL); |
166 |
| - return interpret(d->line, strlen(d->line)); |
167 |
| -} |
168 |
| -weak_alias (__getrpcent, getrpcent) |
169 |
| - |
170 |
| -static struct rpcent *interpret (char *val, int len) |
171 |
| -{ |
172 |
| - register struct rpcdata *d = _rpcdata(); |
173 | 115 | char *p;
|
174 |
| - register char *cp, **q; |
| 116 | + char *cp; |
| 117 | + char **q; |
175 | 118 |
|
176 |
| - if (d == 0) |
177 |
| - return NULL; |
178 |
| - strncpy(d->line, val, len); |
179 | 119 | p = d->line;
|
180 |
| - d->line[len] = '\n'; |
181 | 120 | if (*p == '#')
|
182 |
| - return (__getrpcent()); |
183 |
| - cp = index(p, '#'); |
| 121 | + return 0; |
| 122 | + cp = strchr(p, '#'); |
184 | 123 | if (cp == NULL)
|
185 |
| - { |
186 |
| - cp = index(p, '\n'); |
187 |
| - if (cp == NULL) |
188 |
| - return (__getrpcent()); |
189 |
| - } |
190 |
| - *cp = '\0'; |
191 |
| - cp = index(p, ' '); |
| 124 | + cp = strchr(p, '\n'); |
| 125 | + if (cp != NULL) |
| 126 | + *cp = '\0'; |
| 127 | + if (*p == '\0') |
| 128 | + return 0; |
| 129 | + cp = strchr(p, ' '); |
192 | 130 | if (cp == NULL)
|
193 | 131 | {
|
194 |
| - cp = index(p, '\t'); |
| 132 | + cp = strchr(p, '\t'); |
195 | 133 | if (cp == NULL)
|
196 |
| - return (__getrpcent()); |
| 134 | + return 0; |
197 | 135 | }
|
198 | 136 | *cp++ = '\0';
|
199 | 137 | /* THIS STUFF IS INTERNET SPECIFIC */
|
200 | 138 | d->rpc.r_name = d->line;
|
201 | 139 | while (*cp == ' ' || *cp == '\t')
|
202 | 140 | cp++;
|
203 |
| - d->rpc.r_number = atoi(cp); |
| 141 | + d->rpc.r_number = strtol(cp, NULL, 10); |
204 | 142 | q = d->rpc.r_aliases = d->rpc_aliases;
|
205 |
| - cp = index(p, ' '); |
| 143 | + cp = strchr(p, ' '); |
206 | 144 | if (cp != NULL)
|
| 145 | + { |
207 | 146 | *cp++ = '\0';
|
208 |
| - else |
| 147 | + } else |
209 | 148 | {
|
210 |
| - cp = index(p, '\t'); |
| 149 | + cp = strchr(p, '\t'); |
211 | 150 | if (cp != NULL)
|
212 | 151 | *cp++ = '\0';
|
213 | 152 | }
|
214 |
| - while (cp && *cp) { |
215 |
| - if (*cp == ' ' || *cp == '\t') { |
| 153 | + while (cp && *cp) |
| 154 | + { |
| 155 | + if (*cp == ' ' || *cp == '\t') |
| 156 | + { |
216 | 157 | cp++;
|
217 | 158 | continue;
|
218 | 159 | }
|
219 | 160 | if (q < &(d->rpc_aliases[MAXALIASES - 1]))
|
220 | 161 | *q++ = cp;
|
221 |
| - cp = index(p, ' '); |
| 162 | + cp = strchr(p, ' '); |
222 | 163 | if (cp != NULL)
|
| 164 | + { |
223 | 165 | *cp++ = '\0';
|
224 |
| - else |
225 |
| - { |
226 |
| - cp = index(p, '\t'); |
| 166 | + } else |
| 167 | + { |
| 168 | + cp = strchr(p, '\t'); |
227 | 169 | if (cp != NULL)
|
228 | 170 | *cp++ = '\0';
|
229 | 171 | }
|
230 | 172 | }
|
231 | 173 | *q = NULL;
|
232 |
| - return (&d->rpc); |
| 174 | + return 1; |
| 175 | +} |
| 176 | + |
| 177 | + |
| 178 | +struct rpcent *getrpcent(void) |
| 179 | +{ |
| 180 | + struct rpcdata *d = _rpcdata(); |
| 181 | + |
| 182 | + if (d == 0) |
| 183 | + return NULL; |
| 184 | + if (d->rpcf == NULL) |
| 185 | + setrpcent(0); |
| 186 | + if (d->rpcf == NULL) |
| 187 | + return NULL; |
| 188 | + for (;;) |
| 189 | + { |
| 190 | + if (fgets(d->line, BUFSIZ, d->rpcf) == NULL) |
| 191 | + break; |
| 192 | + if (interpret(d)) |
| 193 | + return &d->rpc; |
| 194 | + } |
| 195 | + return NULL; |
| 196 | +} |
| 197 | + |
| 198 | + |
| 199 | +struct rpcent *getrpcbynumber(int number) |
| 200 | +{ |
| 201 | + struct rpcdata *d = _rpcdata(); |
| 202 | + struct rpcent *p; |
| 203 | + |
| 204 | + if (d == 0) |
| 205 | + return 0; |
| 206 | + setrpcent(0); |
| 207 | + while ((p = getrpcent()) != NULL) |
| 208 | + { |
| 209 | + if (p->r_number == number) |
| 210 | + break; |
| 211 | + } |
| 212 | + endrpcent(); |
| 213 | + /* FIXME there is no way for the application to free the rpcdata buffer */ |
| 214 | + return p; |
| 215 | +} |
| 216 | + |
| 217 | + |
| 218 | +struct rpcent *getrpcbyname(const char *name) |
| 219 | +{ |
| 220 | + struct rpcent *rpc; |
| 221 | + char **rp; |
| 222 | + |
| 223 | + setrpcent(0); |
| 224 | + while ((rpc = getrpcent()) != NULL) |
| 225 | + { |
| 226 | + if (strcmp(rpc->r_name, name) == 0) |
| 227 | + return rpc; |
| 228 | + for (rp = rpc->r_aliases; *rp != NULL; rp++) |
| 229 | + { |
| 230 | + if (strcmp(*rp, name) == 0) |
| 231 | + return rpc; |
| 232 | + } |
| 233 | + } |
| 234 | + endrpcent(); |
| 235 | + return NULL; |
233 | 236 | }
|
0 commit comments