Switching to GPL 3.
[rsync/rsync.git] / getgroups.c
index 8bb82f5..fa014f4 100644 (file)
@@ -1,46 +1,35 @@
 /*
- * Copyright (C) 2002 by Martin Pool
- * 
+ * Print out the gids of all groups for the current user.  This is like
+ * `id -G` on Linux, but it's too hard to find a portable equivalent.
+ *
+ * Copyright (C) 2002 Martin Pool
+ * Copyright (C) 2003-2007 Wayne Davison
+ *
  * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/**
- * @file getgroups.c
  *
- * Print out the gids of all groups for the current user.  This is
- * like `id -G` on Linux, but it's too hard to find a portable
- * equivalent.
- **/
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, visit the http://fsf.org website.
+ */
 
 #include "rsync.h"
 
-#ifndef NGROUPS_MAX
-/* It ought to be defined, but just in case. */
-#  define NGROUPS_MAX 32
-#endif
-
 int
 main(UNUSED(int argc), UNUSED(char *argv[]))
 {
        int n, i;
-       gid_t list[NGROUPS_MAX];
+       gid_t *list;
        gid_t gid = MY_GID();
        int gid_in_list = 0;
 
 #ifdef HAVE_GETGROUPS
-       if ((n = getgroups(NGROUPS_MAX, list)) < 0) {
+       if ((n = getgroups(0, NULL)) < 0) {
                perror("getgroups");
                return 1;
        }
@@ -48,6 +37,17 @@ main(UNUSED(int argc), UNUSED(char *argv[]))
        n = 0;
 #endif
 
+       list = (gid_t*)malloc(sizeof (gid_t) * (n + 1));
+       if (!list) {
+               fprintf(stderr, "out of memory!\n");
+               exit(1);
+       }
+
+#ifdef HAVE_GETGROUPS
+       if (n > 0)
+               n = getgroups(n, list);
+#endif
+
        for (i = 0; i < n; i++)  {
                printf("%lu ", (unsigned long)list[i]);
                if (list[i] == gid)
@@ -57,6 +57,6 @@ main(UNUSED(int argc), UNUSED(char *argv[]))
        if (!gid_in_list)
                printf("%lu", (unsigned long)gid);
        printf("\n");
-               
+
        return 0;
 }