1*15911Sralph /* getpwnamuid.c 4.3 84/01/31 */ 215645Sralph 315645Sralph #include <stdio.h> 415645Sralph #include <pwd.h> 515645Sralph #include <ndbm.h> 615645Sralph 715645Sralph #include <sys/file.h> 815645Sralph 915645Sralph static char PASSWD[] = "/etc/passwd"; 1015645Sralph static char EMPTY[] = ""; 1115645Sralph static char line[BUFSIZ+1]; 1215645Sralph static struct passwd passwd; 1315645Sralph static DBM *db = 0; 1415645Sralph 1515645Sralph static struct passwd * 1615645Sralph fetchpw(key) 1715645Sralph datum key; 1815645Sralph { 19*15911Sralph register char *cp, *tp; 2015645Sralph 21*15911Sralph if (key.dptr == 0) 2215645Sralph return ((struct passwd *)NULL); 23*15911Sralph key = dbmfetch(db, key); 2415645Sralph if (key.dptr == 0) 2515645Sralph return ((struct passwd *)NULL); 2615645Sralph cp = key.dptr; 27*15911Sralph tp = line; 2815645Sralph 29*15911Sralph #define EXPAND(e) passwd.pw_/**/e = tp; while (*tp++ = *cp++); 3015645Sralph EXPAND(name); 3115645Sralph EXPAND(passwd); 3215645Sralph passwd.pw_uid = *(int *)cp; cp += sizeof (int); 3315645Sralph passwd.pw_gid = *(int *)cp; cp += sizeof (int); 3415645Sralph passwd.pw_quota = *(int *)cp; cp += sizeof (int); 3515645Sralph EXPAND(comment); 3615645Sralph EXPAND(gecos); 3715645Sralph EXPAND(dir); 3815645Sralph EXPAND(shell); 3915645Sralph return (&passwd); 4015645Sralph } 4115645Sralph 4215645Sralph struct passwd * 4315645Sralph getpwnam(nam) 4415645Sralph char *nam; 4515645Sralph { 4615645Sralph datum key; 4715645Sralph register struct passwd *pw; 4815645Sralph 4915645Sralph if ((db = ndbmopen(PASSWD, O_RDONLY)) == (DBM *)0) 5015645Sralph return ((struct passwd *)NULL); 5115751Sralph if (flock(db->db_dirf, LOCK_SH) < 0) 5215751Sralph return ((struct passwd *)NULL); 5315645Sralph key.dptr = nam; 5415645Sralph key.dsize = strlen(nam); 5515645Sralph pw = fetchpw(key); 5615645Sralph ndbmclose(db); 5715645Sralph return (pw); 5815645Sralph } 5915645Sralph 6015645Sralph struct passwd * 6115645Sralph getpwuid(uid) 6215645Sralph int uid; 6315645Sralph { 6415645Sralph datum key; 6515645Sralph register struct passwd *pw; 6615645Sralph 6715645Sralph if ((db = ndbmopen(PASSWD, O_RDONLY)) == (DBM *)0) 6815645Sralph return ((struct passwd *)NULL); 6915751Sralph if (flock(db->db_dirf, LOCK_SH) < 0) 7015751Sralph return ((struct passwd *)NULL); 7115645Sralph key.dptr = (char *) &uid; 7215645Sralph key.dsize = sizeof uid; 7315645Sralph pw = fetchpw(key); 7415645Sralph ndbmclose(db); 7515645Sralph return (pw); 7615645Sralph } 77