flag fields are u_int's
[unix-history] / usr / src / lib / libc / gen / pwcache.c
CommitLineData
0abe9750
KB
1/*
2 * Copyright (c) 1989 The Regents of the University of California.
3 * All rights reserved.
4 *
1343342a 5 * %sccs.include.redist.c%
0abe9750
KB
6 */
7
8#if defined(LIBC_SCCS) && !defined(lint)
1343342a 9static char sccsid[] = "@(#)pwcache.c 5.4 (Berkeley) %G%";
0abe9750
KB
10#endif /* LIBC_SCCS and not lint */
11
12#include <sys/types.h>
13#include <utmp.h>
14#include <pwd.h>
15#include <grp.h>
de714f9f 16#include <stdio.h>
0abe9750
KB
17
18#define NCACHE 64 /* power of 2 */
19#define MASK NCACHE - 1 /* bits to store with */
20
c938998a
MT
21static int pwopen = 0;
22static int gropen = 0;
23
0abe9750 24char *
de714f9f 25user_from_uid(uid, nouser)
0abe9750 26 uid_t uid;
de714f9f 27 int nouser;
0abe9750
KB
28{
29 static struct ncache {
30 uid_t uid;
31 char name[UT_NAMESIZE + 1];
32 } c_uid[NCACHE];
33 static char nbuf[15]; /* 32 bits == 10 digits */
34 register struct passwd *pw;
35 register struct ncache *cp;
36
37 cp = c_uid + (uid & MASK);
38 if (cp->uid != uid || !*cp->name) {
c938998a
MT
39 if (pwopen == 0) {
40 setpassent(1);
41 pwopen++;
42 }
0abe9750 43 if (!(pw = getpwuid(uid))) {
de714f9f
KB
44 if (nouser)
45 return((char *)NULL);
0abe9750
KB
46 (void)sprintf(nbuf, "%u", uid);
47 return(nbuf);
48 }
49 cp->uid = uid;
50 (void)strncpy(cp->name, pw->pw_name, UT_NAMESIZE);
51 cp->name[UT_NAMESIZE] = '\0';
52 }
53 return(cp->name);
54}
55
56char *
de714f9f 57group_from_gid(gid, nogroup)
0abe9750 58 gid_t gid;
de714f9f 59 int nogroup;
0abe9750
KB
60{
61 static struct ncache {
62 gid_t gid;
63 char name[UT_NAMESIZE];
64 } c_gid[NCACHE];
65 static char nbuf[15]; /* 32 bits == 10 digits */
66 register struct group *gr;
67 register struct ncache *cp;
68
69 cp = c_gid + (gid & MASK);
70 if (cp->gid != gid || !*cp->name) {
c938998a
MT
71 if (gropen == 0) {
72 setgroupent(1);
73 gropen++;
74 }
0abe9750 75 if (!(gr = getgrgid(gid))) {
de714f9f
KB
76 if (nogroup)
77 return((char *)NULL);
0abe9750
KB
78 (void)sprintf(nbuf, "%u", gid);
79 return(nbuf);
80 }
81 cp->gid = gid;
82 (void)strncpy(cp->name, gr->gr_name, UT_NAMESIZE);
83 cp->name[UT_NAMESIZE] = '\0';
84 }
85 return(cp->name);
86}