Commit | Line | Data |
---|---|---|
bb0cfa24 DF |
1 | /* |
2 | * Copyright (c) 1983 Regents of the University of California. | |
3 | * All rights reserved. The Berkeley software License Agreement | |
4 | * specifies the terms and conditions for redistribution. | |
5 | */ | |
6 | ||
2ce81398 | 7 | #if defined(LIBC_SCCS) && !defined(lint) |
a59237a4 | 8 | static char sccsid[] = "@(#)getpwnamuid.c 5.3 (Berkeley) %G%"; |
2ce81398 | 9 | #endif LIBC_SCCS and not lint |
8b87132c RC |
10 | |
11 | #include <stdio.h> | |
12 | #include <pwd.h> | |
13 | #include <ndbm.h> | |
14 | ||
15 | #include <sys/file.h> | |
16 | ||
8b87132c RC |
17 | static char line[BUFSIZ+1]; |
18 | static struct passwd passwd; | |
182501fd S |
19 | |
20 | /* | |
21 | * The following are shared with getpwent.c | |
22 | */ | |
23 | extern char *_pw_file; | |
24 | DBM *_pw_db; | |
25 | int _pw_stayopen; | |
8b87132c RC |
26 | |
27 | static struct passwd * | |
28 | fetchpw(key) | |
29 | datum key; | |
30 | { | |
0c41f198 | 31 | register char *cp, *tp; |
8b87132c | 32 | |
0c41f198 | 33 | if (key.dptr == 0) |
8b87132c | 34 | return ((struct passwd *)NULL); |
ef95bfa8 | 35 | key = dbm_fetch(_pw_db, key); |
8b87132c RC |
36 | if (key.dptr == 0) |
37 | return ((struct passwd *)NULL); | |
38 | cp = key.dptr; | |
0c41f198 | 39 | tp = line; |
8b87132c | 40 | |
a59237a4 KB |
41 | #define EXPAND(e) passwd.e = tp; while (*tp++ = *cp++); |
42 | EXPAND(pw_name); | |
43 | EXPAND(pw_passwd); | |
1ed2084e RC |
44 | bcopy(cp, (char *)&passwd.pw_uid, sizeof (int)); |
45 | cp += sizeof (int); | |
46 | bcopy(cp, (char *)&passwd.pw_gid, sizeof (int)); | |
47 | cp += sizeof (int); | |
48 | bcopy(cp, (char *)&passwd.pw_quota, sizeof (int)); | |
49 | cp += sizeof (int); | |
a59237a4 KB |
50 | EXPAND(pw_comment); |
51 | EXPAND(pw_gecos); | |
52 | EXPAND(pw_dir); | |
53 | EXPAND(pw_shell); | |
8b87132c RC |
54 | return (&passwd); |
55 | } | |
56 | ||
57 | struct passwd * | |
58 | getpwnam(nam) | |
59 | char *nam; | |
60 | { | |
61 | datum key; | |
62 | register struct passwd *pw; | |
63 | ||
499a4b51 | 64 | if (_pw_db == (DBM *)0 && |
182501fd | 65 | (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) { |
499a4b51 RC |
66 | oldcode: |
67 | setpwent(); | |
182501fd S |
68 | while ((pw = getpwent()) && strcmp(nam, pw->pw_name)) |
69 | ; | |
70 | if (!_pw_stayopen) | |
71 | endpwent(); | |
499a4b51 RC |
72 | return (pw); |
73 | } | |
182501fd | 74 | if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) { |
ef95bfa8 | 75 | dbm_close(_pw_db); |
499a4b51 RC |
76 | _pw_db = (DBM *)0; |
77 | goto oldcode; | |
78 | } | |
8b87132c RC |
79 | key.dptr = nam; |
80 | key.dsize = strlen(nam); | |
81 | pw = fetchpw(key); | |
182501fd | 82 | (void) flock(dbm_dirfno(_pw_db), LOCK_UN); |
499a4b51 | 83 | if (!_pw_stayopen) { |
ef95bfa8 | 84 | dbm_close(_pw_db); |
499a4b51 RC |
85 | _pw_db = (DBM *)0; |
86 | } | |
8b87132c RC |
87 | return (pw); |
88 | } | |
89 | ||
90 | struct passwd * | |
91 | getpwuid(uid) | |
92 | int uid; | |
93 | { | |
94 | datum key; | |
95 | register struct passwd *pw; | |
96 | ||
499a4b51 | 97 | if (_pw_db == (DBM *)0 && |
182501fd | 98 | (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) { |
499a4b51 RC |
99 | oldcode: |
100 | setpwent(); | |
182501fd S |
101 | while ((pw = getpwent()) && pw->pw_uid != uid) |
102 | ; | |
103 | if (!_pw_stayopen) | |
104 | endpwent(); | |
499a4b51 RC |
105 | return (pw); |
106 | } | |
182501fd | 107 | if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) { |
ef95bfa8 | 108 | dbm_close(_pw_db); |
499a4b51 RC |
109 | _pw_db = (DBM *)0; |
110 | goto oldcode; | |
111 | } | |
8b87132c RC |
112 | key.dptr = (char *) &uid; |
113 | key.dsize = sizeof uid; | |
114 | pw = fetchpw(key); | |
182501fd | 115 | (void) flock(dbm_dirfno(_pw_db), LOCK_UN); |
499a4b51 | 116 | if (!_pw_stayopen) { |
ef95bfa8 | 117 | dbm_close(_pw_db); |
499a4b51 RC |
118 | _pw_db = (DBM *)0; |
119 | } | |
8b87132c RC |
120 | return (pw); |
121 | } |