1 /* getpwnamuid.c 4.5 84/08/28 */ 2 3 #include <stdio.h> 4 #include <pwd.h> 5 #include <ndbm.h> 6 7 #include <sys/file.h> 8 9 static char PASSWD[] = "/etc/passwd"; 10 static char EMPTY[] = ""; 11 static char line[BUFSIZ+1]; 12 static struct passwd passwd; 13 DBM *_pw_db; 14 int _pw_stayopen; 15 16 static struct passwd * 17 fetchpw(key) 18 datum key; 19 { 20 register char *cp, *tp; 21 22 if (key.dptr == 0) 23 return ((struct passwd *)NULL); 24 key = dbm_fetch(_pw_db, key); 25 if (key.dptr == 0) 26 return ((struct passwd *)NULL); 27 cp = key.dptr; 28 tp = line; 29 30 #define EXPAND(e) passwd.pw_/**/e = tp; while (*tp++ = *cp++); 31 EXPAND(name); 32 EXPAND(passwd); 33 passwd.pw_uid = *(int *)cp; cp += sizeof (int); 34 passwd.pw_gid = *(int *)cp; cp += sizeof (int); 35 passwd.pw_quota = *(int *)cp; cp += sizeof (int); 36 EXPAND(comment); 37 EXPAND(gecos); 38 EXPAND(dir); 39 EXPAND(shell); 40 return (&passwd); 41 } 42 43 struct passwd * 44 getpwnam(nam) 45 char *nam; 46 { 47 datum key; 48 register struct passwd *pw; 49 50 if (_pw_db == (DBM *)0 && 51 (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) { 52 oldcode: 53 setpwent(); 54 while ((pw = getpwent()) && strcmp(nam, pw->pw_name)); 55 endpwent(); 56 return (pw); 57 } 58 if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) { 59 dbm_close(_pw_db); 60 _pw_db = (DBM *)0; 61 goto oldcode; 62 } 63 key.dptr = nam; 64 key.dsize = strlen(nam); 65 pw = fetchpw(key); 66 (void) flock(_pw_db->dbm_dirf, LOCK_UN); 67 if (!_pw_stayopen) { 68 dbm_close(_pw_db); 69 _pw_db = (DBM *)0; 70 } 71 return (pw); 72 } 73 74 struct passwd * 75 getpwuid(uid) 76 int uid; 77 { 78 datum key; 79 register struct passwd *pw; 80 81 if (_pw_db == (DBM *)0 && 82 (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) { 83 oldcode: 84 setpwent(); 85 while ((pw = getpwent()) && pw->pw_uid != uid); 86 endpwent(); 87 return (pw); 88 } 89 if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) { 90 dbm_close(_pw_db); 91 _pw_db = (DBM *)0; 92 goto oldcode; 93 } 94 key.dptr = (char *) &uid; 95 key.dsize = sizeof uid; 96 pw = fetchpw(key); 97 (void) flock(_pw_db->dbm_dirf, LOCK_UN); 98 if (!_pw_stayopen) { 99 dbm_close(_pw_db); 100 _pw_db = (DBM *)0; 101 } 102 return (pw); 103 } 104