summaryrefslogtreecommitdiff
path: root/contrib/bind/lib/irs/getpwent.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind/lib/irs/getpwent.c')
-rw-r--r--contrib/bind/lib/irs/getpwent.c160
1 files changed, 112 insertions, 48 deletions
diff --git a/contrib/bind/lib/irs/getpwent.c b/contrib/bind/lib/irs/getpwent.c
index 8e4d897ea74a..94f2df56c12f 100644
--- a/contrib/bind/lib/irs/getpwent.c
+++ b/contrib/bind/lib/irs/getpwent.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996 by Internet Software Consortium.
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -16,21 +16,25 @@
*/
#if !defined(LINT) && !defined(CODECENTER)
-static char rcsid[] = "$Id: getpwent.c,v 1.13 1998/03/21 00:59:48 halley Exp $";
+static const char rcsid[] = "$Id: getpwent.c,v 1.20 1999/10/13 16:39:31 vixie Exp $";
#endif
/* Imports */
#include "port_before.h"
-#ifndef WANT_IRS_PW
+#if !defined(WANT_IRS_PW) || defined(__BIND_NOSTATIC)
static int __bind_irs_pw_unneeded;
#else
#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+
#include <errno.h>
#include <pwd.h>
+#include <resolv.h>
#include <stdio.h>
#include <irs.h>
@@ -41,95 +45,155 @@ static int __bind_irs_pw_unneeded;
/* Forward */
-static struct irs_pw * init(void);
+static struct net_data * init(void);
/* Public */
struct passwd *
getpwent(void) {
- struct irs_pw *pw = init();
+ struct net_data *net_data = init();
- if (!pw)
- return (NULL);
- net_data.pw_last = (*pw->next)(pw);
- return (net_data.pw_last);
+ return (getpwent_p(net_data));
}
struct passwd *
getpwnam(const char *name) {
- struct irs_pw *pw = init();
-
- if (!pw)
+ struct net_data *net_data = init();
+
+ return (getpwnam_p(name, net_data));
+}
+
+struct passwd *
+getpwuid(uid_t uid) {
+ struct net_data *net_data = init();
+
+ return (getpwuid_p(uid, net_data));
+}
+
+int
+setpassent(int stayopen) {
+ struct net_data *net_data = init();
+
+ return (setpassent_p(stayopen, net_data));
+}
+
+#ifdef SETPWENT_VOID
+void
+setpwent() {
+ struct net_data *net_data = init();
+
+ setpwent_p(net_data);
+}
+#else
+int
+setpwent() {
+ struct net_data *net_data = init();
+
+ return (setpwent_p(net_data));
+}
+#endif
+
+void
+endpwent() {
+ struct net_data *net_data = init();
+
+ return (endpwent_p(net_data));
+}
+
+/* Shared private. */
+
+struct passwd *
+getpwent_p(struct net_data *net_data) {
+ struct irs_pw *pw;
+
+ if (!net_data || !(pw = net_data->pw))
+ return (NULL);
+ net_data->pw_last = (*pw->next)(pw);
+ return (net_data->pw_last);
+}
+
+struct passwd *
+getpwnam_p(const char *name, struct net_data *net_data) {
+ struct irs_pw *pw;
+
+ if (!net_data || !(pw = net_data->pw))
return (NULL);
- if (net_data.pw_stayopen && net_data.pw_last &&
- !strcmp(net_data.pw_last->pw_name, name))
- return (net_data.pw_last);
- net_data.pw_last = (*pw->byname)(pw, name);
- if (!net_data.pw_stayopen)
+ if (net_data->pw_stayopen && net_data->pw_last &&
+ !strcmp(net_data->pw_last->pw_name, name))
+ return (net_data->pw_last);
+ net_data->pw_last = (*pw->byname)(pw, name);
+ if (!net_data->pw_stayopen)
endpwent();
- return (net_data.pw_last);
+ return (net_data->pw_last);
}
struct passwd *
-getpwuid(uid_t uid) {
- struct irs_pw *pw = init();
+getpwuid_p(uid_t uid, struct net_data *net_data) {
+ struct irs_pw *pw;
- if (!pw)
+ if (!net_data || !(pw = net_data->pw))
return (NULL);
- if (net_data.pw_stayopen && net_data.pw_last &&
- net_data.pw_last->pw_uid == uid)
- return (net_data.pw_last);
- net_data.pw_last = (*pw->byuid)(pw, uid);
- if (!net_data.pw_stayopen)
+ if (net_data->pw_stayopen && net_data->pw_last &&
+ net_data->pw_last->pw_uid == uid)
+ return (net_data->pw_last);
+ net_data->pw_last = (*pw->byuid)(pw, uid);
+ if (!net_data->pw_stayopen)
endpwent();
- return (net_data.pw_last);
+ return (net_data->pw_last);
}
int
-setpassent(int stayopen) {
- struct irs_pw *pw = init();
-
- if (!pw)
+setpassent_p(int stayopen, struct net_data *net_data) {
+ struct irs_pw *pw;
+
+ if (!net_data || !(pw = net_data->pw))
return (0);
(*pw->rewind)(pw);
- net_data.pw_stayopen = (stayopen != 0);
+ net_data->pw_stayopen = (stayopen != 0);
+ if (stayopen == 0)
+ net_data_minimize(net_data);
return (1);
}
#ifdef SETPWENT_VOID
void
-setpwent() {
- (void) setpassent(0);
+setpwent_p(struct net_data *net_data) {
+ (void) setpassent_p(0, net_data);
}
#else
-int
-setpwent() {
- return (setpassent(0));
+int
+setpwent_p(struct net_data *net_data) {
+ return (setpassent_p(0, net_data));
}
#endif
void
-endpwent() {
- struct irs_pw *pw = init();
+endpwent_p(struct net_data *net_data) {
+ struct irs_pw *pw;
- if (pw != NULL)
+ if ((net_data != NULL) && ((pw = net_data->pw) != NULL))
(*pw->minimize)(pw);
}
/* Private */
-static struct irs_pw *
+static struct net_data *
init() {
- if (!net_data_init())
+ struct net_data *net_data;
+ if (!(net_data = net_data_init(NULL)))
goto error;
- if (!net_data.pw)
- net_data.pw = (*net_data.irs->pw_map)(net_data.irs);
- if (!net_data.pw) {
+ if (!net_data->pw) {
+ net_data->pw = (*net_data->irs->pw_map)(net_data->irs);
+
+ if (!net_data->pw || !net_data->res) {
error:
- errno = EIO;
- return (NULL);
+ errno = EIO;
+ return (NULL);
+ }
+ (*net_data->pw->res_set)(net_data->pw, net_data->res, NULL);
}
- return (net_data.pw);
+
+ return (net_data);
}
#endif /* WANT_IRS_PW */