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