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