]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bind/lib/irs/getpwent.c
unfinished sblive driver, playback/mixer only for now - not enabled in
[FreeBSD/FreeBSD.git] / contrib / bind / lib / irs / getpwent.c
1 /*
2  * Copyright (c) 1996,1999 by Internet Software Consortium.
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
9  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
10  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
11  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
13  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
14  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
15  * SOFTWARE.
16  */
17
18 #if !defined(LINT) && !defined(CODECENTER)
19 static const char rcsid[] = "$Id: getpwent.c,v 1.20 1999/10/13 16:39:31 vixie Exp $";
20 #endif
21
22 /* Imports */
23
24 #include "port_before.h"
25
26 #if !defined(WANT_IRS_PW) || defined(__BIND_NOSTATIC)
27 static int __bind_irs_pw_unneeded;
28 #else
29
30 #include <sys/types.h>
31
32 #include <netinet/in.h>
33 #include <arpa/nameser.h>
34
35 #include <errno.h>
36 #include <pwd.h>
37 #include <resolv.h>
38 #include <stdio.h>
39
40 #include <irs.h>
41
42 #include "port_after.h"
43
44 #include "irs_data.h"
45
46 /* Forward */
47
48 static struct net_data * init(void);
49
50 /* Public */
51
52 struct passwd *
53 getpwent(void) {
54         struct net_data *net_data = init();
55
56         return (getpwent_p(net_data));
57 }
58
59 struct passwd *
60 getpwnam(const char *name) {
61         struct net_data *net_data = init();
62
63         return (getpwnam_p(name, net_data));
64 }
65
66 struct passwd *
67 getpwuid(uid_t uid) {
68         struct net_data *net_data = init();
69
70         return (getpwuid_p(uid, net_data));
71 }
72
73 int
74 setpassent(int stayopen) {
75         struct net_data *net_data = init();
76
77         return (setpassent_p(stayopen, net_data));
78 }
79
80 #ifdef SETPWENT_VOID
81 void
82 setpwent() {
83         struct net_data *net_data = init();
84
85         setpwent_p(net_data);
86 }
87 #else
88 int
89 setpwent() {
90         struct net_data *net_data = init();
91
92         return (setpwent_p(net_data));
93 }
94 #endif
95
96 void
97 endpwent() {
98         struct net_data *net_data = init();
99
100         return (endpwent_p(net_data));
101 }
102
103 /* Shared private. */
104
105 struct passwd *
106 getpwent_p(struct net_data *net_data) {
107         struct irs_pw *pw;
108
109         if (!net_data || !(pw = net_data->pw))
110                 return (NULL);
111         net_data->pw_last = (*pw->next)(pw);
112         return (net_data->pw_last);
113 }
114
115 struct passwd *
116 getpwnam_p(const char *name, struct net_data *net_data) {
117         struct irs_pw *pw;
118
119         if (!net_data || !(pw = net_data->pw))
120                 return (NULL);
121         if (net_data->pw_stayopen && net_data->pw_last &&
122             !strcmp(net_data->pw_last->pw_name, name))
123                 return (net_data->pw_last);
124         net_data->pw_last = (*pw->byname)(pw, name);
125         if (!net_data->pw_stayopen)
126                 endpwent();
127         return (net_data->pw_last);
128 }
129
130 struct passwd *
131 getpwuid_p(uid_t uid, struct net_data *net_data) {
132         struct irs_pw *pw;
133
134         if (!net_data || !(pw = net_data->pw))
135                 return (NULL);
136         if (net_data->pw_stayopen && net_data->pw_last &&
137             net_data->pw_last->pw_uid == uid)
138                 return (net_data->pw_last);
139         net_data->pw_last = (*pw->byuid)(pw, uid);
140         if (!net_data->pw_stayopen)
141                 endpwent();
142         return (net_data->pw_last);
143 }
144
145 int
146 setpassent_p(int stayopen, struct net_data *net_data) {
147         struct irs_pw *pw;
148
149         if (!net_data || !(pw = net_data->pw))
150                 return (0);
151         (*pw->rewind)(pw);
152         net_data->pw_stayopen = (stayopen != 0);
153         if (stayopen == 0)
154                 net_data_minimize(net_data);
155         return (1);
156 }
157
158 #ifdef SETPWENT_VOID
159 void
160 setpwent_p(struct net_data *net_data) {
161         (void) setpassent_p(0, net_data);
162 }
163 #else
164 int
165 setpwent_p(struct net_data *net_data) {
166         return (setpassent_p(0, net_data));
167 }
168 #endif
169
170 void
171 endpwent_p(struct net_data *net_data) {
172         struct irs_pw *pw;
173
174         if ((net_data != NULL) && ((pw = net_data->pw) != NULL))
175                 (*pw->minimize)(pw);
176 }
177
178 /* Private */
179
180 static struct net_data *
181 init() {
182         struct net_data *net_data;
183         if (!(net_data = net_data_init(NULL)))
184                 goto error;
185         if (!net_data->pw) {
186                 net_data->pw = (*net_data->irs->pw_map)(net_data->irs);
187
188                 if (!net_data->pw || !net_data->res) {
189  error: 
190                         errno = EIO;
191                         return (NULL);
192                 }
193                 (*net_data->pw->res_set)(net_data->pw, net_data->res, NULL);
194         }
195         
196         return (net_data);
197 }
198
199 #endif /* WANT_IRS_PW */