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;
41 char usernum_string[20];
44 for (tail = user_alist; tail; tail = tail->next) {
45 if (tail->id.u == uid) {
50 tail = (struct userid *)malloc(sizeof (struct userid));
54 #if !defined(HAVE_WIN32)
56 struct passwd *pwent = getpwuid(uid);
58 if (pwent != NULL && strcmp(pwent->pw_name, "????????") != 0) {
59 tail->name = bstrdup(pwent->pw_name);
64 if (tail->name == NULL) {
65 sprintf(usernum_string, "%u", (uint32_t)uid);
66 tail->name = bstrdup(usernum_string);
69 /* Add to the head of the list, so most recently used is first. */
70 tail->next = user_alist;
74 bstrncpy(name, tail->name, len);
79 void free_getuser_cache()
81 register struct userid *tail;
84 for (tail = user_alist; tail; ) {
85 struct userid *otail = tail;
96 /* Translate GID to a group name or a stringified number,
98 char *getgroup(gid_t gid, char *name, int len)
100 register struct userid *tail;
101 char groupnum_string[20];
104 for (tail = group_alist; tail; tail = tail->next) {
105 if (tail->id.g == gid) {
110 tail = (struct userid *)malloc(sizeof (struct userid));
114 #if !defined(HAVE_WIN32)
116 struct group *grent = getgrgid(gid);
118 if (grent != NULL && strcmp(grent->gr_name, "????????") != 0) {
119 tail->name = bstrdup(grent->gr_name);
124 if (tail->name == NULL) {
125 sprintf (groupnum_string, "%u", (uint32_t)gid);
126 tail->name = bstrdup(groupnum_string);
129 /* Add to the head of the list, so most recently used is first. */
130 tail->next = group_alist;
134 bstrncpy(name, tail->name, len);
139 void free_getgroup_cache()
141 register struct userid *tail;
144 for (tail = group_alist; tail; ) {
145 struct userid *otail = tail;