818
|
1 /* provide consistent interface to getgroups for systems that don't allow N==0 |
1729
|
2 Copyright (C) 1996, 1999 Free Software Foundation, Inc. |
818
|
3 |
|
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) |
|
7 any later version. |
|
8 |
|
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. |
|
13 |
|
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 Foundation, |
|
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
|
17 |
|
18 /* written by Jim Meyering */ |
|
19 |
|
20 #include <config.h> |
|
21 #include <stdio.h> |
|
22 #include <sys/types.h> |
|
23 |
|
24 char *xmalloc (); |
|
25 |
834
|
26 /* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, 0) always fails. |
|
27 On other systems, it returns the number of supplemental groups for the |
1732
|
28 process. This function handles that special case and lets the system- |
|
29 provided function handle all others. */ |
818
|
30 |
|
31 int |
1729
|
32 getgroups (size_t n, GETGROUPS_T *group) |
818
|
33 { |
834
|
34 int n_groups; |
818
|
35 GETGROUPS_T *gbuf; |
|
36 |
|
37 #undef getgroups |
|
38 |
|
39 if (n != 0) |
|
40 return getgroups (n, group); |
|
41 |
|
42 n = 20; |
|
43 gbuf = NULL; |
|
44 while (1) |
|
45 { |
|
46 gbuf = (GETGROUPS_T *) xrealloc (gbuf, n * sizeof (GETGROUPS_T)); |
834
|
47 n_groups = getgroups (n, gbuf); |
|
48 if (n_groups < n) |
818
|
49 break; |
|
50 n += 10; |
|
51 } |
|
52 |
|
53 free (gbuf); |
|
54 |
834
|
55 return n_groups; |
818
|
56 } |