don't close files that haven't been opened.
[unix-history] / usr / src / lib / libc / gen / getpwnamuid.c
CommitLineData
9aabfbe8 1/* getpwnamuid.c 4.5 84/08/28 */
8b87132c
RC
2
3#include <stdio.h>
4#include <pwd.h>
5#include <ndbm.h>
6
7#include <sys/file.h>
8
9static char PASSWD[] = "/etc/passwd";
10static char EMPTY[] = "";
11static char line[BUFSIZ+1];
12static struct passwd passwd;
499a4b51
RC
13DBM *_pw_db = 0;
14int _pw_stayopen = 0;
8b87132c
RC
15
16static struct passwd *
17fetchpw(key)
18 datum key;
19{
0c41f198 20 register char *cp, *tp;
8b87132c 21
0c41f198 22 if (key.dptr == 0)
8b87132c 23 return ((struct passwd *)NULL);
499a4b51 24 key = dbmfetch(_pw_db, key);
8b87132c
RC
25 if (key.dptr == 0)
26 return ((struct passwd *)NULL);
27 cp = key.dptr;
0c41f198 28 tp = line;
8b87132c 29
0c41f198 30#define EXPAND(e) passwd.pw_/**/e = tp; while (*tp++ = *cp++);
8b87132c
RC
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
43struct passwd *
44getpwnam(nam)
45 char *nam;
46{
47 datum key;
48 register struct passwd *pw;
49
499a4b51
RC
50 if (_pw_db == (DBM *)0 &&
51 (_pw_db = ndbmopen(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->db_dirf, LOCK_SH) < 0) {
59 ndbmclose(_pw_db);
60 _pw_db = (DBM *)0;
61 goto oldcode;
62 }
8b87132c
RC
63 key.dptr = nam;
64 key.dsize = strlen(nam);
65 pw = fetchpw(key);
499a4b51
RC
66 (void) flock(_pw_db->db_dirf, LOCK_UN);
67 if (!_pw_stayopen) {
68 ndbmclose(_pw_db);
69 _pw_db = (DBM *)0;
70 }
8b87132c
RC
71 return (pw);
72}
73
74struct passwd *
75getpwuid(uid)
76 int uid;
77{
78 datum key;
79 register struct passwd *pw;
80
499a4b51
RC
81 if (_pw_db == (DBM *)0 &&
82 (_pw_db = ndbmopen(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->db_dirf, LOCK_SH) < 0) {
90 ndbmclose(_pw_db);
91 _pw_db = (DBM *)0;
92 goto oldcode;
93 }
8b87132c
RC
94 key.dptr = (char *) &uid;
95 key.dsize = sizeof uid;
96 pw = fetchpw(key);
499a4b51
RC
97 (void) flock(_pw_db->db_dirf, LOCK_UN);
98 if (!_pw_stayopen) {
99 ndbmclose(_pw_db);
100 _pw_db = (DBM *)0;
101 }
8b87132c
RC
102 return (pw);
103}