A few more minor doc tweaks.
[rsync.git] / getgroups.c
1 /*
2  * Print out the gids of all groups for the current user.  This is like
3  * `id -G` on Linux, but it's too hard to find a portable equivalent.
4  *
5  * Copyright (C) 2002 Martin Pool
6  * Copyright (C) 2003-2020 Wayne Davison
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 3 as
10  * published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, visit the http://fsf.org website.
19  */
20
21 #include "rsync.h"
22
23  int main(UNUSED(int argc), UNUSED(char *argv[]))
24 {
25         int n, i;
26         gid_t *list;
27         gid_t gid = MY_GID();
28         int gid_in_list = 0;
29
30 #ifdef HAVE_GETGROUPS
31         if ((n = getgroups(0, NULL)) < 0) {
32                 perror("getgroups");
33                 return 1;
34         }
35 #else
36         n = 0;
37 #endif
38
39         list = (gid_t*)malloc(sizeof (gid_t) * (n + 1));
40         if (!list) {
41                 fprintf(stderr, "out of memory!\n");
42                 exit(1);
43         }
44
45 #ifdef HAVE_GETGROUPS
46         if (n > 0)
47                 n = getgroups(n, list);
48 #endif
49
50         for (i = 0; i < n; i++)  {
51                 printf("%lu ", (unsigned long)list[i]);
52                 if (list[i] == gid)
53                         gid_in_list = 1;
54         }
55         /* The default gid might not be in the list on some systems. */
56         if (!gid_in_list)
57                 printf("%lu", (unsigned long)gid);
58         printf("\n");
59
60         return 0;
61 }