xref: /csrg-svn/lib/libc/gen/getpwnamuid.c (revision 15751)
1 /*	getpwnamuid.c	4.2	83/12/20	*/
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 	if (flock(db->db_dirf, LOCK_SH) < 0)
53                 return ((struct passwd *)NULL);
54         key.dptr = nam;
55         key.dsize = strlen(nam);
56 	pw = fetchpw(key);
57 	ndbmclose(db);
58         return (pw);
59 }
60 
61 struct passwd *
62 getpwuid(uid)
63 	int uid;
64 {
65         datum key;
66 	register struct passwd *pw;
67 
68         if ((db = ndbmopen(PASSWD, O_RDONLY)) == (DBM *)0)
69                 return ((struct passwd *)NULL);
70 	if (flock(db->db_dirf, LOCK_SH) < 0)
71                 return ((struct passwd *)NULL);
72         key.dptr = (char *) &uid;
73         key.dsize = sizeof uid;
74 	pw = fetchpw(key);
75 	ndbmclose(db);
76         return (pw);
77 }
78