xref: /csrg-svn/lib/libc/gen/getpwnamuid.c (revision 17689)
1 /*	getpwnamuid.c	4.6	85/01/10	*/
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 	bcopy(cp, (char *)&passwd.pw_uid, sizeof (int));
34 	cp += sizeof (int);
35 	bcopy(cp, (char *)&passwd.pw_gid, sizeof (int));
36 	cp += sizeof (int);
37 	bcopy(cp, (char *)&passwd.pw_quota, sizeof (int));
38 	cp += sizeof (int);
39 	EXPAND(comment);
40 	EXPAND(gecos);
41 	EXPAND(dir);
42 	EXPAND(shell);
43         return (&passwd);
44 }
45 
46 struct passwd *
47 getpwnam(nam)
48 	char *nam;
49 {
50         datum key;
51 	register struct passwd *pw;
52 
53         if (_pw_db == (DBM *)0 &&
54 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
55 	oldcode:
56 		setpwent();
57 		while ((pw = getpwent()) && strcmp(nam, pw->pw_name));
58 		endpwent();
59 		return (pw);
60 	}
61 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
62 		dbm_close(_pw_db);
63 		_pw_db = (DBM *)0;
64 		goto oldcode;
65 	}
66         key.dptr = nam;
67         key.dsize = strlen(nam);
68 	pw = fetchpw(key);
69 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
70 	if (!_pw_stayopen) {
71 		dbm_close(_pw_db);
72 		_pw_db = (DBM *)0;
73 	}
74         return (pw);
75 }
76 
77 struct passwd *
78 getpwuid(uid)
79 	int uid;
80 {
81         datum key;
82 	register struct passwd *pw;
83 
84         if (_pw_db == (DBM *)0 &&
85 	    (_pw_db = dbm_open(PASSWD, O_RDONLY)) == (DBM *)0) {
86 	oldcode:
87 		setpwent();
88 		while ((pw = getpwent()) && pw->pw_uid != uid);
89 		endpwent();
90 		return (pw);
91 	}
92 	if (flock(_pw_db->dbm_dirf, LOCK_SH) < 0) {
93 		dbm_close(_pw_db);
94 		_pw_db = (DBM *)0;
95 		goto oldcode;
96 	}
97         key.dptr = (char *) &uid;
98         key.dsize = sizeof uid;
99 	pw = fetchpw(key);
100 	(void) flock(_pw_db->dbm_dirf, LOCK_UN);
101 	if (!_pw_stayopen) {
102 		dbm_close(_pw_db);
103 		_pw_db = (DBM *)0;
104 	}
105         return (pw);
106 }
107