xref: /csrg-svn/lib/libc/gen/getpwnamuid.c (revision 17030)
1 /*	getpwnamuid.c	4.5	84/08/28	*/
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 DBM *_pw_db;
14 int _pw_stayopen;
15 
16 static struct passwd *
17 fetchpw(key)
18 	datum key;
19 {
20         register char *cp, *tp;
21 
22         if (key.dptr == 0)
23                 return ((struct passwd *)NULL);
24 	key = dbm_fetch(_pw_db, key);
25 	if (key.dptr == 0)
26                 return ((struct passwd *)NULL);
27         cp = key.dptr;
28 	tp = line;
29 
30 #define	EXPAND(e)	passwd.pw_/**/e = tp; while (*tp++ = *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 (_pw_db == (DBM *)0 &&
51 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
52 	oldcode:
53 		setpwent();
54 		while ((pw = getpwent()) && strcmp(nam, pw->pw_name));
55 		endpwent();
56 		return (pw);
57 	}
58 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
59 		dbm_close(_pw_db);
60 		_pw_db = (DBM *)0;
61 		goto oldcode;
62 	}
63         key.dptr = nam;
64         key.dsize = strlen(nam);
65 	pw = fetchpw(key);
66 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
67 	if (!_pw_stayopen) {
68 		dbm_close(_pw_db);
69 		_pw_db = (DBM *)0;
70 	}
71         return (pw);
72 }
73 
74 struct passwd *
75 getpwuid(uid)
76 	int uid;
77 {
78         datum key;
79 	register struct passwd *pw;
80 
81         if (_pw_db == (DBM *)0 &&
82 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
83 	oldcode:
84 		setpwent();
85 		while ((pw = getpwent()) && pw->pw_uid != uid);
86 		endpwent();
87 		return (pw);
88 	}
89 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
90 		dbm_close(_pw_db);
91 		_pw_db = (DBM *)0;
92 		goto oldcode;
93 	}
94         key.dptr = (char *) &uid;
95         key.dsize = sizeof uid;
96 	pw = fetchpw(key);
97 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
98 	if (!_pw_stayopen) {
99 		dbm_close(_pw_db);
100 		_pw_db = (DBM *)0;
101 	}
102         return (pw);
103 }
104