xref: /csrg-svn/lib/libc/gen/getpwnamuid.c (revision 17030)
1*17030Sralph /*	getpwnamuid.c	4.5	84/08/28	*/
215645Sralph 
315645Sralph #include <stdio.h>
415645Sralph #include <pwd.h>
515645Sralph #include <ndbm.h>
615645Sralph 
715645Sralph #include <sys/file.h>
815645Sralph 
915645Sralph static char PASSWD[] = "/etc/passwd";
1015645Sralph static char EMPTY[] = "";
1115645Sralph static char line[BUFSIZ+1];
1215645Sralph static struct passwd passwd;
13*17030Sralph DBM *_pw_db;
14*17030Sralph int _pw_stayopen;
1515645Sralph 
1615645Sralph static struct passwd *
1715645Sralph fetchpw(key)
1815645Sralph 	datum key;
1915645Sralph {
2015911Sralph         register char *cp, *tp;
2115645Sralph 
2215911Sralph         if (key.dptr == 0)
2315645Sralph                 return ((struct passwd *)NULL);
24*17030Sralph 	key = dbm_fetch(_pw_db, key);
2515645Sralph 	if (key.dptr == 0)
2615645Sralph                 return ((struct passwd *)NULL);
2715645Sralph         cp = key.dptr;
2815911Sralph 	tp = line;
2915645Sralph 
3015911Sralph #define	EXPAND(e)	passwd.pw_/**/e = tp; while (*tp++ = *cp++);
3115645Sralph 	EXPAND(name);
3215645Sralph 	EXPAND(passwd);
3315645Sralph 	passwd.pw_uid = *(int *)cp; cp += sizeof (int);
3415645Sralph 	passwd.pw_gid = *(int *)cp; cp += sizeof (int);
3515645Sralph 	passwd.pw_quota = *(int *)cp; cp += sizeof (int);
3615645Sralph 	EXPAND(comment);
3715645Sralph 	EXPAND(gecos);
3815645Sralph 	EXPAND(dir);
3915645Sralph 	EXPAND(shell);
4015645Sralph         return (&passwd);
4115645Sralph }
4215645Sralph 
4315645Sralph struct passwd *
4415645Sralph getpwnam(nam)
4515645Sralph 	char *nam;
4615645Sralph {
4715645Sralph         datum key;
4815645Sralph 	register struct passwd *pw;
4915645Sralph 
5016416Sralph         if (_pw_db == (DBM *)0 &&
51*17030Sralph 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
5216416Sralph 	oldcode:
5316416Sralph 		setpwent();
5416416Sralph 		while ((pw = getpwent()) && strcmp(nam, pw->pw_name));
5516416Sralph 		endpwent();
5616416Sralph 		return (pw);
5716416Sralph 	}
58*17030Sralph 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
59*17030Sralph 		dbm_close(_pw_db);
6016416Sralph 		_pw_db = (DBM *)0;
6116416Sralph 		goto oldcode;
6216416Sralph 	}
6315645Sralph         key.dptr = nam;
6415645Sralph         key.dsize = strlen(nam);
6515645Sralph 	pw = fetchpw(key);
66*17030Sralph 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
6716416Sralph 	if (!_pw_stayopen) {
68*17030Sralph 		dbm_close(_pw_db);
6916416Sralph 		_pw_db = (DBM *)0;
7016416Sralph 	}
7115645Sralph         return (pw);
7215645Sralph }
7315645Sralph 
7415645Sralph struct passwd *
7515645Sralph getpwuid(uid)
7615645Sralph 	int uid;
7715645Sralph {
7815645Sralph         datum key;
7915645Sralph 	register struct passwd *pw;
8015645Sralph 
8116416Sralph         if (_pw_db == (DBM *)0 &&
82*17030Sralph 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
8316416Sralph 	oldcode:
8416416Sralph 		setpwent();
8516416Sralph 		while ((pw = getpwent()) && pw->pw_uid != uid);
8616416Sralph 		endpwent();
8716416Sralph 		return (pw);
8816416Sralph 	}
89*17030Sralph 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
90*17030Sralph 		dbm_close(_pw_db);
9116416Sralph 		_pw_db = (DBM *)0;
9216416Sralph 		goto oldcode;
9316416Sralph 	}
9415645Sralph         key.dptr = (char *) &uid;
9515645Sralph         key.dsize = sizeof uid;
9615645Sralph 	pw = fetchpw(key);
97*17030Sralph 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
9816416Sralph 	if (!_pw_stayopen) {
99*17030Sralph 		dbm_close(_pw_db);
10016416Sralph 		_pw_db = (DBM *)0;
10116416Sralph 	}
10215645Sralph         return (pw);
10315645Sralph }
104