annotate lib/idcache.c @ 7296:33903d90fa2b

(argp_doc): Make sure NULL is not passed to dgettext
author Sergey Poznyakoff <gray@gnu.org.ua>
date Tue, 12 Sep 2006 09:06:40 +0000
parents fd0ccce602e4
children 8a1a9361108c
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
3 Copyright (C) 1985, 1988, 1989, 1990, 1997, 1998, 2003, 2005 Free
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
4 Software Foundation, Inc.
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 This program is free software; you can redistribute it and/or modify
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
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 any later version.
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
650
b4ef1c1a0171 update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents: 5
diff changeset
17 along with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 4662
diff changeset
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
650
b4ef1c1a0171 update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents: 5
diff changeset
19
6259
96c32553b4c6 Use a consistent style for including <config.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5949
diff changeset
20 #ifdef HAVE_CONFIG_H
967
029c8dd12d60 (getuser): Return NULL (rather than stringified uid) upon lookup failure.
Jim Meyering <jim@meyering.net>
parents: 650
diff changeset
21 # include <config.h>
650
b4ef1c1a0171 update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents: 5
diff changeset
22 #endif
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 #include <stdio.h>
4662
fa597018cd8b Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4544
diff changeset
25 #include <string.h>
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #include <sys/types.h>
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 #include <pwd.h>
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 #include <grp.h>
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
30 #include <unistd.h>
967
029c8dd12d60 (getuser): Return NULL (rather than stringified uid) upon lookup failure.
Jim Meyering <jim@meyering.net>
parents: 650
diff changeset
31
4544
9a6a29a7ae3c Include "xalloc.h"
Paul Eggert <eggert@cs.ucla.edu>
parents: 1582
diff changeset
32 #include "xalloc.h"
9a6a29a7ae3c Include "xalloc.h"
Paul Eggert <eggert@cs.ucla.edu>
parents: 1582
diff changeset
33
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
34 #ifdef __DJGPP__
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
35 static char digits[] = "0123456789";
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
36 #endif
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
37
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 struct userid
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 union
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 uid_t u;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 gid_t g;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 } id;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 char *name;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 struct userid *next;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 };
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 static struct userid *user_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
51 /* The members of this list have names not in the local passwd file. */
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 static struct userid *nouser_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
54 /* Translate UID to a login name, with cache, or NULL if unresolved. */
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 char *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
57 getuser (uid_t uid)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 register struct userid *tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 struct passwd *pwent;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62 for (tail = user_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 if (tail->id.u == uid)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 return tail->name;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 pwent = getpwuid (uid);
5949
9300a4e513e9 (getuser, getuidbyname, getgroup, getgidbyname):
Jim Meyering <jim@meyering.net>
parents: 5907
diff changeset
67 tail = xmalloc (sizeof *tail);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 tail->id.u = uid;
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
69 tail->name = pwent ? xstrdup (pwent->pw_name) : NULL;
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
71 /* 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
72 tail->next = user_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 user_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 return tail->name;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 /* Translate USER to a UID, with cache.
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 Return NULL if there is no such user.
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 (We also cache which user names have no passwd entry,
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 so we don't keep looking them up.) */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 uid_t *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
83 getuidbyname (const char *user)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85 register struct userid *tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 struct passwd *pwent;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88 for (tail = user_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 /* Avoid a function call for the most common case. */
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
90 if (*tail->name == *user && !strcmp (tail->name, user))
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91 return &tail->id.u;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 for (tail = nouser_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 /* Avoid a function call for the most common case. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 if (*tail->name == *user && !strcmp (tail->name, user))
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 return 0;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 pwent = getpwnam (user);
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
99 #ifdef __DJGPP__
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
100 /* 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
101 pwd functions know about an arbitrary user name. */
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
102 if (!pwent && strspn (user, digits) < strlen (user))
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
103 {
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
104 setenv ("USER", user, 1);
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
105 pwent = getpwnam (user); /* now it will succeed */
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
106 }
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
107 #endif
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108
5949
9300a4e513e9 (getuser, getuidbyname, getgroup, getgidbyname):
Jim Meyering <jim@meyering.net>
parents: 5907
diff changeset
109 tail = xmalloc (sizeof *tail);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 tail->name = xstrdup (user);
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
112 /* 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
113 if (pwent)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 tail->id.u = pwent->pw_uid;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 tail->next = user_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 user_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 return &tail->id.u;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121 tail->next = nouser_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122 nouser_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 return 0;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126 /* Use the same struct as for userids. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 static struct userid *group_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 static struct userid *nogroup_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
130 /* Translate GID to a group name, with cache, or NULL if unresolved. */
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132 char *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
133 getgroup (gid_t gid)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 register struct userid *tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 struct group *grent;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 for (tail = group_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 if (tail->id.g == gid)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 return tail->name;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
142 grent = getgrgid (gid);
5949
9300a4e513e9 (getuser, getuidbyname, getgroup, getgidbyname):
Jim Meyering <jim@meyering.net>
parents: 5907
diff changeset
143 tail = xmalloc (sizeof *tail);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 tail->id.g = gid;
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
145 tail->name = grent ? xstrdup (grent->gr_name) : 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 /* Add to the head of the list, so most recently used is first. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148 tail->next = group_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149 group_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150 return tail->name;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151 }
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152
967
029c8dd12d60 (getuser): Return NULL (rather than stringified uid) upon lookup failure.
Jim Meyering <jim@meyering.net>
parents: 650
diff changeset
153 /* Translate GROUP to a GID, with cache.
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154 Return NULL if there is no such group.
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 (We also cache which group names have no group entry,
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 so we don't keep looking them up.) */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
157
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
158 gid_t *
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
159 getgidbyname (const char *group)
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
160 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161 register struct userid *tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
162 struct group *grent;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
164 for (tail = group_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165 /* Avoid a function call for the most common case. */
1253
78e577d11fb9 update from libit
Jim Meyering <jim@meyering.net>
parents: 1138
diff changeset
166 if (*tail->name == *group && !strcmp (tail->name, group))
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167 return &tail->id.g;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
169 for (tail = nogroup_alist; tail; tail = tail->next)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170 /* Avoid a function call for the most common case. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 if (*tail->name == *group && !strcmp (tail->name, group))
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 return 0;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174 grent = getgrnam (group);
1261
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
175 #ifdef __DJGPP__
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
176 /* We need to pretend to belong to group GROUP, to make
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
177 grp functions know about any arbitrary group name. */
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
178 if (!grent && strspn (group, digits) < strlen (group))
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
179 {
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
180 setenv ("GROUP", group, 1);
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
181 grent = getgrnam (group); /* now it will succeed */
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
182 }
67cadf165f7f (getuidbyname) [__DJGPP__]: Make function know about
Jim Meyering <jim@meyering.net>
parents: 1253
diff changeset
183 #endif
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184
5949
9300a4e513e9 (getuser, getuidbyname, getgroup, getgidbyname):
Jim Meyering <jim@meyering.net>
parents: 5907
diff changeset
185 tail = xmalloc (sizeof *tail);
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186 tail->name = xstrdup (group);
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
187
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 /* Add to the head of the list, so most recently used is first. */
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
189 if (grent)
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 {
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191 tail->id.g = grent->gr_gid;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 tail->next = group_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
193 group_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 return &tail->id.g;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195 }
650
b4ef1c1a0171 update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents: 5
diff changeset
196
5
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
197 tail->next = nogroup_alist;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198 nogroup_alist = tail;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199 return 0;
41c9d08b09d7 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200 }