getnetgrent.c revision 1.40.10.2 1 1.40.10.2 rtr /* $NetBSD: getnetgrent.c,v 1.40.10.2 2008/04/05 08:01:55 rtr Exp $ */
2 1.40.10.2 rtr
3 1.40.10.2 rtr /*
4 1.40.10.2 rtr * Copyright (c) 1994 Christos Zoulas
5 1.40.10.2 rtr * All rights reserved.
6 1.40.10.2 rtr *
7 1.40.10.2 rtr * Redistribution and use in source and binary forms, with or without
8 1.40.10.2 rtr * modification, are permitted provided that the following conditions
9 1.40.10.2 rtr * are met:
10 1.40.10.2 rtr * 1. Redistributions of source code must retain the above copyright
11 1.40.10.2 rtr * notice, this list of conditions and the following disclaimer.
12 1.40.10.2 rtr * 2. Redistributions in binary form must reproduce the above copyright
13 1.40.10.2 rtr * notice, this list of conditions and the following disclaimer in the
14 1.40.10.2 rtr * documentation and/or other materials provided with the distribution.
15 1.40.10.2 rtr * 3. All advertising materials mentioning features or use of this software
16 1.40.10.2 rtr * must display the following acknowledgement:
17 1.40.10.2 rtr * This product includes software developed by Christos Zoulas.
18 1.40.10.2 rtr * 4. The name of the author may not be used to endorse or promote products
19 1.40.10.2 rtr * derived from this software without specific prior written permission.
20 1.40.10.2 rtr *
21 1.40.10.2 rtr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
22 1.40.10.2 rtr * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 1.40.10.2 rtr * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 1.40.10.2 rtr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
25 1.40.10.2 rtr * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 1.40.10.2 rtr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 1.40.10.2 rtr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 1.40.10.2 rtr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 1.40.10.2 rtr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 1.40.10.2 rtr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 1.40.10.2 rtr * SUCH DAMAGE.
32 1.40.10.2 rtr */
33 1.40.10.2 rtr
34 1.40.10.2 rtr #include <sys/cdefs.h>
35 1.40.10.2 rtr #if defined(LIBC_SCCS) && !defined(lint)
36 1.40.10.2 rtr __RCSID("$NetBSD: getnetgrent.c,v 1.40.10.2 2008/04/05 08:01:55 rtr Exp $");
37 1.40.10.2 rtr #endif /* LIBC_SCCS and not lint */
38 1.40.10.2 rtr
39 1.40.10.2 rtr #include "namespace.h"
40 1.40.10.2 rtr #include <sys/types.h>
41 1.40.10.2 rtr
42 1.40.10.2 rtr #include <assert.h>
43 1.40.10.2 rtr #include <ctype.h>
44 1.40.10.2 rtr #include <db.h>
45 1.40.10.2 rtr #include <err.h>
46 1.40.10.2 rtr #include <fcntl.h>
47 1.40.10.2 rtr #define _NETGROUP_PRIVATE
48 1.40.10.2 rtr #include <stringlist.h>
49 1.40.10.2 rtr #include <netgroup.h>
50 1.40.10.2 rtr #include <nsswitch.h>
51 1.40.10.2 rtr #include <stdarg.h>
52 1.40.10.2 rtr #include <stdio.h>
53 1.40.10.2 rtr #include <stdlib.h>
54 1.40.10.2 rtr #include <string.h>
55 1.40.10.2 rtr
56 1.40.10.2 rtr #ifdef YP
57 1.40.10.2 rtr #include <rpc/rpc.h>
58 1.40.10.2 rtr #include <rpcsvc/ypclnt.h>
59 1.40.10.2 rtr #include <rpcsvc/yp_prot.h>
60 1.40.10.2 rtr #endif
61 1.40.10.2 rtr
62 1.40.10.2 rtr #ifdef __weak_alias
63 1.40.10.2 rtr __weak_alias(endnetgrent,_endnetgrent)
64 1.40.10.2 rtr __weak_alias(getnetgrent,_getnetgrent)
65 1.40.10.2 rtr __weak_alias(innetgr,_innetgr)
66 1.40.10.2 rtr __weak_alias(setnetgrent,_setnetgrent)
67 1.40.10.2 rtr #endif
68 1.40.10.2 rtr
69 1.40.10.2 rtr #define _NG_STAR(s) (((s) == NULL || *(s) == '\0') ? _ngstar : s)
70 1.40.10.2 rtr #define _NG_EMPTY(s) ((s) == NULL ? "" : s)
71 1.40.10.2 rtr #define _NG_ISSPACE(p) (isspace((unsigned char) (p)) || (p) == '\n')
72 1.40.10.2 rtr
73 1.40.10.2 rtr static const char _ngstar[] = "*";
74 1.40.10.2 rtr static struct netgroup *_nghead = NULL;
75 1.40.10.2 rtr static struct netgroup *_nglist = NULL;
76 1.40.10.2 rtr static DB *_ng_db;
77 1.40.10.2 rtr
78 1.40.10.2 rtr static int getstring(char **, int, __aconst char **);
79 1.40.10.2 rtr static struct netgroup *getnetgroup(char **);
80 1.40.10.2 rtr static int lookup(char *, char **, int);
81 1.40.10.2 rtr static int addgroup(StringList *, char *);
82 1.40.10.2 rtr static int in_check(const char *, const char *, const char *,
83 1.40.10.2 rtr struct netgroup *);
84 1.40.10.2 rtr static int in_find(StringList *, char *, const char *, const char *,
85 1.40.10.2 rtr const char *);
86 1.40.10.2 rtr static char *in_lookup1(const char *, const char *, int);
87 1.40.10.2 rtr static int in_lookup(const char *, const char *, const char *, int);
88 1.40.10.2 rtr
89 1.40.10.2 rtr #ifdef NSSRC_FILES
90 1.40.10.2 rtr static const ns_src default_files_nis[] = {
91 1.40.10.2 rtr { NSSRC_FILES, NS_SUCCESS | NS_NOTFOUND },
92 1.40.10.2 rtr #ifdef YP
93 1.40.10.2 rtr { NSSRC_NIS, NS_SUCCESS },
94 1.40.10.2 rtr #endif
95 1.40.10.2 rtr { 0, 0 },
96 1.40.10.2 rtr };
97 1.40.10.2 rtr #endif
98 1.40.10.2 rtr
99 1.40.10.2 rtr /*
100 1.40.10.2 rtr * getstring(): Get a string delimited by the character, skipping leading and
101 1.40.10.2 rtr * trailing blanks and advancing the pointer
102 1.40.10.2 rtr */
103 1.40.10.2 rtr static int
104 1.40.10.2 rtr getstring(char **pp, int del, char __aconst **str)
105 1.40.10.2 rtr {
106 1.40.10.2 rtr size_t len;
107 1.40.10.2 rtr char *sp, *ep, *dp;
108 1.40.10.2 rtr
109 1.40.10.2 rtr _DIAGASSERT(pp != NULL);
110 1.40.10.2 rtr _DIAGASSERT(str != NULL);
111 1.40.10.2 rtr
112 1.40.10.2 rtr /* skip leading blanks */
113 1.40.10.2 rtr for (sp = *pp; *sp && _NG_ISSPACE(*sp); sp++)
114 1.40.10.2 rtr continue;
115 1.40.10.2 rtr
116 1.40.10.2 rtr /* accumulate till delimiter or space */
117 1.40.10.2 rtr for (ep = sp; *ep && *ep != del && !_NG_ISSPACE(*ep); ep++)
118 1.40.10.2 rtr continue;
119 1.40.10.2 rtr
120 1.40.10.2 rtr /* hunt for the delimiter */
121 1.40.10.2 rtr for (dp = ep; *dp && *dp != del && _NG_ISSPACE(*dp); dp++)
122 1.40.10.2 rtr continue;
123 1.40.10.2 rtr
124 1.40.10.2 rtr if (*dp != del) {
125 1.40.10.2 rtr *str = NULL;
126 1.40.10.2 rtr return 0;
127 1.40.10.2 rtr }
128 1.40.10.2 rtr
129 1.40.10.2 rtr *pp = ++dp;
130 1.40.10.2 rtr
131 1.40.10.2 rtr len = (ep - sp) + 1;
132 1.40.10.2 rtr if (len > 1) {
133 1.40.10.2 rtr dp = malloc(len);
134 1.40.10.2 rtr if (dp == NULL)
135 1.40.10.2 rtr return 0;
136 1.40.10.2 rtr (void)memcpy(dp, sp, len);
137 1.40.10.2 rtr dp[len - 1] = '\0';
138 1.40.10.2 rtr } else
139 1.40.10.2 rtr dp = NULL;
140 1.40.10.2 rtr
141 1.40.10.2 rtr *str = dp;
142 1.40.10.2 rtr return 1;
143 1.40.10.2 rtr }
144 1.40.10.2 rtr
145 1.40.10.2 rtr
146 1.40.10.2 rtr /*
147 1.40.10.2 rtr * getnetgroup(): Parse a netgroup, and advance the pointer
148 1.40.10.2 rtr */
149 1.40.10.2 rtr static struct netgroup *
150 1.40.10.2 rtr getnetgroup(pp)
151 1.40.10.2 rtr char **pp;
152 1.40.10.2 rtr {
153 1.40.10.2 rtr struct netgroup *ng;
154 1.40.10.2 rtr
155 1.40.10.2 rtr _DIAGASSERT(pp != NULL);
156 1.40.10.2 rtr _DIAGASSERT(*pp != NULL);
157 1.40.10.2 rtr
158 1.40.10.2 rtr ng = malloc(sizeof(struct netgroup));
159 1.40.10.2 rtr if (ng == NULL)
160 1.40.10.2 rtr return NULL;
161 1.40.10.2 rtr
162 1.40.10.2 rtr (*pp)++; /* skip '(' */
163 1.40.10.2 rtr if (!getstring(pp, ',', &ng->ng_host))
164 1.40.10.2 rtr goto badhost;
165 1.40.10.2 rtr
166 1.40.10.2 rtr if (!getstring(pp, ',', &ng->ng_user))
167 1.40.10.2 rtr goto baduser;
168 1.40.10.2 rtr
169 1.40.10.2 rtr if (!getstring(pp, ')', &ng->ng_domain))
170 1.40.10.2 rtr goto baddomain;
171 1.40.10.2 rtr
172 1.40.10.2 rtr #ifdef DEBUG_NG
173 1.40.10.2 rtr {
174 1.40.10.2 rtr char buf[1024];
175 1.40.10.2 rtr (void) fprintf(stderr, "netgroup %s\n",
176 1.40.10.2 rtr _ng_print(buf, sizeof(buf), ng));
177 1.40.10.2 rtr }
178 1.40.10.2 rtr #endif
179 1.40.10.2 rtr return ng;
180 1.40.10.2 rtr
181 1.40.10.2 rtr baddomain:
182 1.40.10.2 rtr if (ng->ng_user)
183 1.40.10.2 rtr free(ng->ng_user);
184 1.40.10.2 rtr baduser:
185 1.40.10.2 rtr if (ng->ng_host)
186 1.40.10.2 rtr free(ng->ng_host);
187 1.40.10.2 rtr badhost:
188 1.40.10.2 rtr free(ng);
189 1.40.10.2 rtr return NULL;
190 1.40.10.2 rtr }
191 1.40.10.2 rtr
192 1.40.10.2 rtr void
193 1.40.10.2 rtr _ng_cycle(const char *grp, const StringList *sl)
194 1.40.10.2 rtr {
195 1.40.10.2 rtr size_t i;
196 1.40.10.2 rtr warnx("netgroup: Cycle in group `%s'", grp);
197 1.40.10.2 rtr (void)fprintf(stderr, "groups: ");
198 1.40.10.2 rtr for (i = 0; i < sl->sl_cur; i++)
199 1.40.10.2 rtr (void)fprintf(stderr, "%s ", sl->sl_str[i]);
200 1.40.10.2 rtr (void)fprintf(stderr, "\n");
201 1.40.10.2 rtr }
202 1.40.10.2 rtr
203 1.40.10.2 rtr static int _local_lookup(void *, void *, va_list);
204 1.40.10.2 rtr
205 1.40.10.2 rtr /*ARGSUSED*/
206 1.40.10.2 rtr static int
207 1.40.10.2 rtr _local_lookup(void *rv, void *cb_data, va_list ap)
208 1.40.10.2 rtr {
209 1.40.10.2 rtr char *name = va_arg(ap, char *);
210 1.40.10.2 rtr char **line = va_arg(ap, char **);
211 1.40.10.2 rtr int bywhat = va_arg(ap, int);
212 1.40.10.2 rtr
213 1.40.10.2 rtr DBT key, data;
214 1.40.10.2 rtr size_t len;
215 1.40.10.2 rtr char *ks;
216 1.40.10.2 rtr int r;
217 1.40.10.2 rtr
218 1.40.10.2 rtr if (_ng_db == NULL)
219 1.40.10.2 rtr return NS_UNAVAIL;
220 1.40.10.2 rtr
221 1.40.10.2 rtr len = strlen(name) + 2;
222 1.40.10.2 rtr ks = malloc(len);
223 1.40.10.2 rtr if (ks == NULL)
224 1.40.10.2 rtr return NS_UNAVAIL;
225 1.40.10.2 rtr
226 1.40.10.2 rtr ks[0] = bywhat;
227 1.40.10.2 rtr (void)memcpy(&ks[1], name, len - 1);
228 1.40.10.2 rtr
229 1.40.10.2 rtr key.data = (u_char *)ks;
230 1.40.10.2 rtr key.size = len;
231 1.40.10.2 rtr
232 1.40.10.2 rtr r = (*_ng_db->get)(_ng_db, &key, &data, 0);
233 1.40.10.2 rtr free(ks);
234 1.40.10.2 rtr switch (r) {
235 1.40.10.2 rtr case 0:
236 1.40.10.2 rtr break;
237 1.40.10.2 rtr case 1:
238 1.40.10.2 rtr return NS_NOTFOUND;
239 1.40.10.2 rtr case -1:
240 1.40.10.2 rtr /* XXX: call endnetgrent() here ? */
241 1.40.10.2 rtr return NS_UNAVAIL;
242 1.40.10.2 rtr }
243 1.40.10.2 rtr
244 1.40.10.2 rtr *line = strdup(data.data);
245 1.40.10.2 rtr if (*line == NULL)
246 1.40.10.2 rtr return NS_UNAVAIL;
247 1.40.10.2 rtr return NS_SUCCESS;
248 1.40.10.2 rtr }
249 1.40.10.2 rtr
250 1.40.10.2 rtr #ifdef YP
251 1.40.10.2 rtr static int _nis_lookup(void *, void *, va_list);
252 1.40.10.2 rtr
253 1.40.10.2 rtr /*ARGSUSED*/
254 1.40.10.2 rtr static int
255 1.40.10.2 rtr _nis_lookup(void *rv, void *cb_data, va_list ap)
256 1.40.10.2 rtr {
257 1.40.10.2 rtr char *name = va_arg(ap, char *);
258 1.40.10.2 rtr char **line = va_arg(ap, char **);
259 1.40.10.2 rtr int bywhat = va_arg(ap, int);
260 1.40.10.2 rtr
261 1.40.10.2 rtr static char *__ypdomain;
262 1.40.10.2 rtr int i;
263 1.40.10.2 rtr const char *map = NULL;
264 1.40.10.2 rtr
265 1.40.10.2 rtr if(__ypdomain == NULL) {
266 1.40.10.2 rtr switch (yp_get_default_domain(&__ypdomain)) {
267 1.40.10.2 rtr case 0:
268 1.40.10.2 rtr break;
269 1.40.10.2 rtr case YPERR_RESRC:
270 1.40.10.2 rtr return NS_TRYAGAIN;
271 1.40.10.2 rtr default:
272 1.40.10.2 rtr return NS_UNAVAIL;
273 1.40.10.2 rtr }
274 1.40.10.2 rtr }
275 1.40.10.2 rtr
276 1.40.10.2 rtr switch (bywhat) {
277 1.40.10.2 rtr case _NG_KEYBYNAME:
278 1.40.10.2 rtr map = "netgroup";
279 1.40.10.2 rtr break;
280 1.40.10.2 rtr
281 1.40.10.2 rtr case _NG_KEYBYUSER:
282 1.40.10.2 rtr map = "netgroup.byuser";
283 1.40.10.2 rtr break;
284 1.40.10.2 rtr
285 1.40.10.2 rtr case _NG_KEYBYHOST:
286 1.40.10.2 rtr map = "netgroup.byhost";
287 1.40.10.2 rtr break;
288 1.40.10.2 rtr
289 1.40.10.2 rtr default:
290 1.40.10.2 rtr abort();
291 1.40.10.2 rtr }
292 1.40.10.2 rtr
293 1.40.10.2 rtr *line = NULL;
294 1.40.10.2 rtr switch (yp_match(__ypdomain, map, name, (int)strlen(name), line, &i)) {
295 1.40.10.2 rtr case 0:
296 1.40.10.2 rtr return NS_SUCCESS;
297 1.40.10.2 rtr case YPERR_KEY:
298 1.40.10.2 rtr if (*line)
299 1.40.10.2 rtr free(*line);
300 1.40.10.2 rtr return NS_NOTFOUND;
301 1.40.10.2 rtr default:
302 1.40.10.2 rtr if (*line)
303 1.40.10.2 rtr free(*line);
304 1.40.10.2 rtr return NS_UNAVAIL;
305 1.40.10.2 rtr }
306 1.40.10.2 rtr /* NOTREACHED */
307 1.40.10.2 rtr }
308 1.40.10.2 rtr #endif
309 1.40.10.2 rtr
310 1.40.10.2 rtr #ifdef NSSRC_FILES
311 1.40.10.2 rtr /*
312 1.40.10.2 rtr * lookup(): Find the given key in the database or yp, and return its value
313 1.40.10.2 rtr * in *line; returns 1 if key was found, 0 otherwise
314 1.40.10.2 rtr */
315 1.40.10.2 rtr static int
316 1.40.10.2 rtr lookup(char *name, char **line, int bywhat)
317 1.40.10.2 rtr {
318 1.40.10.2 rtr int r;
319 1.40.10.2 rtr static const ns_dtab dtab[] = {
320 1.40.10.2 rtr NS_FILES_CB(_local_lookup, NULL)
321 1.40.10.2 rtr NS_NIS_CB(_nis_lookup, NULL)
322 1.40.10.2 rtr NS_NULL_CB
323 1.40.10.2 rtr };
324 1.40.10.2 rtr
325 1.40.10.2 rtr _DIAGASSERT(name != NULL);
326 1.40.10.2 rtr _DIAGASSERT(line != NULL);
327 1.40.10.2 rtr
328 1.40.10.2 rtr r = nsdispatch(NULL, dtab, NSDB_NETGROUP, "lookup", default_files_nis,
329 1.40.10.2 rtr name, line, bywhat);
330 1.40.10.2 rtr return (r == NS_SUCCESS) ? 1 : 0;
331 1.40.10.2 rtr }
332 1.40.10.2 rtr #else
333 1.40.10.2 rtr static int
334 1.40.10.2 rtr _local_lookupv(int *rv, void *cbdata, ...)
335 1.40.10.2 rtr {
336 1.40.10.2 rtr int e;
337 1.40.10.2 rtr va_list ap;
338 1.40.10.2 rtr va_start(ap, cbdata);
339 1.40.10.2 rtr e = _local_lookup(rv, cbdata, ap);
340 1.40.10.2 rtr va_end(ap);
341 1.40.10.2 rtr return e;
342 1.40.10.2 rtr }
343 1.40.10.2 rtr
344 1.40.10.2 rtr static int
345 1.40.10.2 rtr lookup(name, line, bywhat)
346 1.40.10.2 rtr char *name;
347 1.40.10.2 rtr char **line;
348 1.40.10.2 rtr int bywhat;
349 1.40.10.2 rtr {
350 1.40.10.2 rtr return _local_lookupv(NULL, NULL, name, line, bywhat) == NS_SUCCESS;
351 1.40.10.2 rtr }
352 1.40.10.2 rtr #endif
353 1.40.10.2 rtr
354 1.40.10.2 rtr /*
355 1.40.10.2 rtr * _ng_parse(): Parse a line and return: _NG_ERROR: Syntax Error _NG_NONE:
356 1.40.10.2 rtr * line was empty or a comment _NG_GROUP: line had a netgroup definition,
357 1.40.10.2 rtr * returned in ng _NG_NAME: line had a netgroup name, returned in name
358 1.40.10.2 rtr *
359 1.40.10.2 rtr * Public since used by netgroup_mkdb
360 1.40.10.2 rtr */
361 1.40.10.2 rtr int
362 1.40.10.2 rtr _ng_parse(char **p, char **name, struct netgroup **ng)
363 1.40.10.2 rtr {
364 1.40.10.2 rtr
365 1.40.10.2 rtr _DIAGASSERT(p != NULL);
366 1.40.10.2 rtr _DIAGASSERT(*p != NULL);
367 1.40.10.2 rtr _DIAGASSERT(name != NULL);
368 1.40.10.2 rtr _DIAGASSERT(ng != NULL);
369 1.40.10.2 rtr
370 1.40.10.2 rtr while (**p) {
371 1.40.10.2 rtr if (**p == '#')
372 1.40.10.2 rtr /* comment */
373 1.40.10.2 rtr return _NG_NONE;
374 1.40.10.2 rtr
375 1.40.10.2 rtr while (**p && _NG_ISSPACE(**p))
376 1.40.10.2 rtr /* skipblank */
377 1.40.10.2 rtr (*p)++;
378 1.40.10.2 rtr
379 1.40.10.2 rtr if (**p == '(') {
380 1.40.10.2 rtr if ((*ng = getnetgroup(p)) == NULL)
381 1.40.10.2 rtr return _NG_ERROR;
382 1.40.10.2 rtr return _NG_GROUP;
383 1.40.10.2 rtr } else {
384 1.40.10.2 rtr char *np;
385 1.40.10.2 rtr size_t i;
386 1.40.10.2 rtr
387 1.40.10.2 rtr for (np = *p; **p && !_NG_ISSPACE(**p); (*p)++)
388 1.40.10.2 rtr continue;
389 1.40.10.2 rtr if (np != *p) {
390 1.40.10.2 rtr i = (*p - np) + 1;
391 1.40.10.2 rtr *name = malloc(i);
392 1.40.10.2 rtr if (*name == NULL)
393 1.40.10.2 rtr return _NG_ERROR;
394 1.40.10.2 rtr (void)memcpy(*name, np, i);
395 1.40.10.2 rtr (*name)[i - 1] = '\0';
396 1.40.10.2 rtr return _NG_NAME;
397 1.40.10.2 rtr }
398 1.40.10.2 rtr }
399 1.40.10.2 rtr }
400 1.40.10.2 rtr return _NG_NONE;
401 1.40.10.2 rtr }
402 1.40.10.2 rtr
403 1.40.10.2 rtr
404 1.40.10.2 rtr /*
405 1.40.10.2 rtr * addgroup(): Recursively add all the members of the netgroup to this group.
406 1.40.10.2 rtr * returns 0 upon failure, nonzero upon success.
407 1.40.10.2 rtr * grp is not a valid pointer after return (either free(3)ed or allocated
408 1.40.10.2 rtr * to a stringlist). in either case, it shouldn't be used again.
409 1.40.10.2 rtr */
410 1.40.10.2 rtr static int
411 1.40.10.2 rtr addgroup(StringList *sl, char *grp)
412 1.40.10.2 rtr {
413 1.40.10.2 rtr char *line, *p;
414 1.40.10.2 rtr struct netgroup *ng;
415 1.40.10.2 rtr char *name;
416 1.40.10.2 rtr
417 1.40.10.2 rtr _DIAGASSERT(sl != NULL);
418 1.40.10.2 rtr _DIAGASSERT(grp != NULL);
419 1.40.10.2 rtr
420 1.40.10.2 rtr #ifdef DEBUG_NG
421 1.40.10.2 rtr (void)fprintf(stderr, "addgroup(%s)\n", grp);
422 1.40.10.2 rtr #endif
423 1.40.10.2 rtr /* check for cycles */
424 1.40.10.2 rtr if (sl_find(sl, grp) != NULL) {
425 1.40.10.2 rtr _ng_cycle(grp, sl);
426 1.40.10.2 rtr free(grp);
427 1.40.10.2 rtr return 0;
428 1.40.10.2 rtr }
429 1.40.10.2 rtr if (sl_add(sl, grp) == -1) {
430 1.40.10.2 rtr free(grp);
431 1.40.10.2 rtr return 0;
432 1.40.10.2 rtr }
433 1.40.10.2 rtr
434 1.40.10.2 rtr /* Lookup this netgroup */
435 1.40.10.2 rtr line = NULL;
436 1.40.10.2 rtr if (!lookup(grp, &line, _NG_KEYBYNAME)) {
437 1.40.10.2 rtr if (line)
438 1.40.10.2 rtr free(line);
439 1.40.10.2 rtr return 0;
440 1.40.10.2 rtr }
441 1.40.10.2 rtr
442 1.40.10.2 rtr p = line;
443 1.40.10.2 rtr
444 1.40.10.2 rtr for (;;) {
445 1.40.10.2 rtr switch (_ng_parse(&p, &name, &ng)) {
446 1.40.10.2 rtr case _NG_NONE:
447 1.40.10.2 rtr /* Done with the line */
448 1.40.10.2 rtr free(line);
449 1.40.10.2 rtr return 1;
450 1.40.10.2 rtr
451 1.40.10.2 rtr case _NG_GROUP:
452 1.40.10.2 rtr /* new netgroup */
453 1.40.10.2 rtr /* add to the list */
454 1.40.10.2 rtr ng->ng_next = _nglist;
455 1.40.10.2 rtr _nglist = ng;
456 1.40.10.2 rtr break;
457 1.40.10.2 rtr
458 1.40.10.2 rtr case _NG_NAME:
459 1.40.10.2 rtr /* netgroup name */
460 1.40.10.2 rtr if (!addgroup(sl, name))
461 1.40.10.2 rtr return 0;
462 1.40.10.2 rtr break;
463 1.40.10.2 rtr
464 1.40.10.2 rtr case _NG_ERROR:
465 1.40.10.2 rtr return 0;
466 1.40.10.2 rtr
467 1.40.10.2 rtr default:
468 1.40.10.2 rtr abort();
469 1.40.10.2 rtr }
470 1.40.10.2 rtr }
471 1.40.10.2 rtr }
472 1.40.10.2 rtr
473 1.40.10.2 rtr
474 1.40.10.2 rtr /*
475 1.40.10.2 rtr * in_check(): Compare the spec with the netgroup
476 1.40.10.2 rtr */
477 1.40.10.2 rtr static int
478 1.40.10.2 rtr in_check(const char *host, const char *user, const char *domain,
479 1.40.10.2 rtr struct netgroup *ng)
480 1.40.10.2 rtr {
481 1.40.10.2 rtr
482 1.40.10.2 rtr /* host may be NULL */
483 1.40.10.2 rtr /* user may be NULL */
484 1.40.10.2 rtr /* domain may be NULL */
485 1.40.10.2 rtr _DIAGASSERT(ng != NULL);
486 1.40.10.2 rtr
487 1.40.10.2 rtr if ((host != NULL) && (ng->ng_host != NULL)
488 1.40.10.2 rtr && strcmp(ng->ng_host, host) != 0)
489 1.40.10.2 rtr return 0;
490 1.40.10.2 rtr
491 1.40.10.2 rtr if ((user != NULL) && (ng->ng_user != NULL)
492 1.40.10.2 rtr && strcmp(ng->ng_user, user) != 0)
493 1.40.10.2 rtr return 0;
494 1.40.10.2 rtr
495 1.40.10.2 rtr if ((domain != NULL) && (ng->ng_domain != NULL)
496 1.40.10.2 rtr && strcmp(ng->ng_domain, domain) != 0)
497 1.40.10.2 rtr return 0;
498 1.40.10.2 rtr
499 1.40.10.2 rtr return 1;
500 1.40.10.2 rtr }
501 1.40.10.2 rtr
502 1.40.10.2 rtr
503 1.40.10.2 rtr /*
504 1.40.10.2 rtr * in_find(): Find a match for the host, user, domain spec.
505 1.40.10.2 rtr * grp is not a valid pointer after return (either free(3)ed or allocated
506 1.40.10.2 rtr * to a stringlist). in either case, it shouldn't be used again.
507 1.40.10.2 rtr */
508 1.40.10.2 rtr static int
509 1.40.10.2 rtr in_find(StringList *sl, char *grp, const char *host, const char *user,
510 1.40.10.2 rtr const char *domain)
511 1.40.10.2 rtr {
512 1.40.10.2 rtr char *line, *p;
513 1.40.10.2 rtr int i;
514 1.40.10.2 rtr struct netgroup *ng;
515 1.40.10.2 rtr char *name;
516 1.40.10.2 rtr
517 1.40.10.2 rtr _DIAGASSERT(sl != NULL);
518 1.40.10.2 rtr _DIAGASSERT(grp != NULL);
519 1.40.10.2 rtr /* host may be NULL */
520 1.40.10.2 rtr /* user may be NULL */
521 1.40.10.2 rtr /* domain may be NULL */
522 1.40.10.2 rtr
523 1.40.10.2 rtr #ifdef DEBUG_NG
524 1.40.10.2 rtr (void)fprintf(stderr, "in_find(%s)\n", grp);
525 1.40.10.2 rtr #endif
526 1.40.10.2 rtr /* check for cycles */
527 1.40.10.2 rtr if (sl_find(sl, grp) != NULL) {
528 1.40.10.2 rtr _ng_cycle(grp, sl);
529 1.40.10.2 rtr free(grp);
530 1.40.10.2 rtr return 0;
531 1.40.10.2 rtr }
532 1.40.10.2 rtr if (sl_add(sl, grp) == -1) {
533 1.40.10.2 rtr free(grp);
534 1.40.10.2 rtr return 0;
535 1.40.10.2 rtr }
536 1.40.10.2 rtr
537 1.40.10.2 rtr /* Lookup this netgroup */
538 1.40.10.2 rtr line = NULL;
539 1.40.10.2 rtr if (!lookup(grp, &line, _NG_KEYBYNAME)) {
540 1.40.10.2 rtr if (line)
541 1.40.10.2 rtr free(line);
542 1.40.10.2 rtr return 0;
543 1.40.10.2 rtr }
544 1.40.10.2 rtr
545 1.40.10.2 rtr p = line;
546 1.40.10.2 rtr
547 1.40.10.2 rtr for (;;) {
548 1.40.10.2 rtr switch (_ng_parse(&p, &name, &ng)) {
549 1.40.10.2 rtr case _NG_NONE:
550 1.40.10.2 rtr /* Done with the line */
551 1.40.10.2 rtr free(line);
552 1.40.10.2 rtr return 0;
553 1.40.10.2 rtr
554 1.40.10.2 rtr case _NG_GROUP:
555 1.40.10.2 rtr /* new netgroup */
556 1.40.10.2 rtr i = in_check(host, user, domain, ng);
557 1.40.10.2 rtr if (ng->ng_host != NULL)
558 1.40.10.2 rtr free(ng->ng_host);
559 1.40.10.2 rtr if (ng->ng_user != NULL)
560 1.40.10.2 rtr free(ng->ng_user);
561 1.40.10.2 rtr if (ng->ng_domain != NULL)
562 1.40.10.2 rtr free(ng->ng_domain);
563 1.40.10.2 rtr free(ng);
564 1.40.10.2 rtr if (i) {
565 1.40.10.2 rtr free(line);
566 1.40.10.2 rtr return 1;
567 1.40.10.2 rtr }
568 1.40.10.2 rtr break;
569 1.40.10.2 rtr
570 1.40.10.2 rtr case _NG_NAME:
571 1.40.10.2 rtr /* netgroup name */
572 1.40.10.2 rtr if (in_find(sl, name, host, user, domain)) {
573 1.40.10.2 rtr free(line);
574 1.40.10.2 rtr return 1;
575 1.40.10.2 rtr }
576 1.40.10.2 rtr break;
577 1.40.10.2 rtr
578 1.40.10.2 rtr case _NG_ERROR:
579 1.40.10.2 rtr free(line);
580 1.40.10.2 rtr return 0;
581 1.40.10.2 rtr
582 1.40.10.2 rtr default:
583 1.40.10.2 rtr abort();
584 1.40.10.2 rtr }
585 1.40.10.2 rtr }
586 1.40.10.2 rtr }
587 1.40.10.2 rtr
588 1.40.10.2 rtr /*
589 1.40.10.2 rtr * _ng_makekey(): Make a key from the two names given. The key is of the form
590 1.40.10.2 rtr * <name1>.<name2> Names strings are replaced with * if they are empty;
591 1.40.10.2 rtr * Returns NULL if there's a problem.
592 1.40.10.2 rtr */
593 1.40.10.2 rtr char *
594 1.40.10.2 rtr _ng_makekey(const char *s1, const char *s2, size_t len)
595 1.40.10.2 rtr {
596 1.40.10.2 rtr char *buf;
597 1.40.10.2 rtr
598 1.40.10.2 rtr /* s1 may be NULL */
599 1.40.10.2 rtr /* s2 may be NULL */
600 1.40.10.2 rtr
601 1.40.10.2 rtr buf = malloc(len);
602 1.40.10.2 rtr if (buf != NULL)
603 1.40.10.2 rtr (void)snprintf(buf, len, "%s.%s", _NG_STAR(s1), _NG_STAR(s2));
604 1.40.10.2 rtr return buf;
605 1.40.10.2 rtr }
606 1.40.10.2 rtr
607 1.40.10.2 rtr void
608 1.40.10.2 rtr _ng_print(char *buf, size_t len, const struct netgroup *ng)
609 1.40.10.2 rtr {
610 1.40.10.2 rtr _DIAGASSERT(buf != NULL);
611 1.40.10.2 rtr _DIAGASSERT(ng != NULL);
612 1.40.10.2 rtr
613 1.40.10.2 rtr (void)snprintf(buf, len, "(%s,%s,%s)", _NG_EMPTY(ng->ng_host),
614 1.40.10.2 rtr _NG_EMPTY(ng->ng_user), _NG_EMPTY(ng->ng_domain));
615 1.40.10.2 rtr }
616 1.40.10.2 rtr
617 1.40.10.2 rtr
618 1.40.10.2 rtr /*
619 1.40.10.2 rtr * in_lookup1(): Fast lookup for a key in the appropriate map
620 1.40.10.2 rtr */
621 1.40.10.2 rtr static char *
622 1.40.10.2 rtr in_lookup1(const char *key, const char *domain, int map)
623 1.40.10.2 rtr {
624 1.40.10.2 rtr char *line;
625 1.40.10.2 rtr size_t len;
626 1.40.10.2 rtr char *ptr;
627 1.40.10.2 rtr int res;
628 1.40.10.2 rtr
629 1.40.10.2 rtr /* key may be NULL */
630 1.40.10.2 rtr /* domain may be NULL */
631 1.40.10.2 rtr
632 1.40.10.2 rtr len = (key ? strlen(key) : 1) + (domain ? strlen(domain) : 1) + 2;
633 1.40.10.2 rtr ptr = _ng_makekey(key, domain, len);
634 1.40.10.2 rtr if (ptr == NULL)
635 1.40.10.2 rtr return NULL;
636 1.40.10.2 rtr res = lookup(ptr, &line, map);
637 1.40.10.2 rtr free(ptr);
638 1.40.10.2 rtr return res ? line : NULL;
639 1.40.10.2 rtr }
640 1.40.10.2 rtr
641 1.40.10.2 rtr
642 1.40.10.2 rtr /*
643 1.40.10.2 rtr * in_lookup(): Fast lookup for a key in the appropriate map
644 1.40.10.2 rtr */
645 1.40.10.2 rtr static int
646 1.40.10.2 rtr in_lookup(const char *group, const char *key, const char *domain, int map)
647 1.40.10.2 rtr {
648 1.40.10.2 rtr size_t len;
649 1.40.10.2 rtr char *ptr, *line;
650 1.40.10.2 rtr
651 1.40.10.2 rtr _DIAGASSERT(group != NULL);
652 1.40.10.2 rtr /* key may be NULL */
653 1.40.10.2 rtr /* domain may be NULL */
654 1.40.10.2 rtr
655 1.40.10.2 rtr if (domain != NULL) {
656 1.40.10.2 rtr /* Domain specified; look in "group.domain" and "*.domain" */
657 1.40.10.2 rtr if ((line = in_lookup1(key, domain, map)) == NULL)
658 1.40.10.2 rtr line = in_lookup1(NULL, domain, map);
659 1.40.10.2 rtr } else
660 1.40.10.2 rtr line = NULL;
661 1.40.10.2 rtr
662 1.40.10.2 rtr if (line == NULL) {
663 1.40.10.2 rtr /*
664 1.40.10.2 rtr * domain not specified or domain lookup failed; look in
665 1.40.10.2 rtr * "group.*" and "*.*"
666 1.40.10.2 rtr */
667 1.40.10.2 rtr if (((line = in_lookup1(key, NULL, map)) == NULL) &&
668 1.40.10.2 rtr ((line = in_lookup1(NULL, NULL, map)) == NULL))
669 1.40.10.2 rtr return 0;
670 1.40.10.2 rtr }
671 1.40.10.2 rtr
672 1.40.10.2 rtr len = strlen(group);
673 1.40.10.2 rtr
674 1.40.10.2 rtr for (ptr = line; (ptr = strstr(ptr, group)) != NULL;)
675 1.40.10.2 rtr /* Make sure we did not find a substring */
676 1.40.10.2 rtr if ((ptr != line && ptr[-1] != ',') ||
677 1.40.10.2 rtr (ptr[len] != '\0' && strchr("\n\t ,", ptr[len]) == NULL))
678 1.40.10.2 rtr ptr++;
679 1.40.10.2 rtr else {
680 1.40.10.2 rtr free(line);
681 1.40.10.2 rtr return 1;
682 1.40.10.2 rtr }
683 1.40.10.2 rtr
684 1.40.10.2 rtr free(line);
685 1.40.10.2 rtr return 0;
686 1.40.10.2 rtr }
687 1.40.10.2 rtr
688 1.40.10.2 rtr /*ARGSUSED*/
689 1.40.10.2 rtr static int
690 1.40.10.2 rtr _local_endnetgrent(void *rv, void *cb_data, va_list ap)
691 1.40.10.2 rtr {
692 1.40.10.2 rtr for (_nglist = _nghead; _nglist != NULL; _nglist = _nghead) {
693 1.40.10.2 rtr _nghead = _nglist->ng_next;
694 1.40.10.2 rtr if (_nglist->ng_host != NULL)
695 1.40.10.2 rtr free(_nglist->ng_host);
696 1.40.10.2 rtr if (_nglist->ng_user != NULL)
697 1.40.10.2 rtr free(_nglist->ng_user);
698 1.40.10.2 rtr if (_nglist->ng_domain != NULL)
699 1.40.10.2 rtr free(_nglist->ng_domain);
700 1.40.10.2 rtr free(_nglist);
701 1.40.10.2 rtr }
702 1.40.10.2 rtr
703 1.40.10.2 rtr if (_ng_db) {
704 1.40.10.2 rtr (void)(*_ng_db->close)(_ng_db);
705 1.40.10.2 rtr _ng_db = NULL;
706 1.40.10.2 rtr }
707 1.40.10.2 rtr
708 1.40.10.2 rtr return NS_SUCCESS;
709 1.40.10.2 rtr }
710 1.40.10.2 rtr
711 1.40.10.2 rtr /*ARGSUSED*/
712 1.40.10.2 rtr static int
713 1.40.10.2 rtr _local_setnetgrent(void *rv, void *cb_data, va_list ap)
714 1.40.10.2 rtr {
715 1.40.10.2 rtr const char *ng = va_arg(ap, const char *);
716 1.40.10.2 rtr StringList *sl;
717 1.40.10.2 rtr char *ng_copy;
718 1.40.10.2 rtr
719 1.40.10.2 rtr _DIAGASSERT(ng != NULL);
720 1.40.10.2 rtr
721 1.40.10.2 rtr sl = sl_init();
722 1.40.10.2 rtr if (sl == NULL)
723 1.40.10.2 rtr return NS_TRYAGAIN;
724 1.40.10.2 rtr
725 1.40.10.2 rtr /* Cleanup any previous storage */
726 1.40.10.2 rtr if (_nghead != NULL)
727 1.40.10.2 rtr endnetgrent();
728 1.40.10.2 rtr
729 1.40.10.2 rtr if (_ng_db == NULL)
730 1.40.10.2 rtr _ng_db = dbopen(_PATH_NETGROUP_DB, O_RDONLY, 0, DB_HASH, NULL);
731 1.40.10.2 rtr
732 1.40.10.2 rtr ng_copy = strdup(ng);
733 1.40.10.2 rtr if (ng_copy != NULL)
734 1.40.10.2 rtr addgroup(sl, ng_copy);
735 1.40.10.2 rtr _nghead = _nglist;
736 1.40.10.2 rtr sl_free(sl, 1);
737 1.40.10.2 rtr
738 1.40.10.2 rtr return NS_SUCCESS;
739 1.40.10.2 rtr }
740 1.40.10.2 rtr
741 1.40.10.2 rtr /*ARGSUSED*/
742 1.40.10.2 rtr static int
743 1.40.10.2 rtr _local_getnetgrent(void *rv, void *cb_data, va_list ap)
744 1.40.10.2 rtr {
745 1.40.10.2 rtr int *retval = va_arg(ap, int *);
746 1.40.10.2 rtr const char **host = va_arg(ap, const char **);
747 1.40.10.2 rtr const char **user = va_arg(ap, const char **);
748 1.40.10.2 rtr const char **domain = va_arg(ap, const char **);
749 1.40.10.2 rtr
750 1.40.10.2 rtr _DIAGASSERT(host != NULL);
751 1.40.10.2 rtr _DIAGASSERT(user != NULL);
752 1.40.10.2 rtr _DIAGASSERT(domain != NULL);
753 1.40.10.2 rtr
754 1.40.10.2 rtr *retval = 0;
755 1.40.10.2 rtr
756 1.40.10.2 rtr if (_nglist == NULL)
757 1.40.10.2 rtr return NS_TRYAGAIN;
758 1.40.10.2 rtr
759 1.40.10.2 rtr *host = _nglist->ng_host;
760 1.40.10.2 rtr *user = _nglist->ng_user;
761 1.40.10.2 rtr *domain = _nglist->ng_domain;
762 1.40.10.2 rtr
763 1.40.10.2 rtr _nglist = _nglist->ng_next;
764 1.40.10.2 rtr
765 1.40.10.2 rtr *retval = 1;
766 1.40.10.2 rtr
767 1.40.10.2 rtr return NS_SUCCESS;
768 1.40.10.2 rtr }
769 1.40.10.2 rtr
770 1.40.10.2 rtr /*ARGSUSED*/
771 1.40.10.2 rtr static int
772 1.40.10.2 rtr _local_innetgr(void *rv, void *cb_data, va_list ap)
773 1.40.10.2 rtr {
774 1.40.10.2 rtr int *retval = va_arg(ap, int *);
775 1.40.10.2 rtr const char *grp = va_arg(ap, const char *);
776 1.40.10.2 rtr const char *host = va_arg(ap, const char *);
777 1.40.10.2 rtr const char *user = va_arg(ap, const char *);
778 1.40.10.2 rtr const char *domain = va_arg(ap, const char *);
779 1.40.10.2 rtr
780 1.40.10.2 rtr int found;
781 1.40.10.2 rtr StringList *sl;
782 1.40.10.2 rtr char *grcpy;
783 1.40.10.2 rtr
784 1.40.10.2 rtr _DIAGASSERT(grp != NULL);
785 1.40.10.2 rtr /* host may be NULL */
786 1.40.10.2 rtr /* user may be NULL */
787 1.40.10.2 rtr /* domain may be NULL */
788 1.40.10.2 rtr
789 1.40.10.2 rtr if (_ng_db == NULL)
790 1.40.10.2 rtr _ng_db = dbopen(_PATH_NETGROUP_DB, O_RDONLY, 0, DB_HASH, NULL);
791 1.40.10.2 rtr
792 1.40.10.2 rtr /* Try the fast lookup first */
793 1.40.10.2 rtr if (host != NULL && user == NULL) {
794 1.40.10.2 rtr if (in_lookup(grp, host, domain, _NG_KEYBYHOST)) {
795 1.40.10.2 rtr *retval = 1;
796 1.40.10.2 rtr return NS_SUCCESS;
797 1.40.10.2 rtr }
798 1.40.10.2 rtr } else if (host == NULL && user != NULL) {
799 1.40.10.2 rtr if (in_lookup(grp, user, domain, _NG_KEYBYUSER)) {
800 1.40.10.2 rtr *retval = 1;
801 1.40.10.2 rtr return NS_SUCCESS;
802 1.40.10.2 rtr }
803 1.40.10.2 rtr }
804 1.40.10.2 rtr /* If a domainname is given, we would have found a match */
805 1.40.10.2 rtr if (domain != NULL) {
806 1.40.10.2 rtr *retval = 0;
807 1.40.10.2 rtr return NS_SUCCESS;
808 1.40.10.2 rtr }
809 1.40.10.2 rtr
810 1.40.10.2 rtr /* Too bad need the slow recursive way */
811 1.40.10.2 rtr sl = sl_init();
812 1.40.10.2 rtr if (sl == NULL) {
813 1.40.10.2 rtr *retval = 0;
814 1.40.10.2 rtr return NS_SUCCESS;
815 1.40.10.2 rtr }
816 1.40.10.2 rtr if ((grcpy = strdup(grp)) == NULL) {
817 1.40.10.2 rtr sl_free(sl, 1);
818 1.40.10.2 rtr *retval = 0;
819 1.40.10.2 rtr return NS_SUCCESS;
820 1.40.10.2 rtr }
821 1.40.10.2 rtr found = in_find(sl, grcpy, host, user, domain);
822 1.40.10.2 rtr sl_free(sl, 1);
823 1.40.10.2 rtr
824 1.40.10.2 rtr *retval = found;
825 1.40.10.2 rtr return NS_SUCCESS;
826 1.40.10.2 rtr }
827 1.40.10.2 rtr
828 1.40.10.2 rtr #ifdef YP
829 1.40.10.2 rtr
830 1.40.10.2 rtr /*ARGSUSED*/
831 1.40.10.2 rtr static int
832 1.40.10.2 rtr _nis_endnetgrent(void *rv, void *cb_data, va_list ap)
833 1.40.10.2 rtr {
834 1.40.10.2 rtr return _local_endnetgrent(rv, cb_data, ap);
835 1.40.10.2 rtr }
836 1.40.10.2 rtr
837 1.40.10.2 rtr /*ARGSUSED*/
838 1.40.10.2 rtr static int
839 1.40.10.2 rtr _nis_setnetgrent(void *rv, void *cb_data, va_list ap)
840 1.40.10.2 rtr {
841 1.40.10.2 rtr return _local_setnetgrent(rv, cb_data, ap);
842 1.40.10.2 rtr }
843 1.40.10.2 rtr
844 1.40.10.2 rtr /*ARGSUSED*/
845 1.40.10.2 rtr static int
846 1.40.10.2 rtr _nis_getnetgrent(void *rv, void *cb_data, va_list ap)
847 1.40.10.2 rtr {
848 1.40.10.2 rtr return _local_getnetgrent(rv, cb_data, ap);
849 1.40.10.2 rtr }
850 1.40.10.2 rtr
851 1.40.10.2 rtr /*ARGSUSED*/
852 1.40.10.2 rtr static int
853 1.40.10.2 rtr _nis_innetgr(void *rv, void *cb_data, va_list ap)
854 1.40.10.2 rtr {
855 1.40.10.2 rtr return _local_innetgr(rv, cb_data, ap);
856 1.40.10.2 rtr }
857 1.40.10.2 rtr
858 1.40.10.2 rtr #endif
859 1.40.10.2 rtr
860 1.40.10.2 rtr
861 1.40.10.2 rtr #ifdef NSSRC_FILES
862 1.40.10.2 rtr void
863 1.40.10.2 rtr endnetgrent(void)
864 1.40.10.2 rtr {
865 1.40.10.2 rtr static const ns_dtab dtab[] = {
866 1.40.10.2 rtr NS_FILES_CB(_local_endnetgrent, NULL)
867 1.40.10.2 rtr NS_NIS_CB(_nis_endnetgrent, NULL)
868 1.40.10.2 rtr NS_NULL_CB
869 1.40.10.2 rtr };
870 1.40.10.2 rtr
871 1.40.10.2 rtr (void) nsdispatch(NULL, dtab, NSDB_NETGROUP, "endnetgrent",
872 1.40.10.2 rtr __nsdefaultcompat);
873 1.40.10.2 rtr }
874 1.40.10.2 rtr #else
875 1.40.10.2 rtr static int
876 1.40.10.2 rtr _local_endnetgrentv(int *rv, void *cbdata, ...)
877 1.40.10.2 rtr {
878 1.40.10.2 rtr int e;
879 1.40.10.2 rtr va_list ap;
880 1.40.10.2 rtr va_start(ap, cbdata);
881 1.40.10.2 rtr e = _local_endnetgrent(rv, cbdata, ap);
882 1.40.10.2 rtr va_end(ap);
883 1.40.10.2 rtr return e;
884 1.40.10.2 rtr }
885 1.40.10.2 rtr
886 1.40.10.2 rtr void
887 1.40.10.2 rtr endnetgrent(void)
888 1.40.10.2 rtr {
889 1.40.10.2 rtr (void)_local_endnetgrentv(NULL, NULL, NULL);
890 1.40.10.2 rtr }
891 1.40.10.2 rtr #endif
892 1.40.10.2 rtr
893 1.40.10.2 rtr #ifdef NSSRC_FILES
894 1.40.10.2 rtr void
895 1.40.10.2 rtr setnetgrent(const char *ng)
896 1.40.10.2 rtr {
897 1.40.10.2 rtr static const ns_dtab dtab[] = {
898 1.40.10.2 rtr NS_FILES_CB(_local_setnetgrent, NULL)
899 1.40.10.2 rtr NS_NIS_CB(_nis_setnetgrent, NULL)
900 1.40.10.2 rtr NS_NULL_CB
901 1.40.10.2 rtr };
902 1.40.10.2 rtr
903 1.40.10.2 rtr (void) nsdispatch(NULL, dtab, NSDB_NETGROUP, "setnetgrent",
904 1.40.10.2 rtr __nsdefaultnis, ng);
905 1.40.10.2 rtr }
906 1.40.10.2 rtr #else
907 1.40.10.2 rtr static int
908 1.40.10.2 rtr _local_setnetgrentv(int *rv, void *cbdata, ...)
909 1.40.10.2 rtr {
910 1.40.10.2 rtr int e;
911 1.40.10.2 rtr va_list ap;
912 1.40.10.2 rtr va_start(ap, cbdata);
913 1.40.10.2 rtr e = _local_setnetgrent(rv, cbdata, ap);
914 1.40.10.2 rtr va_end(ap);
915 1.40.10.2 rtr return e;
916 1.40.10.2 rtr }
917 1.40.10.2 rtr
918 1.40.10.2 rtr void
919 1.40.10.2 rtr setnetgrent(const char *ng)
920 1.40.10.2 rtr {
921 1.40.10.2 rtr (void) _local_setnetgrentv(NULL, NULL,ng);
922 1.40.10.2 rtr }
923 1.40.10.2 rtr
924 1.40.10.2 rtr #endif
925 1.40.10.2 rtr
926 1.40.10.2 rtr #ifdef NSSRC_FILES
927 1.40.10.2 rtr int
928 1.40.10.2 rtr getnetgrent(const char **host, const char **user, const char **domain)
929 1.40.10.2 rtr {
930 1.40.10.2 rtr int r, retval;
931 1.40.10.2 rtr static const ns_dtab dtab[] = {
932 1.40.10.2 rtr NS_FILES_CB(_local_getnetgrent, NULL)
933 1.40.10.2 rtr NS_NIS_CB(_nis_getnetgrent, NULL)
934 1.40.10.2 rtr NS_NULL_CB
935 1.40.10.2 rtr };
936 1.40.10.2 rtr
937 1.40.10.2 rtr r = nsdispatch(NULL, dtab, NSDB_NETGROUP, "getnetgrent",
938 1.40.10.2 rtr __nsdefaultnis, &retval, host, user, domain);
939 1.40.10.2 rtr
940 1.40.10.2 rtr return (r == NS_SUCCESS) ? retval : 0;
941 1.40.10.2 rtr }
942 1.40.10.2 rtr #else
943 1.40.10.2 rtr static int
944 1.40.10.2 rtr _local_getnetgrentv(int *rv, void *cbdata, ...)
945 1.40.10.2 rtr {
946 1.40.10.2 rtr int e;
947 1.40.10.2 rtr va_list ap;
948 1.40.10.2 rtr va_start(ap, cbdata);
949 1.40.10.2 rtr e = _local_getnetgrent(rv, cbdata, ap);
950 1.40.10.2 rtr va_end(ap);
951 1.40.10.2 rtr return e;
952 1.40.10.2 rtr }
953 1.40.10.2 rtr
954 1.40.10.2 rtr int
955 1.40.10.2 rtr getnetgrent(const char **host, const char **user, const char **domain)
956 1.40.10.2 rtr {
957 1.40.10.2 rtr return _local_getnetgrentv(NULL, NULL, host, user, domain) == NS_SUCCESS;
958 1.40.10.2 rtr }
959 1.40.10.2 rtr #endif
960 1.40.10.2 rtr
961 1.40.10.2 rtr #ifdef NSSRC_FILES
962 1.40.10.2 rtr int
963 1.40.10.2 rtr innetgr(const char *grp, const char *host, const char *user,
964 1.40.10.2 rtr const char *domain)
965 1.40.10.2 rtr {
966 1.40.10.2 rtr int r, retval;
967 1.40.10.2 rtr static const ns_dtab dtab[] = {
968 1.40.10.2 rtr NS_FILES_CB(_local_innetgr, NULL)
969 1.40.10.2 rtr NS_NIS_CB(_nis_innetgr, NULL)
970 1.40.10.2 rtr NS_NULL_CB
971 1.40.10.2 rtr };
972 1.40.10.2 rtr
973 1.40.10.2 rtr r = nsdispatch(NULL, dtab, NSDB_NETGROUP, "innetgr",
974 1.40.10.2 rtr __nsdefaultnis, &retval, grp, host, user, domain);
975 1.40.10.2 rtr
976 1.40.10.2 rtr return (r == NS_SUCCESS) ? retval : 0;
977 1.40.10.2 rtr }
978 1.40.10.2 rtr #else
979 1.40.10.2 rtr static int
980 1.40.10.2 rtr _local_innetgrv(int *rv, void *cbdata, ...)
981 1.40.10.2 rtr {
982 1.40.10.2 rtr int e;
983 1.40.10.2 rtr va_list ap;
984 1.40.10.2 rtr va_start(ap, cbdata);
985 1.40.10.2 rtr e = _local_innetgr(rv, cbdata, ap);
986 1.40.10.2 rtr va_end(ap);
987 1.40.10.2 rtr return e;
988 1.40.10.2 rtr }
989 1.40.10.2 rtr
990 1.40.10.2 rtr int
991 1.40.10.2 rtr innetgr(const char *grp, const char *host, const char *user,
992 1.40.10.2 rtr const char *domain)
993 1.40.10.2 rtr {
994 1.40.10.2 rtr return _local_innetgrv(NULL, NULL, grp, host, user, domain) == NS_SUCCESS;
995 1.40.10.2 rtr }
996 1.40.10.2 rtr #endif
997