|
|
1.1 root 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:
7: #if defined(LIBC_SCCS) && !defined(lint)
8: static char sccsid[] = "@(#)getpwnamuid.c 5.2 (Berkeley) 3/9/86";
9: #endif LIBC_SCCS and not lint
10:
11: #include <stdio.h>
12: #include <pwd.h>
13: #include <ndbm.h>
14:
15: #include <sys/file.h>
16:
17: static char line[BUFSIZ+1];
18: static struct passwd passwd;
19:
20: /*
21: * The following are shared with getpwent.c
22: */
23: extern char *_pw_file;
24: DBM *_pw_db;
25: int _pw_stayopen;
26:
27: static struct passwd *
28: fetchpw(key)
29: datum key;
30: {
31: register char *cp, *tp;
32:
33: if (key.dptr == 0)
34: return ((struct passwd *)NULL);
35: key = dbm_fetch(_pw_db, key);
36: if (key.dptr == 0)
37: return ((struct passwd *)NULL);
38: cp = key.dptr;
39: tp = line;
40:
41: #define EXPAND(e) passwd.pw_/**/e = tp; while (*tp++ = *cp++);
42: EXPAND(name);
43: EXPAND(passwd);
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);
50: EXPAND(comment);
51: EXPAND(gecos);
52: EXPAND(dir);
53: EXPAND(shell);
54: return (&passwd);
55: }
56:
57: struct passwd *
58: getpwnam(nam)
59: char *nam;
60: {
61: datum key;
62: register struct passwd *pw;
63:
64: if (_pw_db == (DBM *)0 &&
65: (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) {
66: oldcode:
67: setpwent();
68: while ((pw = getpwent()) && strcmp(nam, pw->pw_name))
69: ;
70: if (!_pw_stayopen)
71: endpwent();
72: return (pw);
73: }
74: if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) {
75: dbm_close(_pw_db);
76: _pw_db = (DBM *)0;
77: goto oldcode;
78: }
79: key.dptr = nam;
80: key.dsize = strlen(nam);
81: pw = fetchpw(key);
82: (void) flock(dbm_dirfno(_pw_db), LOCK_UN);
83: if (!_pw_stayopen) {
84: dbm_close(_pw_db);
85: _pw_db = (DBM *)0;
86: }
87: return (pw);
88: }
89:
90: struct passwd *
91: getpwuid(uid)
92: int uid;
93: {
94: datum key;
95: register struct passwd *pw;
96:
97: if (_pw_db == (DBM *)0 &&
98: (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) {
99: oldcode:
100: setpwent();
101: while ((pw = getpwent()) && pw->pw_uid != uid)
102: ;
103: if (!_pw_stayopen)
104: endpwent();
105: return (pw);
106: }
107: if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) {
108: dbm_close(_pw_db);
109: _pw_db = (DBM *)0;
110: goto oldcode;
111: }
112: key.dptr = (char *) &uid;
113: key.dsize = sizeof uid;
114: pw = fetchpw(key);
115: (void) flock(dbm_dirfno(_pw_db), LOCK_UN);
116: if (!_pw_stayopen) {
117: dbm_close(_pw_db);
118: _pw_db = (DBM *)0;
119: }
120: return (pw);
121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.