Mercurial > hg > octave-lojdl > gnulib-hg
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 |
rev | line source |
---|---|
818 | 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 | 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 | 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 | 9 |
10 This program is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
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 | 17 |
18 /* written by Jim Meyering */ | |
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 | 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 | 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 | 45 |
12278 | 46 /* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, NULL) always |
47 fails. On other systems, it returns the number of supplemental | |
48 groups for the process. This function handles that special case | |
49 and lets the system-provided function handle all others. However, | |
50 it can fail with ENOMEM if memory is tight. It is unspecified | |
51 whether the effective group id is included in the list. */ | |
818 | 52 |
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 | 55 { |
834 | 56 int n_groups; |
818 | 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 | 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 | 92 |
93 n = 20; | |
94 while (1) | |
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 | 97 since the ancient systems that we're running on have low |
98 limits on the number of secondary groups. */ | |
12278 | 99 gbuf = malloc (n * sizeof *gbuf); |
100 if (!gbuf) | |
101 return -1; | |
834 | 102 n_groups = getgroups (n, gbuf); |
12277 | 103 if (n_groups == -1 ? errno != EINVAL : n_groups < n) |
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 | 106 n *= 2; |
818 | 107 } |
108 | |
4795
ac6111c4f643
Include <errno.h>, <stdlib.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4504
diff
changeset
|
109 saved_errno = errno; |
818 | 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 | 112 |
834 | 113 return n_groups; |
818 | 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 */ |