annotate lib/getgroups.c @ 16229:daac1ca4c436

inttypes: Modernize. * lib/inttypes.in.h (strtoimax, strtoumax): Use the C++ safe idioms. * modules/inttypes-incomplete (Depends-on): Add snippet/c++defs. (Makefile.am): Update inttypes.h rule.
author Bruno Haible <bruno@clisp.org>
date Thu, 05 Jan 2012 18:42:08 +0100
parents 8250f2777afc
children e542fd46ad6f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* provide consistent interface to getgroups for systems that don't allow N==0
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
2
16201
8250f2777afc maint: update all copyright year number ranges
Jim Meyering <meyering@redhat.com>
parents: 14079
diff changeset
3 Copyright (C) 1996, 1999, 2003, 2006-2012 Free Software Foundation, Inc.
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
5 This program is free software: you can redistribute it and/or modify
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 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: 7302
diff changeset
7 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: 7302
diff changeset
8 (at your option) any later version.
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13 GNU General Public License for more details.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 /* written by Jim Meyering */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
20 #include <config.h>
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
21
12278
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
22 #include <unistd.h>
10708
829e51d54702 getgroups: fix compilation when getgroups is available
Eric Blake <ebb9@byu.net>
parents: 9353
diff changeset
23
4795
ac6111c4f643 Include <errno.h>, <stdlib.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4504
diff changeset
24 #include <errno.h>
ac6111c4f643 Include <errno.h>, <stdlib.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4504
diff changeset
25 #include <stdlib.h>
12283
b49120535c36 getgroups: avoid compilation failure
Eric Blake <ebb9@byu.net>
parents: 12280
diff changeset
26 #include <stdint.h>
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27
12279
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
28 #if !HAVE_GETGROUPS
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
29
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
30 /* Provide a stub that fails with ENOSYS, since there is no group
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
31 information available on mingw. */
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
32 int
12482
11bc92a9e2bc gnulib-common: prefer _GL_UNUSED over _UNUSED_PARAMETER_
Eric Blake <ebb9@byu.net>
parents: 12285
diff changeset
33 getgroups (int n _GL_UNUSED, GETGROUPS_T *groups _GL_UNUSED)
12279
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
34 {
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
35 errno = ENOSYS;
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
36 return -1;
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
37 }
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
38
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
39 #else /* HAVE_GETGROUPS */
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
40
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
41 # undef getgroups
12284
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
42 # ifndef GETGROUPS_ZERO_BUG
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
43 # define GETGROUPS_ZERO_BUG 0
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
44 # endif
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45
12278
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
46 /* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, NULL) always
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
47 fails. On other systems, it returns the number of supplemental
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
48 groups for the process. This function handles that special case
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
49 and lets the system-provided function handle all others. However,
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
50 it can fail with ENOMEM if memory is tight. It is unspecified
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
51 whether the effective group id is included in the list. */
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 int
12280
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
54 rpl_getgroups (int n, gid_t *group)
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 {
834
fdac0a9e1190 Add comment.
Jim Meyering <jim@meyering.net>
parents: 818
diff changeset
56 int n_groups;
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 GETGROUPS_T *gbuf;
4795
ac6111c4f643 Include <errno.h>, <stdlib.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4504
diff changeset
58 int saved_errno;
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59
12284
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
60 if (n < 0)
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
61 {
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
62 errno = EINVAL;
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
63 return -1;
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
64 }
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
65
fcf83d7e45e4 getgroups: work around FreeBSD bug
Eric Blake <ebb9@byu.net>
parents: 12283
diff changeset
66 if (n != 0 || !GETGROUPS_ZERO_BUG)
12280
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
67 {
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
68 int result;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
69 if (sizeof *group == sizeof *gbuf)
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
70 return getgroups (n, (GETGROUPS_T *) group);
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
71
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
72 if (SIZE_MAX / sizeof *gbuf <= n)
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
73 {
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
74 errno = ENOMEM;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
75 return -1;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
76 }
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
77 gbuf = malloc (n * sizeof *gbuf);
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
78 if (!gbuf)
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
79 return -1;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
80 result = getgroups (n, gbuf);
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
81 if (0 <= result)
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
82 {
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
83 n = result;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
84 while (n--)
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
85 group[n] = gbuf[n];
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
86 }
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
87 saved_errno = errno;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
88 free (gbuf);
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
89 errno == saved_errno;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
90 return result;
39be377f1765 getgroups: don't expose GETGROUPS_T to user
Eric Blake <ebb9@byu.net>
parents: 12279
diff changeset
91 }
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 n = 20;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 while (1)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 {
4795
ac6111c4f643 Include <errno.h>, <stdlib.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4504
diff changeset
96 /* No need to worry about address arithmetic overflow here,
12277
502247708da6 getgroups: fix logic error
Eric Blake <ebb9@byu.net>
parents: 10708
diff changeset
97 since the ancient systems that we're running on have low
502247708da6 getgroups: fix logic error
Eric Blake <ebb9@byu.net>
parents: 10708
diff changeset
98 limits on the number of secondary groups. */
12278
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
99 gbuf = malloc (n * sizeof *gbuf);
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
100 if (!gbuf)
0a3dcff9559e getgroups: avoid calling exit
Eric Blake <ebb9@byu.net>
parents: 12277
diff changeset
101 return -1;
834
fdac0a9e1190 Add comment.
Jim Meyering <jim@meyering.net>
parents: 818
diff changeset
102 n_groups = getgroups (n, gbuf);
12277
502247708da6 getgroups: fix logic error
Eric Blake <ebb9@byu.net>
parents: 10708
diff changeset
103 if (n_groups == -1 ? errno != EINVAL : n_groups < n)
502247708da6 getgroups: fix logic error
Eric Blake <ebb9@byu.net>
parents: 10708
diff changeset
104 break;
4824
b3e190d8e109 (getgroups): Don't use xrealloc, since we don't need the buffer
Paul Eggert <eggert@cs.ucla.edu>
parents: 4795
diff changeset
105 free (gbuf);
12277
502247708da6 getgroups: fix logic error
Eric Blake <ebb9@byu.net>
parents: 10708
diff changeset
106 n *= 2;
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108
4795
ac6111c4f643 Include <errno.h>, <stdlib.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4504
diff changeset
109 saved_errno = errno;
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 free (gbuf);
4795
ac6111c4f643 Include <errno.h>, <stdlib.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4504
diff changeset
111 errno = saved_errno;
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112
834
fdac0a9e1190 Add comment.
Jim Meyering <jim@meyering.net>
parents: 818
diff changeset
113 return n_groups;
818
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 }
12279
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
115
6a41b8f5f874 getgroups, getugroups: provide stubs for mingw
Eric Blake <ebb9@byu.net>
parents: 12278
diff changeset
116 #endif /* HAVE_GETGROUPS */