annotate lib/idcache.c @ 40057:b06060465f09

maint: Run 'make update-copyright'
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 01 Jan 2019 00:25:11 +0100
parents 10eb9086bea0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* idcache.c -- map user and group IDs, cached for speed
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
2
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 19484
diff changeset
3 Copyright (C) 1985, 1988-1990, 1997-1998, 2003, 2005-2007, 2009-2019 Free
12518
b5e42ef33b49 update nearly all FSF copyright year lists to include 2009
Jim Meyering <meyering@redhat.com>
parents: 12421
diff changeset
4 Software Foundation, Inc.
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9148
diff changeset
6 This program is free software: you can redistribute it and/or modify
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9148
diff changeset
8 the Free Software Foundation; either version 3 of the License, or
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9148
diff changeset
9 (at your option) any later version.
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 GNU General Public License for more details.
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
19190
9759915b2aca all: prefer https: URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 18626
diff changeset
17 along with this program. If not, see <https://www.gnu.org/licenses/>. */
650
b4ef1c1a0171 update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents: 5
diff changeset
18
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
19 #include <config.h>
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20
9148
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
21 #include "idcache.h"
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
22 #include <stddef.h>
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23 #include <stdio.h>
4662
fa597018cd8b Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4544
diff changeset
24 #include <string.h>
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <pwd.h>
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #include <grp.h>
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
28 #include <unistd.h>
967
029c8dd12d60 (getuser): Return NULL (rather than stringified uid) upon lookup failure.
Jim Meyering <jim@meyering.net>
parents: 650
diff changeset
29
18403
4434607ac1ce flexmember: port better to GCC + valgrind
Paul Eggert <eggert@cs.ucla.edu>
parents: 18325
diff changeset
30 #include "flexmember.h"
4544
9a6a29a7ae3c Include "xalloc.h"
Paul Eggert <eggert@cs.ucla.edu>
parents: 1582
diff changeset
31 #include "xalloc.h"
9a6a29a7ae3c Include "xalloc.h"
Paul Eggert <eggert@cs.ucla.edu>
parents: 1582
diff changeset
32
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
33 #ifdef __DJGPP__
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
34 static char digits[] = "0123456789";
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
35 #endif
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
36
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 struct userid
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 union
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 uid_t u;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 gid_t g;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 } id;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 struct userid *next;
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
45 char name[FLEXIBLE_ARRAY_MEMBER];
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 };
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47
9148
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
48 /* FIXME: provide a function to free any malloc'd storage and reset lists,
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
49 so that an application can use code like this just before exiting:
18325
33db65a13e67 Use GCC_LINT, not lint
Paul Eggert <eggert@cs.ucla.edu>
parents: 18189
diff changeset
50 #if defined GCC_LINT || defined lint
9148
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
51 idcache_clear ();
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
52 #endif
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
53 */
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
54
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 static struct userid *user_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56
7675
476857ef4611 * lib/idcache.c: Adjust comments in user- and group- portions to
Jim Meyering <jim@meyering.net>
parents: 7673
diff changeset
57 /* Each entry on list is a user name for which the first lookup failed. */
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 static struct userid *nouser_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59
9148
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
60 /* Use the same struct as for userids. */
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
61 static struct userid *group_alist;
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
62
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
63 /* Each entry on list is a group name for which the first lookup failed. */
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
64 static struct userid *nogroup_alist;
71cb6e488d75 New file: lib/idcache.h
Jim Meyering <jim@meyering.net>
parents: 7675
diff changeset
65
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
66 /* Translate UID to a login name, with cache, or NULL if unresolved. */
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 char *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
69 getuser (uid_t uid)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 {
7672
d2c7e0fe0b94 * lib/idcache.c (getuser): Remove all uses of the register keyword.
Jim Meyering <jim@meyering.net>
parents: 7671
diff changeset
71 struct userid *tail;
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
72 struct userid *match = NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 for (tail = user_alist; tail; tail = tail->next)
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
75 {
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
76 if (tail->id.u == uid)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
77 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
78 match = tail;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
79 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
80 }
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
81 }
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
83 if (match == NULL)
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
84 {
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
85 struct passwd *pwent = getpwuid (uid);
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
86 char const *name = pwent ? pwent->pw_name : "";
18403
4434607ac1ce flexmember: port better to GCC + valgrind
Paul Eggert <eggert@cs.ucla.edu>
parents: 18325
diff changeset
87 match = xmalloc (FLEXSIZEOF (struct userid, name, strlen (name) + 1));
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
88 match->id.u = uid;
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
89 strcpy (match->name, name);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
91 /* Add to the head of the list, so most recently used is first. */
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
92 match->next = user_alist;
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
93 user_alist = match;
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
94 }
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
95
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
96 return match->name[0] ? match->name : NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 /* Translate USER to a UID, with cache.
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 Return NULL if there is no such user.
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 (We also cache which user names have no passwd entry,
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 so we don't keep looking them up.) */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 uid_t *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
105 getuidbyname (const char *user)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 {
7672
d2c7e0fe0b94 * lib/idcache.c (getuser): Remove all uses of the register keyword.
Jim Meyering <jim@meyering.net>
parents: 7671
diff changeset
107 struct userid *tail;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 struct passwd *pwent;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 for (tail = user_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 /* Avoid a function call for the most common case. */
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
112 if (*tail->name == *user && !strcmp (tail->name, user))
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 return &tail->id.u;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 for (tail = nouser_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 /* Avoid a function call for the most common case. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 if (*tail->name == *user && !strcmp (tail->name, user))
7671
0e4c9d56db95 Use cleaner syntax: NULL rather than 0.
Jim Meyering <jim@meyering.net>
parents: 7670
diff changeset
118 return NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 pwent = getpwnam (user);
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
121 #ifdef __DJGPP__
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
122 /* We need to pretend to be the user USER, to make
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
123 pwd functions know about an arbitrary user name. */
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
124 if (!pwent && strspn (user, digits) < strlen (user))
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
125 {
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
126 setenv ("USER", user, 1);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
127 pwent = getpwnam (user); /* now it will succeed */
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
128 }
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
129 #endif
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130
18403
4434607ac1ce flexmember: port better to GCC + valgrind
Paul Eggert <eggert@cs.ucla.edu>
parents: 18325
diff changeset
131 tail = xmalloc (FLEXSIZEOF (struct userid, name, strlen (user) + 1));
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
132 strcpy (tail->name, user);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
134 /* Add to the head of the list, so most recently used is first. */
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 if (pwent)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137 tail->id.u = pwent->pw_uid;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 tail->next = user_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 user_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 return &tail->id.u;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
142
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
143 tail->next = nouser_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 nouser_alist = tail;
7671
0e4c9d56db95 Use cleaner syntax: NULL rather than 0.
Jim Meyering <jim@meyering.net>
parents: 7670
diff changeset
145 return NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
146 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
147
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
148 /* Translate GID to a group name, with cache, or NULL if unresolved. */
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150 char *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
151 getgroup (gid_t gid)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152 {
7672
d2c7e0fe0b94 * lib/idcache.c (getuser): Remove all uses of the register keyword.
Jim Meyering <jim@meyering.net>
parents: 7671
diff changeset
153 struct userid *tail;
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
154 struct userid *match = NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 for (tail = group_alist; tail; tail = tail->next)
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
157 {
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
158 if (tail->id.g == gid)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
159 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
160 match = tail;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
161 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
162 }
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
163 }
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
164
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
165 if (match == NULL)
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
166 {
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
167 struct group *grent = getgrgid (gid);
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
168 char const *name = grent ? grent->gr_name : "";
18403
4434607ac1ce flexmember: port better to GCC + valgrind
Paul Eggert <eggert@cs.ucla.edu>
parents: 18325
diff changeset
169 match = xmalloc (FLEXSIZEOF (struct userid, name, strlen (name) + 1));
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
170 match->id.g = gid;
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
171 strcpy (match->name, name);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
173 /* Add to the head of the list, so most recently used is first. */
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
174 match->next = group_alist;
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
175 group_alist = match;
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
176 }
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
177
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
178 return match->name[0] ? match->name : NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
179 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
180
967
029c8dd12d60 (getuser): Return NULL (rather than stringified uid) upon lookup failure.
Jim Meyering <jim@meyering.net>
parents: 650
diff changeset
181 /* Translate GROUP to a GID, with cache.
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
182 Return NULL if there is no such group.
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
183 (We also cache which group names have no group entry,
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184 so we don't keep looking them up.) */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
185
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186 gid_t *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
187 getgidbyname (const char *group)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 {
7672
d2c7e0fe0b94 * lib/idcache.c (getuser): Remove all uses of the register keyword.
Jim Meyering <jim@meyering.net>
parents: 7671
diff changeset
189 struct userid *tail;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 struct group *grent;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 for (tail = group_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
193 /* Avoid a function call for the most common case. */
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
194 if (*tail->name == *group && !strcmp (tail->name, group))
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195 return &tail->id.g;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
196
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
197 for (tail = nogroup_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198 /* Avoid a function call for the most common case. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199 if (*tail->name == *group && !strcmp (tail->name, group))
7671
0e4c9d56db95 Use cleaner syntax: NULL rather than 0.
Jim Meyering <jim@meyering.net>
parents: 7670
diff changeset
200 return NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
201
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202 grent = getgrnam (group);
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
203 #ifdef __DJGPP__
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
204 /* We need to pretend to belong to group GROUP, to make
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
205 grp functions know about an arbitrary group name. */
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
206 if (!grent && strspn (group, digits) < strlen (group))
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
207 {
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
208 setenv ("GROUP", group, 1);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
209 grent = getgrnam (group); /* now it will succeed */
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
210 }
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
211 #endif
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
212
18403
4434607ac1ce flexmember: port better to GCC + valgrind
Paul Eggert <eggert@cs.ucla.edu>
parents: 18325
diff changeset
213 tail = xmalloc (FLEXSIZEOF (struct userid, name, strlen (group) + 1));
7673
a37b8b182d49 * lib/idcache.c: Restore most of the 2006-11-06 patch, so as to
Jim Meyering <jim@meyering.net>
parents: 7672
diff changeset
214 strcpy (tail->name, group);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
215
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
216 /* Add to the head of the list, so most recently used is first. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
217 if (grent)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
218 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
219 tail->id.g = grent->gr_gid;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
220 tail->next = group_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
221 group_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
222 return &tail->id.g;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
223 }
650
b4ef1c1a0171 update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents: 5
diff changeset
224
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
225 tail->next = nogroup_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
226 nogroup_alist = tail;
7671
0e4c9d56db95 Use cleaner syntax: NULL rather than 0.
Jim Meyering <jim@meyering.net>
parents: 7670
diff changeset
227 return NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
228 }