Import bind 9.5.2 vendor sources.
[dragonfly.git] / contrib / bind-9.5.2 / lib / bind / irs / irp_pw.c
blob3722e5974d4c82adea0ad310edeec8258c4d5d4e
1 /*
2 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
3 * Portions Copyright (c) 1996 by Internet Software Consortium.
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
15 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #if defined(LIBC_SCCS) && !defined(lint)
19 static const char rcsid[] = "$Id: irp_pw.c,v 1.4 2005/04/27 04:56:29 sra Exp $";
20 #endif /* LIBC_SCCS and not lint */
22 /* Extern */
24 #include "port_before.h"
26 #ifndef WANT_IRS_PW
27 static int __bind_irs_pw_unneeded;
28 #else
30 #include <syslog.h>
31 #include <sys/param.h>
33 #include <db.h>
34 #include <errno.h>
35 #include <fcntl.h>
36 #include <limits.h>
37 #include <pwd.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <syslog.h>
41 #include <utmp.h>
42 #include <unistd.h>
44 #include <irs.h>
45 #include <irp.h>
46 #include <isc/memcluster.h>
47 #include <isc/irpmarshall.h>
49 #include "port_after.h"
51 #include "irs_p.h"
52 #include "irp_p.h"
55 /* Types */
57 struct pvt {
58 struct irp_p *girpdata; /*%< global IRP data */
59 int warned;
60 struct passwd passwd; /*%< password structure */
63 /* Forward */
65 static void pw_close(struct irs_pw *);
66 static struct passwd * pw_next(struct irs_pw *);
67 static struct passwd * pw_byname(struct irs_pw *, const char *);
68 static struct passwd * pw_byuid(struct irs_pw *, uid_t);
69 static void pw_rewind(struct irs_pw *);
70 static void pw_minimize(struct irs_pw *);
72 static void free_passwd(struct passwd *pw);
74 /* Public */
75 struct irs_pw *
76 irs_irp_pw(struct irs_acc *this) {
77 struct irs_pw *pw;
78 struct pvt *pvt;
80 if (!(pw = memget(sizeof *pw))) {
81 errno = ENOMEM;
82 return (NULL);
84 memset(pw, 0, sizeof *pw);
86 if (!(pvt = memget(sizeof *pvt))) {
87 memput(pw, sizeof *pw);
88 errno = ENOMEM;
89 return (NULL);
91 memset(pvt, 0, sizeof *pvt);
92 pvt->girpdata = this->private;
94 pw->private = pvt;
95 pw->close = pw_close;
96 pw->next = pw_next;
97 pw->byname = pw_byname;
98 pw->byuid = pw_byuid;
99 pw->rewind = pw_rewind;
100 pw->minimize = pw_minimize;
102 return (pw);
105 /* Methods */
108 * void pw_close(struct irs_pw *this)
112 static void
113 pw_close(struct irs_pw *this) {
114 struct pvt *pvt = (struct pvt *)this->private;
116 pw_minimize(this);
118 free_passwd(&pvt->passwd);
120 memput(pvt, sizeof *pvt);
121 memput(this, sizeof *this);
125 * struct passwd * pw_next(struct irs_pw *this)
129 static struct passwd *
130 pw_next(struct irs_pw *this) {
131 struct pvt *pvt = (struct pvt *)this->private;
132 struct passwd *pw = &pvt->passwd;
133 char *body;
134 size_t bodylen;
135 int code;
136 char text[256];
138 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
139 return (NULL);
142 if (irs_irp_send_command(pvt->girpdata, "getpwent") != 0) {
143 return (NULL);
146 if (irs_irp_get_full_response(pvt->girpdata, &code,
147 text, sizeof text,
148 &body, &bodylen) != 0) {
149 return (NULL);
152 if (code == IRPD_GETUSER_OK) {
153 free_passwd(pw);
154 if (irp_unmarshall_pw(pw, body) != 0) {
155 pw = NULL;
157 } else {
158 pw = NULL;
161 if (body != NULL) {
162 memput(body, bodylen);
165 return (pw);
169 * struct passwd * pw_byname(struct irs_pw *this, const char *name)
173 static struct passwd *
174 pw_byname(struct irs_pw *this, const char *name) {
175 struct pvt *pvt = (struct pvt *)this->private;
176 struct passwd *pw = &pvt->passwd;
177 char *body = NULL;
178 char text[256];
179 size_t bodylen;
180 int code;
182 if (pw->pw_name != NULL && strcmp(name, pw->pw_name) == 0) {
183 return (pw);
186 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
187 return (NULL);
190 if (irs_irp_send_command(pvt->girpdata, "getpwnam %s", name) != 0) {
191 return (NULL);
194 if (irs_irp_get_full_response(pvt->girpdata, &code,
195 text, sizeof text,
196 &body, &bodylen) != 0) {
197 return (NULL);
200 if (code == IRPD_GETUSER_OK) {
201 free_passwd(pw);
202 if (irp_unmarshall_pw(pw, body) != 0) {
203 pw = NULL;
205 } else {
206 pw = NULL;
209 if (body != NULL) {
210 memput(body, bodylen);
213 return (pw);
217 * struct passwd * pw_byuid(struct irs_pw *this, uid_t uid)
221 static struct passwd *
222 pw_byuid(struct irs_pw *this, uid_t uid) {
223 struct pvt *pvt = (struct pvt *)this->private;
224 char *body;
225 char text[256];
226 size_t bodylen;
227 int code;
228 struct passwd *pw = &pvt->passwd;
230 if (pw->pw_name != NULL && pw->pw_uid == uid) {
231 return (pw);
234 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
235 return (NULL);
238 if (irs_irp_send_command(pvt->girpdata, "getpwuid %d", uid) != 0) {
239 return (NULL);
242 if (irs_irp_get_full_response(pvt->girpdata, &code,
243 text, sizeof text,
244 &body, &bodylen) != 0) {
245 return (NULL);
248 if (code == IRPD_GETUSER_OK) {
249 free_passwd(pw);
250 if (irp_unmarshall_pw(pw, body) != 0) {
251 pw = NULL;
253 } else {
254 pw = NULL;
257 if (body != NULL) {
258 memput(body, bodylen);
261 return (pw);
265 * void pw_rewind(struct irs_pw *this)
269 static void
270 pw_rewind(struct irs_pw *this) {
271 struct pvt *pvt = (struct pvt *)this->private;
272 char text[256];
273 int code;
275 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
276 return;
279 if (irs_irp_send_command(pvt->girpdata, "setpwent") != 0) {
280 return;
283 code = irs_irp_read_response(pvt->girpdata, text, sizeof text);
284 if (code != IRPD_GETUSER_SETOK) {
285 if (irp_log_errors) {
286 syslog(LOG_WARNING, "setpwent failed: %s", text);
290 return;
294 * void pw_minimize(struct irs_pw *this)
298 static void
299 pw_minimize(struct irs_pw *this) {
300 struct pvt *pvt = (struct pvt *)this->private;
302 irs_irp_disconnect(pvt->girpdata);
306 /* Private. */
309 * Deallocate all the memory irp_unmarshall_pw allocated.
313 static void
314 free_passwd(struct passwd *pw) {
315 if (pw == NULL)
316 return;
318 if (pw->pw_name != NULL)
319 free(pw->pw_name);
321 if (pw->pw_passwd != NULL)
322 free(pw->pw_passwd);
324 #ifdef HAVE_PW_CLASS
325 if (pw->pw_class != NULL)
326 free(pw->pw_class);
327 #endif
329 if (pw->pw_gecos != NULL)
330 free(pw->pw_gecos);
332 if (pw->pw_dir != NULL)
333 free(pw->pw_dir);
335 if (pw->pw_shell != NULL)
336 free(pw->pw_shell);
339 #endif /* WANT_IRS_PW */
340 /*! \file */