xref: /csrg-svn/lib/libc/gen/getpwnamuid.c (revision 17689)
1*17689Sralph /*	getpwnamuid.c	4.6	85/01/10	*/
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;
1317030Sralph DBM *_pw_db;
1417030Sralph 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);
2417030Sralph 	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);
33*17689Sralph 	bcopy(cp, (char *)&passwd.pw_uid, sizeof (int));
34*17689Sralph 	cp += sizeof (int);
35*17689Sralph 	bcopy(cp, (char *)&passwd.pw_gid, sizeof (int));
36*17689Sralph 	cp += sizeof (int);
37*17689Sralph 	bcopy(cp, (char *)&passwd.pw_quota, sizeof (int));
38*17689Sralph 	cp += sizeof (int);
3915645Sralph 	EXPAND(comment);
4015645Sralph 	EXPAND(gecos);
4115645Sralph 	EXPAND(dir);
4215645Sralph 	EXPAND(shell);
4315645Sralph         return (&passwd);
4415645Sralph }
4515645Sralph 
4615645Sralph struct passwd *
4715645Sralph getpwnam(nam)
4815645Sralph 	char *nam;
4915645Sralph {
5015645Sralph         datum key;
5115645Sralph 	register struct passwd *pw;
5215645Sralph 
5316416Sralph         if (_pw_db == (DBM *)0 &&
5417030Sralph 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
5516416Sralph 	oldcode:
5616416Sralph 		setpwent();
5716416Sralph 		while ((pw = getpwent()) && strcmp(nam, pw->pw_name));
5816416Sralph 		endpwent();
5916416Sralph 		return (pw);
6016416Sralph 	}
6117030Sralph 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
6217030Sralph 		dbm_close(_pw_db);
6316416Sralph 		_pw_db = (DBM *)0;
6416416Sralph 		goto oldcode;
6516416Sralph 	}
6615645Sralph         key.dptr = nam;
6715645Sralph         key.dsize = strlen(nam);
6815645Sralph 	pw = fetchpw(key);
6917030Sralph 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
7016416Sralph 	if (!_pw_stayopen) {
7117030Sralph 		dbm_close(_pw_db);
7216416Sralph 		_pw_db = (DBM *)0;
7316416Sralph 	}
7415645Sralph         return (pw);
7515645Sralph }
7615645Sralph 
7715645Sralph struct passwd *
7815645Sralph getpwuid(uid)
7915645Sralph 	int uid;
8015645Sralph {
8115645Sralph         datum key;
8215645Sralph 	register struct passwd *pw;
8315645Sralph 
8416416Sralph         if (_pw_db == (DBM *)0 &&
8517030Sralph 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
8616416Sralph 	oldcode:
8716416Sralph 		setpwent();
8816416Sralph 		while ((pw = getpwent()) && pw->pw_uid != uid);
8916416Sralph 		endpwent();
9016416Sralph 		return (pw);
9116416Sralph 	}
9217030Sralph 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
9317030Sralph 		dbm_close(_pw_db);
9416416Sralph 		_pw_db = (DBM *)0;
9516416Sralph 		goto oldcode;
9616416Sralph 	}
9715645Sralph         key.dptr = (char *) &uid;
9815645Sralph         key.dsize = sizeof uid;
9915645Sralph 	pw = fetchpw(key);
10017030Sralph 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
10116416Sralph 	if (!_pw_stayopen) {
10217030Sralph 		dbm_close(_pw_db);
10316416Sralph 		_pw_db = (DBM *)0;
10416416Sralph 	}
10515645Sralph         return (pw);
10615645Sralph }
107