xref: /csrg-svn/lib/libc/gen/getpwnamuid.c (revision 15911)
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