xref: /csrg-svn/lib/libc/gen/getpwent.c (revision 46949)
122095Smckusick /*
236215Sbostic  * Copyright (c) 1988 The Regents of the University of California.
336215Sbostic  * All rights reserved.
436215Sbostic  *
542624Sbostic  * %sccs.include.redist.c%
622095Smckusick  */
722095Smckusick 
826560Sdonn #if defined(LIBC_SCCS) && !defined(lint)
9*46949Sbostic static char sccsid[] = "@(#)getpwent.c	5.19 (Berkeley) 03/03/91";
1036215Sbostic #endif /* LIBC_SCCS and not lint */
1122095Smckusick 
1246376Sbostic #include <sys/param.h>
1346376Sbostic #include <fcntl.h>
14*46949Sbostic #include <db.h>
152019Swnj #include <pwd.h>
1646615Sbostic #include <utmp.h>
1746615Sbostic #include <errno.h>
1846376Sbostic #include <unistd.h>
1946615Sbostic #include <stdlib.h>
2046615Sbostic #include <string.h>
2146376Sbostic #include <limits.h>
222019Swnj 
2346376Sbostic static struct passwd _pw_passwd;	/* password structure */
24*46949Sbostic static DB *_pw_db;			/* password database */
2546376Sbostic static int _pw_keynum;			/* key counter */
2646376Sbostic static int _pw_stayopen;		/* keep fd's open */
2746615Sbostic static int __hashpw(), __initdb();
282019Swnj 
2936855Sbostic struct passwd *
3036855Sbostic getpwent()
3136855Sbostic {
32*46949Sbostic 	DBT key;
3346376Sbostic 	char bf[sizeof(_pw_keynum) + 1];
3436855Sbostic 
3546376Sbostic 	if (!_pw_db && !__initdb())
3636855Sbostic 		return((struct passwd *)NULL);
3746376Sbostic 
3846376Sbostic 	++_pw_keynum;
3946376Sbostic 	bf[0] = _PW_KEYBYNUM;
4046376Sbostic 	bcopy((char *)&_pw_keynum, bf + 1, sizeof(_pw_keynum));
41*46949Sbostic 	key.data = (u_char *)bf;
42*46949Sbostic 	key.size = sizeof(_pw_keynum) + 1;
43*46949Sbostic 	return(__hashpw(&key) ? &_pw_passwd : (struct passwd *)NULL);
4436855Sbostic }
4536855Sbostic 
4636855Sbostic struct passwd *
4746376Sbostic getpwnam(name)
4846615Sbostic 	const char *name;
4936855Sbostic {
50*46949Sbostic 	DBT key;
5146376Sbostic 	int len, rval;
5246376Sbostic 	char bf[UT_NAMESIZE + 1];
5336855Sbostic 
5446376Sbostic 	if (!_pw_db && !__initdb())
5536855Sbostic 		return((struct passwd *)NULL);
5636855Sbostic 
5746376Sbostic 	bf[0] = _PW_KEYBYNAME;
5846376Sbostic 	len = strlen(name);
5946376Sbostic 	bcopy(name, bf + 1, MIN(len, UT_NAMESIZE));
60*46949Sbostic 	key.data = (u_char *)bf;
61*46949Sbostic 	key.size = len + 1;
62*46949Sbostic 	rval = __hashpw(&key);
6346376Sbostic 
6446659Sbostic 	if (!_pw_stayopen) {
65*46949Sbostic 		(void)(_pw_db->close)(_pw_db);
66*46949Sbostic 		_pw_db = (DB *)NULL;
6746376Sbostic 	}
6836855Sbostic 	return(rval ? &_pw_passwd : (struct passwd *)NULL);
6936855Sbostic }
7036855Sbostic 
7136855Sbostic struct passwd *
7246615Sbostic #ifdef __STDC__
7346615Sbostic getpwuid(uid_t uid)
7446615Sbostic #else
7536855Sbostic getpwuid(uid)
7636855Sbostic 	int uid;
7746615Sbostic #endif
7836855Sbostic {
79*46949Sbostic 	DBT key;
8046659Sbostic 	int keyuid, rval;
8146660Sbostic 	char bf[sizeof(keyuid) + 1];
8236855Sbostic 
8346376Sbostic 	if (!_pw_db && !__initdb())
8436855Sbostic 		return((struct passwd *)NULL);
8536855Sbostic 
8646376Sbostic 	bf[0] = _PW_KEYBYUID;
8746659Sbostic 	keyuid = uid;
8846659Sbostic 	bcopy(&keyuid, bf + 1, sizeof(keyuid));
89*46949Sbostic 	key.data = (u_char *)bf;
90*46949Sbostic 	key.size = sizeof(keyuid) + 1;
91*46949Sbostic 	rval = __hashpw(&key);
9236855Sbostic 
9346659Sbostic 	if (!_pw_stayopen) {
94*46949Sbostic 		(void)(_pw_db->close)(_pw_db);
95*46949Sbostic 		_pw_db = (DB *)NULL;
9636855Sbostic 	}
9746376Sbostic 	return(rval ? &_pw_passwd : (struct passwd *)NULL);
9836855Sbostic }
9936855Sbostic 
10046615Sbostic int
10136855Sbostic setpassent(stayopen)
10236855Sbostic 	int stayopen;
10336855Sbostic {
10446376Sbostic 	_pw_keynum = 0;
10536855Sbostic 	_pw_stayopen = stayopen;
10636855Sbostic 	return(1);
10736855Sbostic }
10836855Sbostic 
10946615Sbostic int
11046376Sbostic setpwent()
11146376Sbostic {
11246376Sbostic 	_pw_keynum = 0;
11346376Sbostic 	_pw_stayopen = 0;
11446376Sbostic 	return(1);
11546376Sbostic }
11646376Sbostic 
11736855Sbostic void
11836855Sbostic endpwent()
11936855Sbostic {
12046376Sbostic 	_pw_keynum = 0;
12136855Sbostic 	if (_pw_db) {
122*46949Sbostic 		(void)(_pw_db->close)(_pw_db);
123*46949Sbostic 		_pw_db = (DB *)NULL;
12441572Sedward 	}
12536855Sbostic }
12636855Sbostic 
12736855Sbostic static
12846376Sbostic __initdb()
12936855Sbostic {
13046376Sbostic 	static int warned;
13146376Sbostic 	char *p;
13236215Sbostic 
13346659Sbostic 	p = (geteuid()) ? _PATH_MP_DB : _PATH_SMP_DB;
134*46949Sbostic 	_pw_db = hash_open(p, O_RDONLY, 0, NULL);
135*46949Sbostic 	if (_pw_db)
13636855Sbostic 		return(1);
13746376Sbostic 	if (!warned) {
13846615Sbostic 		(void)write(STDERR_FILENO, "getpwent: ", 10);
13946615Sbostic 		(void)write(STDERR_FILENO, p, strlen(p));
14046615Sbostic 		(void)write(STDERR_FILENO, ": ", 2);
14146615Sbostic 		p = strerror(errno);
14246615Sbostic 		(void)write(STDERR_FILENO, p, strlen(p));
14346615Sbostic 		(void)write(STDERR_FILENO, "\n", 1);
14446376Sbostic 		warned = 1;
14536215Sbostic 	}
14646376Sbostic 	return(0);
1472019Swnj }
1482019Swnj 
14936215Sbostic static
15046376Sbostic __hashpw(key)
151*46949Sbostic 	DBT *key;
1522019Swnj {
15336855Sbostic 	register char *p, *t;
15446376Sbostic 	static u_int max;
15546376Sbostic 	static char *line;
156*46949Sbostic 	DBT data;
15736215Sbostic 
158*46949Sbostic 	if ((_pw_db->get)(_pw_db, key, &data, 0))
15936215Sbostic 		return(0);
160*46949Sbostic 	p = (char *)data.data;
161*46949Sbostic 	if (data.size > max && !(line = realloc(line, max += 1024)))
16236215Sbostic 		return(0);
16346376Sbostic 
16436855Sbostic 	t = line;
16536855Sbostic #define	EXPAND(e)	e = t; while (*t++ = *p++);
16636855Sbostic 	EXPAND(_pw_passwd.pw_name);
16736855Sbostic 	EXPAND(_pw_passwd.pw_passwd);
16836855Sbostic 	bcopy(p, (char *)&_pw_passwd.pw_uid, sizeof(int));
16936855Sbostic 	p += sizeof(int);
17036855Sbostic 	bcopy(p, (char *)&_pw_passwd.pw_gid, sizeof(int));
17136855Sbostic 	p += sizeof(int);
17236855Sbostic 	bcopy(p, (char *)&_pw_passwd.pw_change, sizeof(time_t));
17336855Sbostic 	p += sizeof(time_t);
17436855Sbostic 	EXPAND(_pw_passwd.pw_class);
17536855Sbostic 	EXPAND(_pw_passwd.pw_gecos);
17636855Sbostic 	EXPAND(_pw_passwd.pw_dir);
17736855Sbostic 	EXPAND(_pw_passwd.pw_shell);
17836855Sbostic 	bcopy(p, (char *)&_pw_passwd.pw_expire, sizeof(time_t));
17936855Sbostic 	p += sizeof(time_t);
18036215Sbostic 	return(1);
1812019Swnj }
182