1 /* getpwnamuid.c 4.3 84/01/31 */ 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 static DBM *db = 0; 14 15 static struct passwd * 16 fetchpw(key) 17 datum key; 18 { 19 register char *cp, *tp; 20 21 if (key.dptr == 0) 22 return ((struct passwd *)NULL); 23 key = dbmfetch(db, key); 24 if (key.dptr == 0) 25 return ((struct passwd *)NULL); 26 cp = key.dptr; 27 tp = line; 28 29 #define EXPAND(e) passwd.pw_/**/e = tp; while (*tp++ = *cp++); 30 EXPAND(name); 31 EXPAND(passwd); 32 passwd.pw_uid = *(int *)cp; cp += sizeof (int); 33 passwd.pw_gid = *(int *)cp; cp += sizeof (int); 34 passwd.pw_quota = *(int *)cp; cp += sizeof (int); 35 EXPAND(comment); 36 EXPAND(gecos); 37 EXPAND(dir); 38 EXPAND(shell); 39 return (&passwd); 40 } 41 42 struct passwd * 43 getpwnam(nam) 44 char *nam; 45 { 46 datum key; 47 register struct passwd *pw; 48 49 if ((db = ndbmopen(PASSWD, O_RDONLY)) == (DBM *)0) 50 return ((struct passwd *)NULL); 51 if (flock(db->db_dirf, LOCK_SH) < 0) 52 return ((struct passwd *)NULL); 53 key.dptr = nam; 54 key.dsize = strlen(nam); 55 pw = fetchpw(key); 56 ndbmclose(db); 57 return (pw); 58 } 59 60 struct passwd * 61 getpwuid(uid) 62 int uid; 63 { 64 datum key; 65 register struct passwd *pw; 66 67 if ((db = ndbmopen(PASSWD, O_RDONLY)) == (DBM *)0) 68 return ((struct passwd *)NULL); 69 if (flock(db->db_dirf, LOCK_SH) < 0) 70 return ((struct passwd *)NULL); 71 key.dptr = (char *) &uid; 72 key.dsize = sizeof uid; 73 pw = fetchpw(key); 74 ndbmclose(db); 75 return (pw); 76 } 77