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