return 0 not null string when user has a ctty but no utmp entry
[unix-history] / usr / src / lib / libc / gen / getpwnamuid.c
CommitLineData
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
DS
7#if defined(LIBC_SCCS) && !defined(lint)
8static char sccsid[] = "@(#)getpwnamuid.c 5.2 (Berkeley) %G%";
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
17static char line[BUFSIZ+1];
18static struct passwd passwd;
182501fd
S
19
20/*
21 * The following are shared with getpwent.c
22 */
23extern char *_pw_file;
24DBM *_pw_db;
25int _pw_stayopen;
8b87132c
RC
26
27static struct passwd *
28fetchpw(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
0c41f198 41#define EXPAND(e) passwd.pw_/**/e = tp; while (*tp++ = *cp++);
8b87132c
RC
42 EXPAND(name);
43 EXPAND(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);
8b87132c
RC
50 EXPAND(comment);
51 EXPAND(gecos);
52 EXPAND(dir);
53 EXPAND(shell);
54 return (&passwd);
55}
56
57struct passwd *
58getpwnam(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
90struct passwd *
91getpwuid(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}