xref: /netbsd/external/bsd/libbind/dist/irs/getgrent.c (revision e6e30c83)
1*e6e30c83Schristos /*	$NetBSD: getgrent.c,v 1.1.1.2 2012/09/09 16:07:55 christos Exp $	*/
2b5677b36Schristos 
3b5677b36Schristos /*
4b5677b36Schristos  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
5b5677b36Schristos  * Copyright (c) 1996-1999 by Internet Software Consortium.
6b5677b36Schristos  *
7b5677b36Schristos  * Permission to use, copy, modify, and distribute this software for any
8b5677b36Schristos  * purpose with or without fee is hereby granted, provided that the above
9b5677b36Schristos  * copyright notice and this permission notice appear in all copies.
10b5677b36Schristos  *
11b5677b36Schristos  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
12b5677b36Schristos  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13b5677b36Schristos  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
14b5677b36Schristos  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15b5677b36Schristos  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16b5677b36Schristos  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17b5677b36Schristos  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18b5677b36Schristos  */
19b5677b36Schristos 
20b5677b36Schristos #if !defined(LINT) && !defined(CODECENTER)
21b5677b36Schristos static const char rcsid[] = "Id: getgrent.c,v 1.5 2005/04/27 04:56:24 sra Exp ";
22b5677b36Schristos #endif
23b5677b36Schristos 
24b5677b36Schristos /* Imports */
25b5677b36Schristos 
26b5677b36Schristos #include "port_before.h"
27b5677b36Schristos 
28b5677b36Schristos #if !defined(WANT_IRS_GR) || defined(__BIND_NOSTATIC)
29b5677b36Schristos static int __bind_irs_gr_unneeded;
30b5677b36Schristos #else
31b5677b36Schristos 
32b5677b36Schristos #include <sys/types.h>
33b5677b36Schristos 
34b5677b36Schristos #include <netinet/in.h>
35b5677b36Schristos #include <arpa/nameser.h>
36b5677b36Schristos 
37b5677b36Schristos #include <errno.h>
38b5677b36Schristos #include <grp.h>
39b5677b36Schristos #include <resolv.h>
40b5677b36Schristos #include <stdio.h>
41b5677b36Schristos #include <string.h>
42b5677b36Schristos #include <unistd.h>
43b5677b36Schristos 
44b5677b36Schristos #include <irs.h>
45b5677b36Schristos 
46b5677b36Schristos #include "port_after.h"
47b5677b36Schristos 
48b5677b36Schristos #include "irs_data.h"
49b5677b36Schristos 
50b5677b36Schristos /* Forward */
51b5677b36Schristos 
52b5677b36Schristos static struct net_data *init(void);
53b5677b36Schristos void			endgrent(void);
54b5677b36Schristos 
55b5677b36Schristos /* Public */
56b5677b36Schristos 
57b5677b36Schristos struct group *
getgrent()58b5677b36Schristos getgrent() {
59b5677b36Schristos 	struct net_data *net_data = init();
60b5677b36Schristos 
61b5677b36Schristos 	return (getgrent_p(net_data));
62b5677b36Schristos }
63b5677b36Schristos 
64b5677b36Schristos struct group *
getgrnam(const char * name)65b5677b36Schristos getgrnam(const char *name) {
66b5677b36Schristos 	struct net_data *net_data = init();
67b5677b36Schristos 
68b5677b36Schristos 	return (getgrnam_p(name, net_data));
69b5677b36Schristos }
70b5677b36Schristos 
71b5677b36Schristos struct group *
getgrgid(gid_t gid)72b5677b36Schristos getgrgid(gid_t gid) {
73b5677b36Schristos 	struct net_data *net_data = init();
74b5677b36Schristos 
75b5677b36Schristos 	return (getgrgid_p(gid, net_data));
76b5677b36Schristos }
77b5677b36Schristos 
78b5677b36Schristos int
setgroupent(int stayopen)79b5677b36Schristos setgroupent(int stayopen) {
80b5677b36Schristos 	struct net_data *net_data = init();
81b5677b36Schristos 
82b5677b36Schristos 	return (setgroupent_p(stayopen, net_data));
83b5677b36Schristos }
84b5677b36Schristos 
85b5677b36Schristos #ifdef SETGRENT_VOID
86b5677b36Schristos void
setgrent(void)87b5677b36Schristos setgrent(void) {
88b5677b36Schristos 	struct net_data *net_data = init();
89b5677b36Schristos 
90b5677b36Schristos 	setgrent_p(net_data);
91b5677b36Schristos }
92b5677b36Schristos #else
93b5677b36Schristos int
setgrent(void)94b5677b36Schristos setgrent(void) {
95b5677b36Schristos 	struct net_data *net_data = init();
96b5677b36Schristos 
97b5677b36Schristos 	return (setgrent_p(net_data));
98b5677b36Schristos }
99b5677b36Schristos #endif /* SETGRENT_VOID */
100b5677b36Schristos 
101b5677b36Schristos void
endgrent()102b5677b36Schristos endgrent() {
103b5677b36Schristos 	struct net_data *net_data = init();
104b5677b36Schristos 
105b5677b36Schristos 	endgrent_p(net_data);
106b5677b36Schristos }
107b5677b36Schristos 
108b5677b36Schristos int
getgrouplist(GETGROUPLIST_ARGS)109b5677b36Schristos getgrouplist(GETGROUPLIST_ARGS) {
110b5677b36Schristos 	struct net_data *net_data = init();
111b5677b36Schristos 
112b5677b36Schristos 	return (getgrouplist_p(name, basegid, groups, ngroups, net_data));
113b5677b36Schristos }
114b5677b36Schristos 
115b5677b36Schristos /* Shared private. */
116b5677b36Schristos 
117b5677b36Schristos struct group *
getgrent_p(struct net_data * net_data)118b5677b36Schristos getgrent_p(struct net_data *net_data) {
119b5677b36Schristos 	struct irs_gr *gr;
120b5677b36Schristos 
121b5677b36Schristos 	if (!net_data || !(gr = net_data->gr))
122b5677b36Schristos 		return (NULL);
123b5677b36Schristos 	net_data->gr_last = (*gr->next)(gr);
124b5677b36Schristos 	return (net_data->gr_last);
125b5677b36Schristos }
126b5677b36Schristos 
127b5677b36Schristos struct group *
getgrnam_p(const char * name,struct net_data * net_data)128b5677b36Schristos getgrnam_p(const char *name, struct net_data *net_data) {
129b5677b36Schristos 	struct irs_gr *gr;
130b5677b36Schristos 
131b5677b36Schristos 	if (!net_data || !(gr = net_data->gr))
132b5677b36Schristos 		return (NULL);
133b5677b36Schristos 	if (net_data->gr_stayopen && net_data->gr_last &&
134b5677b36Schristos 	    !strcmp(net_data->gr_last->gr_name, name))
135b5677b36Schristos 		return (net_data->gr_last);
136b5677b36Schristos 	net_data->gr_last = (*gr->byname)(gr, name);
137b5677b36Schristos 	if (!net_data->gr_stayopen)
138b5677b36Schristos 		endgrent();
139b5677b36Schristos 	return (net_data->gr_last);
140b5677b36Schristos }
141b5677b36Schristos 
142b5677b36Schristos struct group *
getgrgid_p(gid_t gid,struct net_data * net_data)143b5677b36Schristos getgrgid_p(gid_t gid, struct net_data *net_data) {
144b5677b36Schristos 	struct irs_gr *gr;
145b5677b36Schristos 
146b5677b36Schristos 	if (!net_data || !(gr = net_data->gr))
147b5677b36Schristos 		return (NULL);
148b5677b36Schristos 	if (net_data->gr_stayopen && net_data->gr_last &&
149b5677b36Schristos 	    (gid_t)net_data->gr_last->gr_gid == gid)
150b5677b36Schristos 		return (net_data->gr_last);
151b5677b36Schristos 	net_data->gr_last = (*gr->bygid)(gr, gid);
152b5677b36Schristos 	if (!net_data->gr_stayopen)
153b5677b36Schristos 		endgrent();
154b5677b36Schristos 	return (net_data->gr_last);
155b5677b36Schristos }
156b5677b36Schristos 
157b5677b36Schristos int
setgroupent_p(int stayopen,struct net_data * net_data)158b5677b36Schristos setgroupent_p(int stayopen, struct net_data *net_data) {
159b5677b36Schristos 	struct irs_gr *gr;
160b5677b36Schristos 
161b5677b36Schristos 	if (!net_data || !(gr = net_data->gr))
162b5677b36Schristos 		return (0);
163b5677b36Schristos 	(*gr->rewind)(gr);
164b5677b36Schristos 	net_data->gr_stayopen = (stayopen != 0);
165b5677b36Schristos 	if (stayopen == 0)
166b5677b36Schristos 		net_data_minimize(net_data);
167b5677b36Schristos 	return (1);
168b5677b36Schristos }
169b5677b36Schristos 
170b5677b36Schristos #ifdef SETGRENT_VOID
171b5677b36Schristos void
setgrent_p(struct net_data * net_data)172b5677b36Schristos setgrent_p(struct net_data *net_data) {
173b5677b36Schristos 	(void)setgroupent_p(0, net_data);
174b5677b36Schristos }
175b5677b36Schristos #else
176b5677b36Schristos int
setgrent_p(struct net_data * net_data)177b5677b36Schristos setgrent_p(struct net_data *net_data) {
178b5677b36Schristos 	return (setgroupent_p(0, net_data));
179b5677b36Schristos }
180b5677b36Schristos #endif /* SETGRENT_VOID */
181b5677b36Schristos 
182b5677b36Schristos void
endgrent_p(struct net_data * net_data)183b5677b36Schristos endgrent_p(struct net_data *net_data) {
184b5677b36Schristos 	struct irs_gr *gr;
185b5677b36Schristos 
186b5677b36Schristos 	if ((net_data != NULL) && ((gr = net_data->gr) != NULL))
187b5677b36Schristos 		(*gr->minimize)(gr);
188b5677b36Schristos }
189b5677b36Schristos 
190b5677b36Schristos int
getgrouplist_p(const char * name,gid_t basegid,gid_t * groups,int * ngroups,struct net_data * net_data)191b5677b36Schristos getgrouplist_p(const char *name, gid_t basegid, gid_t *groups, int *ngroups,
192b5677b36Schristos 	       struct net_data *net_data) {
193b5677b36Schristos 	struct irs_gr *gr;
194b5677b36Schristos 
195b5677b36Schristos 	if (!net_data || !(gr = net_data->gr)) {
196b5677b36Schristos 		*ngroups = 0;
197b5677b36Schristos 		return (-1);
198b5677b36Schristos 	}
199b5677b36Schristos 	return ((*gr->list)(gr, name, basegid, groups, ngroups));
200b5677b36Schristos }
201b5677b36Schristos 
202b5677b36Schristos /* Private */
203b5677b36Schristos 
204b5677b36Schristos static struct net_data *
init()205b5677b36Schristos init() {
206b5677b36Schristos 	struct net_data *net_data;
207b5677b36Schristos 
208b5677b36Schristos 	if (!(net_data = net_data_init(NULL)))
209b5677b36Schristos 		goto error;
210b5677b36Schristos 	if (!net_data->gr) {
211b5677b36Schristos 		net_data->gr = (*net_data->irs->gr_map)(net_data->irs);
212b5677b36Schristos 
213b5677b36Schristos 		if (!net_data->gr || !net_data->res) {
214b5677b36Schristos  error:
215b5677b36Schristos 			errno = EIO;
216b5677b36Schristos 			return (NULL);
217b5677b36Schristos 		}
218b5677b36Schristos 		(*net_data->gr->res_set)(net_data->gr, net_data->res,
219b5677b36Schristos 					 NULL);
220b5677b36Schristos 	}
221b5677b36Schristos 
222b5677b36Schristos 	return (net_data);
223b5677b36Schristos }
224b5677b36Schristos 
225b5677b36Schristos #endif /* WANT_IRS_GR */
226b5677b36Schristos /*! \file */
227