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