maint: update copyright
[gnulib.git] / lib / getugroups.c
index 6c557cd..d6634ba 100644 (file)
@@ -1,6 +1,6 @@
 /* getugroups.c -- return a list of the groups a user is in
 
-   Copyright (C) 1990, 1991, 1998-2000, 2003-2007 Free Software Foundation.
+   Copyright (C) 1990-1991, 1998-2000, 2003-2014 Free Software Foundation, Inc.
 
    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
 
 #include "getugroups.h"
 
+#include <errno.h>
+#include <limits.h>
 #include <stdio.h> /* grp.h on alpha OSF1 V2.0 uses "FILE *". */
-#include <grp.h>
-
+#include <string.h>
 #include <unistd.h>
 
-#include <errno.h>
-#ifndef EOVERFLOW
-# define EOVERFLOW EINVAL
-#endif
+#if !HAVE_GRP_H
 
-/* Some old header files might not declare setgrent, getgrent, and endgrent.
-   If you don't have them at all, we can't implement this function.
-   You lose!  */
-struct group *getgrent ();
+/* Mingw lacks all things related to group management.  The best we
+   can do is fail with ENOSYS.  */
 
-#include <string.h>
+int
+getugroups (int maxcount _GL_UNUSED,
+            gid_t *grouplist _GL_UNUSED,
+            char const *username _GL_UNUSED,
+            gid_t gid _GL_UNUSED)
+{
+  errno = ENOSYS;
+  return -1;
+}
 
-#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+#else /* HAVE_GRP_H */
+# include <grp.h>
 
-/* Like `getgroups', but for user USERNAME instead of for the current
+# define STREQ(a, b) (strcmp (a, b) == 0)
+
+/* Like 'getgroups', but for user USERNAME instead of for the current
    process.  Store at most MAXCOUNT group IDs in the GROUPLIST array.
    If GID is not -1, store it first (if possible).  GID should be the
    group ID (pw_gid) obtained from getpwuid, in case USERNAME is not
@@ -48,15 +55,15 @@ struct group *getgrent ();
    Otherwise, return the number of IDs we've written into GROUPLIST.  */
 
 int
-getugroups (int maxcount, GETGROUPS_T *grouplist, char const *username,
-           gid_t gid)
+getugroups (int maxcount, gid_t *grouplist, char const *username,
+            gid_t gid)
 {
   int count = 0;
 
   if (gid != (gid_t) -1)
     {
       if (maxcount != 0)
-       grouplist[count] = gid;
+        grouplist[count] = gid;
       ++count;
     }
 
@@ -69,37 +76,37 @@ getugroups (int maxcount, GETGROUPS_T *grouplist, char const *username,
       errno = 0;
       grp = getgrent ();
       if (grp == NULL)
-       break;
+        break;
 
       for (cp = grp->gr_mem; *cp; ++cp)
-       {
-         int n;
-
-         if ( ! STREQ (username, *cp))
-           continue;
-
-         /* See if this group number is already on the list.  */
-         for (n = 0; n < count; ++n)
-           if (grouplist && grouplist[n] == grp->gr_gid)
-             break;
-
-         /* If it's a new group number, then try to add it to the list.  */
-         if (n == count)
-           {
-             if (maxcount != 0)
-               {
-                 if (count >= maxcount)
-                   goto done;
-                 grouplist[count] = grp->gr_gid;
-               }
-             count++;
-             if (count < 0)
-               {
-                 errno = EOVERFLOW;
-                 goto done;
-               }
-           }
-       }
+        {
+          int n;
+
+          if ( ! STREQ (username, *cp))
+            continue;
+
+          /* See if this group number is already on the list.  */
+          for (n = 0; n < count; ++n)
+            if (grouplist && grouplist[n] == grp->gr_gid)
+              break;
+
+          /* If it's a new group number, then try to add it to the list.  */
+          if (n == count)
+            {
+              if (maxcount != 0)
+                {
+                  if (count >= maxcount)
+                    goto done;
+                  grouplist[count] = grp->gr_gid;
+                }
+              if (count == INT_MAX)
+                {
+                  errno = EOVERFLOW;
+                  goto done;
+                }
+              count++;
+            }
+        }
     }
 
   if (errno != 0)
@@ -114,3 +121,5 @@ getugroups (int maxcount, GETGROUPS_T *grouplist, char const *username,
 
   return count;
 }
+
+#endif /* HAVE_GRP_H */