1 /* getpwnamuid.c 4.1 83/12/02 */ 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 datum curkey; 14 static DBM *db = 0; 15 16 static struct passwd * 17 fetchpw(key) 18 datum key; 19 { 20 register char *cp; 21 22 curkey = key; 23 if (curkey.dptr == 0) 24 return ((struct passwd *)NULL); 25 key = dbmfetch(db, curkey); 26 if (key.dptr == 0) 27 return ((struct passwd *)NULL); 28 cp = key.dptr; 29 30 #define EXPAND(e) passwd.pw_/**/e = cp; while (*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 ((db = ndbmopen(PASSWD, O_RDONLY)) == (DBM *)0) 51 return ((struct passwd *)NULL); 52 key.dptr = nam; 53 key.dsize = strlen(nam); 54 pw = fetchpw(key); 55 ndbmclose(db); 56 return (pw); 57 } 58 59 struct passwd * 60 getpwuid(uid) 61 int uid; 62 { 63 datum key; 64 register struct passwd *pw; 65 66 if ((db = ndbmopen(PASSWD, O_RDONLY)) == (DBM *)0) 67 return ((struct passwd *)NULL); 68 key.dptr = (char *) &uid; 69 key.dsize = sizeof uid; 70 pw = fetchpw(key); 71 ndbmclose(db); 72 return (pw); 73 } 74