Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-4]: src/lib/libc/gen pullup 1.41->1.43 (lukem)
details: https://anonhg.NetBSD.org/src/rev/60a2f2401964
branches: netbsd-1-4
changeset: 468512:60a2f2401964
user: perry <perry%NetBSD.org@localhost>
date: Tue Apr 27 14:11:10 1999 +0000
description:
pullup 1.41->1.43 (lukem)
diffstat:
lib/libc/gen/getpwent.c | 111 ++++++++++++++++++++++++-----------------------
1 files changed, 56 insertions(+), 55 deletions(-)
diffs (truncated from 321 to 300 lines):
diff -r 36a046eae814 -r 60a2f2401964 lib/libc/gen/getpwent.c
--- a/lib/libc/gen/getpwent.c Tue Apr 27 14:10:58 1999 +0000
+++ b/lib/libc/gen/getpwent.c Tue Apr 27 14:11:10 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: getpwent.c,v 1.40 1999/01/26 01:08:06 lukem Exp $ */
+/* $NetBSD: getpwent.c,v 1.40.2.1 1999/04/27 14:11:10 perry Exp $ */
/*
* Copyright (c) 1988, 1993
@@ -39,7 +39,7 @@
#if 0
static char sccsid[] = "@(#)getpwent.c 8.2 (Berkeley) 4/27/95";
#else
-__RCSID("$NetBSD: getpwent.c,v 1.40 1999/01/26 01:08:06 lukem Exp $");
+__RCSID("$NetBSD: getpwent.c,v 1.40.2.1 1999/04/27 14:11:10 perry Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -91,10 +91,9 @@
static struct passwd _pw_passwd; /* password structure */
static DB *_pw_db; /* password database */
-static int _pw_keynum; /* key counter */
+static int _pw_keynum; /* key counter. no more records if -1 */
static int _pw_stayopen; /* keep fd's open */
static int _pw_flags; /* password flags */
-static int _pw_none; /* true if getpwent got EOF */
static int __hashpw __P((DBT *));
static int __initdb __P((void));
@@ -108,10 +107,11 @@
#ifdef YP
static char *__ypcurrent, *__ypdomain;
static int __ypcurrentlen;
+static int _pw_ypdone; /* non-zero if no more yp records */
#endif
#ifdef HESIOD
-static int _pw_hesnum;
+static int _pw_hesnum; /* hes counter. no more records if -1 */
#endif
#ifdef _PASSWD_COMPAT
@@ -318,7 +318,8 @@
}
/*
- * parse an old-style passwd file line (from NIS or HESIOD)
+ * parse a passwd file line (from NIS or HESIOD).
+ * assumed to be `old-style' if maptype != YPMAP_MASTER.
*/
static int
__pwparse(pw, s)
@@ -399,6 +400,8 @@
bf[0] = search;
switch (search) {
case _PW_KEYBYNUM:
+ if (_pw_keynum == -1)
+ return NS_NOTFOUND; /* no more local records */
++_pw_keynum;
memmove(bf + 1, &_pw_keynum, sizeof(_pw_keynum));
key.size = sizeof(_pw_keynum) + 1;
@@ -420,10 +423,8 @@
key.data = (u_char *)bf;
rval = __hashpw(&key);
- if (rval == NS_NOTFOUND && search == _PW_KEYBYNUM) {
- _pw_none = 1;
- rval = NS_SUCCESS;
- }
+ if (rval == NS_NOTFOUND && search == _PW_KEYBYNUM)
+ _pw_keynum = -1; /* flag `no more local records' */
if (!_pw_stayopen && (search != _PW_KEYBYNUM)) {
(void)(_pw_db->close)(_pw_db);
@@ -450,14 +451,17 @@
uid_t uid;
int search;
- char *map;
+ const char *map;
char **hp;
void *context;
int r;
search = va_arg(ap, int);
+ nextdnsbynum:
switch (search) {
case _PW_KEYBYNUM:
+ if (_pw_hesnum == -1)
+ return NS_NOTFOUND; /* no more hesiod records */
snprintf(line, sizeof(line) - 1, "passwd-%u", _pw_hesnum);
_pw_hesnum++;
map = "passwd";
@@ -484,12 +488,10 @@
hp = hesiod_resolve(context, line, map);
if (hp == NULL) {
if (errno == ENOENT) {
- if (search == _PW_KEYBYNUM) {
- _pw_hesnum = 0;
- _pw_none = 1;
- r = NS_SUCCESS;
- } else
- r = NS_NOTFOUND;
+ /* flag `no more hesiod records' */
+ if (search == _PW_KEYBYNUM)
+ _pw_hesnum = -1;
+ r = NS_NOTFOUND;
}
goto cleanup_dns_getpw;
}
@@ -497,9 +499,11 @@
strncpy(line, hp[0], sizeof(line)); /* only check first elem */
line[sizeof(line) - 1] = '\0';
hesiod_free_list(context, hp);
- if (__pwparse(&_pw_passwd, line))
+ if (__pwparse(&_pw_passwd, line)) {
+ if (search == _PW_KEYBYNUM)
+ goto nextdnsbynum; /* skip dogdy entries */
r = NS_UNAVAIL;
- else
+ } else
r = NS_SUCCESS;
cleanup_dns_getpw:
hesiod_end(context);
@@ -525,14 +529,15 @@
uid_t uid;
int search;
char *key, *data;
- char *map = PASSWD_BYNAME;
- int keylen, datalen, r;
+ const char *map;
+ int keylen, datalen, r, rval;
if(__ypdomain == NULL) {
if(_yp_check(&__ypdomain) == 0)
return NS_UNAVAIL;
}
+ map = PASSWD_BYNAME;
search = va_arg(ap, int);
switch (search) {
case _PW_KEYBYNUM:
@@ -550,24 +555,17 @@
abort();
}
line[sizeof(line) - 1] = '\0';
+ rval = NS_UNAVAIL;
if (search != _PW_KEYBYNUM) {
data = NULL;
r = yp_match(__ypdomain, map, line, (int)strlen(line),
&data, &datalen);
- switch (r) {
- case 0:
- break;
- case YPERR_KEY:
- r = NS_NOTFOUND;
- break;
- default:
- r = NS_UNAVAIL;
- break;
- }
+ if (r == YPERR_KEY)
+ rval = NS_NOTFOUND;
if (r != 0) {
if (data)
free(data);
- return r;
+ return (rval);
}
data[datalen] = '\0'; /* clear trailing \n */
strncpy(line, data, sizeof(line));
@@ -578,6 +576,8 @@
return NS_SUCCESS;
}
+ if (_pw_ypdone)
+ return NS_NOTFOUND;
for (;;) {
data = key = NULL;
if (__ypcurrent) {
@@ -592,26 +592,20 @@
break;
case YPERR_NOMORE:
__ypcurrent = NULL;
- _pw_none = 1;
- if (key)
- free(key);
- return NS_SUCCESS;
- default:
- r = NS_UNAVAIL;
- break;
+ /* flag `no more yp records' */
+ _pw_ypdone = 1;
+ rval = NS_NOTFOUND;
}
} else {
- r = 0;
- if (yp_first(__ypdomain, map, &__ypcurrent,
- &__ypcurrentlen, &data, &datalen))
- r = NS_UNAVAIL;
+ r = yp_first(__ypdomain, map, &__ypcurrent,
+ &__ypcurrentlen, &data, &datalen);
}
if (r != 0) {
if (key)
free(key);
if (data)
free(data);
- return r;
+ return (rval);
}
data[datalen] = '\0'; /* clear trailing \n */
strncpy(line, data, sizeof(line));
@@ -738,7 +732,7 @@
#ifdef _PASSWD_COMPAT
static char *name = NULL;
const char *user, *host, *dom;
- int has_compatpw;
+ int has_compatpw, rval;
#endif
if (!_pw_db && !__initdb())
@@ -792,12 +786,17 @@
}
#endif
+ if (_pw_keynum == -1)
+ return NS_NOTFOUND; /* no more local records */
++_pw_keynum;
bf[0] = _PW_KEYBYNUM;
memmove(bf + 1, &_pw_keynum, sizeof(_pw_keynum));
key.data = (u_char *)bf;
key.size = sizeof(_pw_keynum) + 1;
- if(__hashpw(&key) == NS_SUCCESS) {
+ rval = __hashpw(&key);
+ if (rval == NS_NOTFOUND)
+ _pw_keynum = -1; /* flag `no more local records' */
+ else if (rval == NS_SUCCESS) {
#ifdef _PASSWD_COMPAT
/* if we don't have YP at all, don't bother. */
if (has_compatpw) {
@@ -841,9 +840,8 @@
}
}
#endif
- return NS_SUCCESS;
}
- return NS_NOTFOUND;
+ return (rval);
}
/*
@@ -860,9 +858,9 @@
{
#ifdef _PASSWD_COMPAT
DBT key;
- int search, rval, r, s;
+ int search, rval, r, s, keynum;
uid_t uid;
- char bf[MAXLOGNAME + 1];
+ char bf[sizeof(keynum) + 1];
const char *name, *host, *user, *dom;
#endif
@@ -893,11 +891,11 @@
abort();
}
- for(s = -1, _pw_keynum=1; _pw_keynum; _pw_keynum++) {
+ for (s = -1, keynum = 1 ; ; keynum++) {
bf[0] = _PW_KEYBYNUM;
- memmove(bf + 1, &_pw_keynum, sizeof(_pw_keynum));
+ memmove(bf + 1, &keynum, sizeof(keynum));
key.data = (u_char *)bf;
- key.size = sizeof(_pw_keynum) + 1;
+ key.size = sizeof(keynum) + 1;
if(__hashpw(&key) != NS_SUCCESS)
break;
switch(_pw_passwd.pw_name[0]) {
@@ -913,10 +911,12 @@
break;
case '@':
pwnam_netgrp:
+#if 0 /* XXX: is this a hangover from pre-nsswitch? */
if(__ypcurrent) {
free(__ypcurrent);
__ypcurrent = NULL;
}
+#endif
if (s == -1) /* first time */
setnetgrent(_pw_passwd.pw_name + 2);
s = getnetgrent(&host, &user, &dom);
@@ -1011,10 +1011,9 @@
{ 0 }
};
- _pw_none = 0;
r = nsdispatch(NULL, dtab, NSDB_PASSWD, "getpwent", compatsrc,
_PW_KEYBYNUM);
Home |
Main Index |
Thread Index |
Old Index