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