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)
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) {
52 pwent = getpwuid(uid);
53 tail = (struct userid *)malloc(sizeof (struct userid));
56 if (pwent == 0 || strcmp(pwent->pw_name, "????????") == 0) {
57 sprintf(usernum_string, "%u", (uint32_t)uid);
58 tail->name = bstrdup(usernum_string);
60 tail->name = bstrdup(pwent->pw_name);
63 sprintf(usernum_string, "%u", (uint32_t)uid);
64 tail->name = bstrdup(usernum_string);
67 /* Add to the head of the list, so most recently used is first. */
68 tail->next = user_alist;
74 void free_getuser_cache()
76 register struct userid *tail;
79 for (tail = user_alist; tail; ) {
80 struct userid *otail = tail;
91 /* Translate GID to a group name or a stringified number,
93 char *getgroup(gid_t gid)
95 register struct userid *tail;
97 char groupnum_string[20];
100 for (tail = group_alist; tail; tail = tail->next) {
101 if (tail->id.g == gid) {
107 grent = getgrgid(gid);
108 tail = (struct userid *)malloc(sizeof (struct userid));
111 if (grent == 0 || strcmp(grent->gr_name, "????????") == 0) {
112 sprintf (groupnum_string, "%u", (uint32_t)gid);
113 tail->name = bstrdup(groupnum_string);
115 tail->name = bstrdup(grent->gr_name);
118 sprintf (groupnum_string, "%u", (uint32_t)gid);
119 tail->name = bstrdup(groupnum_string);
121 /* Add to the head of the list, so most recently used is first. */
122 tail->next = group_alist;
128 void free_getgroup_cache()
130 register struct userid *tail;
133 for (tail = group_alist; tail; ) {
134 struct userid *otail = tail;