Add BIND 9.2.4rc7.
[dragonfly.git] / contrib / bind-9.2.4rc7 / lib / bind / irs / irp_pw.c
blobef728e97d1aeb210ad5195fa876083d2ca0df0ff
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.2.2.1 2004/03/09 09:17:32 marka 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 */
110 * void pw_close(struct irs_pw *this)
114 static void
115 pw_close(struct irs_pw *this) {
116 struct pvt *pvt = (struct pvt *)this->private;
118 pw_minimize(this);
120 free_passwd(&pvt->passwd);
122 memput(pvt, sizeof *pvt);
123 memput(this, sizeof *this);
130 * struct passwd * pw_next(struct irs_pw *this)
134 static struct passwd *
135 pw_next(struct irs_pw *this) {
136 struct pvt *pvt = (struct pvt *)this->private;
137 struct passwd *pw = &pvt->passwd;
138 char *body;
139 size_t bodylen;
140 int code;
141 char text[256];
143 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
144 return (NULL);
147 if (irs_irp_send_command(pvt->girpdata, "getpwent") != 0) {
148 return (NULL);
151 if (irs_irp_get_full_response(pvt->girpdata, &code,
152 text, sizeof text,
153 &body, &bodylen) != 0) {
154 return (NULL);
157 if (code == IRPD_GETUSER_OK) {
158 free_passwd(pw);
159 if (irp_unmarshall_pw(pw, body) != 0) {
160 pw = NULL;
162 } else {
163 pw = NULL;
166 if (body != NULL) {
167 memput(body, bodylen);
170 return (pw);
177 * struct passwd * pw_byname(struct irs_pw *this, const char *name)
181 static struct passwd *
182 pw_byname(struct irs_pw *this, const char *name) {
183 struct pvt *pvt = (struct pvt *)this->private;
184 struct passwd *pw = &pvt->passwd;
185 char *body = NULL;
186 char text[256];
187 size_t bodylen;
188 int code;
190 if (pw->pw_name != NULL && strcmp(name, pw->pw_name) == 0) {
191 return (pw);
194 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
195 return (NULL);
198 if (irs_irp_send_command(pvt->girpdata, "getpwnam %s", name) != 0) {
199 return (NULL);
202 if (irs_irp_get_full_response(pvt->girpdata, &code,
203 text, sizeof text,
204 &body, &bodylen) != 0) {
205 return (NULL);
208 if (code == IRPD_GETUSER_OK) {
209 free_passwd(pw);
210 if (irp_unmarshall_pw(pw, body) != 0) {
211 pw = NULL;
213 } else {
214 pw = NULL;
217 if (body != NULL) {
218 memput(body, bodylen);
221 return (pw);
228 * struct passwd * pw_byuid(struct irs_pw *this, uid_t uid)
232 static struct passwd *
233 pw_byuid(struct irs_pw *this, uid_t uid) {
234 struct pvt *pvt = (struct pvt *)this->private;
235 char *body;
236 char text[256];
237 size_t bodylen;
238 int code;
239 struct passwd *pw = &pvt->passwd;
241 if (pw->pw_name != NULL && pw->pw_uid == uid) {
242 return (pw);
245 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
246 return (NULL);
249 if (irs_irp_send_command(pvt->girpdata, "getpwuid %d", uid) != 0) {
250 return (NULL);
253 if (irs_irp_get_full_response(pvt->girpdata, &code,
254 text, sizeof text,
255 &body, &bodylen) != 0) {
256 return (NULL);
259 if (code == IRPD_GETUSER_OK) {
260 free_passwd(pw);
261 if (irp_unmarshall_pw(pw, body) != 0) {
262 pw = NULL;
264 } else {
265 pw = NULL;
268 if (body != NULL) {
269 memput(body, bodylen);
272 return (pw);
279 * void pw_rewind(struct irs_pw *this)
283 static void
284 pw_rewind(struct irs_pw *this) {
285 struct pvt *pvt = (struct pvt *)this->private;
286 char text[256];
287 int code;
289 if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) {
290 return;
293 if (irs_irp_send_command(pvt->girpdata, "setpwent") != 0) {
294 return;
297 code = irs_irp_read_response(pvt->girpdata, text, sizeof text);
298 if (code != IRPD_GETUSER_SETOK) {
299 if (irp_log_errors) {
300 syslog(LOG_WARNING, "setpwent failed: %s", text);
304 return;
309 * void pw_minimize(struct irs_pw *this)
313 static void
314 pw_minimize(struct irs_pw *this) {
315 struct pvt *pvt = (struct pvt *)this->private;
317 irs_irp_disconnect(pvt->girpdata);
321 /* Private. */
326 * static void free_passwd(struct passwd *pw);
328 * Deallocate all the memory irp_unmarshall_pw allocated.
332 static void
333 free_passwd(struct passwd *pw) {
334 if (pw == NULL)
335 return;
337 if (pw->pw_name != NULL)
338 free(pw->pw_name);
340 if (pw->pw_passwd != NULL)
341 free(pw->pw_passwd);
343 #ifdef HAVE_PW_CLASS
344 if (pw->pw_class != NULL)
345 free(pw->pw_class);
346 #endif
348 if (pw->pw_gecos != NULL)
349 free(pw->pw_gecos);
351 if (pw->pw_dir != NULL)
352 free(pw->pw_dir);
354 if (pw->pw_shell != NULL)
355 free(pw->pw_shell);
358 #endif /* WANT_IRS_PW */