1 /* idcache.c -- map user and group IDs, cached for speed
2 Copyright (C) 1985, 1988, 1989, 1990 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
29 static struct userid *user_alist = NULL;
30 /* Use the same struct as for userids. */
31 static struct userid *group_alist = NULL;
33 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
35 /* Translate UID to a login name or a stringified number,
38 char *getuser(uid_t uid, char *name, int len)
40 register struct userid *tail;
42 char usernum_string[20];
45 for (tail = user_alist; tail; tail = tail->next) {
46 if (tail->id.u == uid) {
51 pwent = getpwuid(uid);
52 tail = (struct userid *)malloc(sizeof (struct userid));
55 if (pwent == NULL || strcmp(pwent->pw_name, "????????") == 0) {
56 sprintf(usernum_string, "%u", (uint32_t)uid);
57 tail->name = bstrdup(usernum_string);
59 tail->name = bstrdup(pwent->pw_name);
62 sprintf(usernum_string, "%u", (uint32_t)uid);
63 tail->name = bstrdup(usernum_string);
66 /* Add to the head of the list, so most recently used is first. */
67 tail->next = user_alist;
71 bstrncpy(name, tail->name, len);
76 void free_getuser_cache()
78 register struct userid *tail;
81 for (tail = user_alist; tail; ) {
82 struct userid *otail = tail;
93 /* Translate GID to a group name or a stringified number,
95 char *getgroup(gid_t gid, char *name, int len)
97 register struct userid *tail;
99 char groupnum_string[20];
102 for (tail = group_alist; tail; tail = tail->next) {
103 if (tail->id.g == gid) {
108 grent = getgrgid(gid);
109 tail = (struct userid *)malloc(sizeof (struct userid));
112 if (grent == NULL || strcmp(grent->gr_name, "????????") == 0) {
113 sprintf (groupnum_string, "%u", (uint32_t)gid);
114 tail->name = bstrdup(groupnum_string);
116 tail->name = bstrdup(grent->gr_name);
119 sprintf (groupnum_string, "%u", (uint32_t)gid);
120 tail->name = bstrdup(groupnum_string);
122 /* Add to the head of the list, so most recently used is first. */
123 tail->next = group_alist;
127 bstrncpy(name, tail->name, len);
132 void free_getgroup_cache()
134 register struct userid *tail;
137 for (tail = group_alist; tail; ) {
138 struct userid *otail = tail;