1 /* getpwnamuid.c 4.6 85/01/10 */ 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 bcopy(cp, (char *)&passwd.pw_uid, sizeof (int)); 34 cp += sizeof (int); 35 bcopy(cp, (char *)&passwd.pw_gid, sizeof (int)); 36 cp += sizeof (int); 37 bcopy(cp, (char *)&passwd.pw_quota, sizeof (int)); 38 cp += sizeof (int); 39 EXPAND(comment); 40 EXPAND(gecos); 41 EXPAND(dir); 42 EXPAND(shell); 43 return (&passwd); 44 } 45 46 struct passwd * 47 getpwnam(nam) 48 char *nam; 49 { 50 datum key; 51 register struct passwd *pw; 52 53 if (_pw_db == (DBM *)0 && 54 (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) { 55 oldcode: 56 setpwent(); 57 while ((pw = getpwent()) && strcmp(nam, pw->pw_name)); 58 endpwent(); 59 return (pw); 60 } 61 if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) { 62 dbm_close(_pw_db); 63 _pw_db = (DBM *)0; 64 goto oldcode; 65 } 66 key.dptr = nam; 67 key.dsize = strlen(nam); 68 pw = fetchpw(key); 69 (void) flock(_pw_db->dbm_dirf, LOCK_UN); 70 if (!_pw_stayopen) { 71 dbm_close(_pw_db); 72 _pw_db = (DBM *)0; 73 } 74 return (pw); 75 } 76 77 struct passwd * 78 getpwuid(uid) 79 int uid; 80 { 81 datum key; 82 register struct passwd *pw; 83 84 if (_pw_db == (DBM *)0 && 85 (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) { 86 oldcode: 87 setpwent(); 88 while ((pw = getpwent()) && pw->pw_uid != uid); 89 endpwent(); 90 return (pw); 91 } 92 if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) { 93 dbm_close(_pw_db); 94 _pw_db = (DBM *)0; 95 goto oldcode; 96 } 97 key.dptr = (char *) &uid; 98 key.dsize = sizeof uid; 99 pw = fetchpw(key); 100 (void) flock(_pw_db->dbm_dirf, LOCK_UN); 101 if (!_pw_stayopen) { 102 dbm_close(_pw_db); 103 _pw_db = (DBM *)0; 104 } 105 return (pw); 106 } 107