xref: /csrg-svn/lib/libc/gen/getpwnamuid.c (revision 17921)
1 /*	getpwnamuid.c	4.7	85/02/04	*/
2 
3 #include <stdio.h>
4 #include <pwd.h>
5 #include <ndbm.h>
6 
7 #include <sys/file.h>
8 
9 static char line[BUFSIZ+1];
10 static struct passwd passwd;
11 
12 /*
13  * The following are shared with getpwent.c
14  */
15 extern	char *_pw_file;
16 DBM	*_pw_db;
17 int	_pw_stayopen;
18 
19 static struct passwd *
20 fetchpw(key)
21 	datum key;
22 {
23         register char *cp, *tp;
24 
25         if (key.dptr == 0)
26                 return ((struct passwd *)NULL);
27 	key = dbm_fetch(_pw_db, key);
28 	if (key.dptr == 0)
29                 return ((struct passwd *)NULL);
30         cp = key.dptr;
31 	tp = line;
32 
33 #define	EXPAND(e)	passwd.pw_/**/e = tp; while (*tp++ = *cp++);
34 	EXPAND(name);
35 	EXPAND(passwd);
36 	bcopy(cp, (char *)&passwd.pw_uid, sizeof (int));
37 	cp += sizeof (int);
38 	bcopy(cp, (char *)&passwd.pw_gid, sizeof (int));
39 	cp += sizeof (int);
40 	bcopy(cp, (char *)&passwd.pw_quota, sizeof (int));
41 	cp += sizeof (int);
42 	EXPAND(comment);
43 	EXPAND(gecos);
44 	EXPAND(dir);
45 	EXPAND(shell);
46         return (&passwd);
47 }
48 
49 struct passwd *
50 getpwnam(nam)
51 	char *nam;
52 {
53         datum key;
54 	register struct passwd *pw;
55 
56         if (_pw_db == (DBM *)0 &&
57 	    (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) {
58 	oldcode:
59 		setpwent();
60 		while ((pw = getpwent()) && strcmp(nam, pw->pw_name))
61 			;
62 		if (!_pw_stayopen)
63 			endpwent();
64 		return (pw);
65 	}
66 	if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) {
67 		dbm_close(_pw_db);
68 		_pw_db = (DBM *)0;
69 		goto oldcode;
70 	}
71         key.dptr = nam;
72         key.dsize = strlen(nam);
73 	pw = fetchpw(key);
74 	(void) flock(dbm_dirfno(_pw_db), LOCK_UN);
75 	if (!_pw_stayopen) {
76 		dbm_close(_pw_db);
77 		_pw_db = (DBM *)0;
78 	}
79         return (pw);
80 }
81 
82 struct passwd *
83 getpwuid(uid)
84 	int uid;
85 {
86         datum key;
87 	register struct passwd *pw;
88 
89         if (_pw_db == (DBM *)0 &&
90 	    (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) {
91 	oldcode:
92 		setpwent();
93 		while ((pw = getpwent()) && pw->pw_uid != uid)
94 			;
95 		if (!_pw_stayopen)
96 			endpwent();
97 		return (pw);
98 	}
99 	if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) {
100 		dbm_close(_pw_db);
101 		_pw_db = (DBM *)0;
102 		goto oldcode;
103 	}
104         key.dptr = (char *) &uid;
105         key.dsize = sizeof uid;
106 	pw = fetchpw(key);
107 	(void) flock(dbm_dirfno(_pw_db), LOCK_UN);
108 	if (!_pw_stayopen) {
109 		dbm_close(_pw_db);
110 		_pw_db = (DBM *)0;
111 	}
112         return (pw);
113 }
114