Jim Meyering wrote:
I compiled the just-published snapshot on OS X configured with
--enable-gcc-warnings, and saw this:

lib/mgetgroups.c: In function 'mgetgroups':
lib/mgetgroups.c:90:45: error: pointer targets in passing argument 3
of 'getgrouplist' differ in signedness [-Werror=pointer-sign]
            ng = getgrouplist (username, gid, g, &max_n_groups);

Does the attached gnulib patch fix things for you on OS X?

Its documentation lists OS X 10.11 (released this month), as I assume the incompatiblity is in the latest version of OS X and that Apple's never going to fix it....
>From f805d38258639f45d95b01139e669752651cd1d7 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Sun, 28 Jun 2015 23:43:35 -0700
Subject: [PATCH] mgetgroups: port to strict OS X

* doc/glibc-functions/getgrouplist.texi (getgrouplist):
Document the getgrouplist problem.
* lib/mgetgroups.c (getgrouplist_gids) [HAVE_GETGROUPLIST]:
New macro.
(mgetgroups): Use it.
* m4/mgetgroups.m4 (gl_MGETGROUPS):
Check for OS X signature for getgrouplist.
---
 ChangeLog                             | 11 ++++++++++
 doc/glibc-functions/getgrouplist.texi |  4 ++++
 lib/mgetgroups.c                      |  8 +++++++-
 m4/mgetgroups.m4                      | 38 ++++++++++++++++++++++++++++++++++-
 4 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5525922..5dc6f80 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2015-06-28  Paul Eggert  <[email protected]>
+
+	mgetgroups: port to strict OS X
+	* doc/glibc-functions/getgrouplist.texi (getgrouplist):
+	Document the getgrouplist problem.
+	* lib/mgetgroups.c (getgrouplist_gids) [HAVE_GETGROUPLIST]:
+	New macro.
+	(mgetgroups): Use it.
+	* m4/mgetgroups.m4 (gl_MGETGROUPS):
+	Check for OS X signature for getgrouplist.
+
 2015-06-28  Jim Meyering  <[email protected]>
 
 	mountlist: avoid an unused-label warning on OS X
diff --git a/doc/glibc-functions/getgrouplist.texi b/doc/glibc-functions/getgrouplist.texi
index 8a37cb1..0295cae 100644
--- a/doc/glibc-functions/getgrouplist.texi
+++ b/doc/glibc-functions/getgrouplist.texi
@@ -11,6 +11,10 @@ Portability problems fixed by Gnulib:
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+This function takes @code{int} instead of @code{gid_t} parameters
+on some platforms: OS X 10.11.
+
+@item
 This function is missing on some platforms:
 Minix 3.1.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 11 2011-11, Cygwin 1.7.9, mingw, MSVC 9, BeOS.
 @end itemize
diff --git a/lib/mgetgroups.c b/lib/mgetgroups.c
index f31f4d1..dd0c7a5 100644
--- a/lib/mgetgroups.c
+++ b/lib/mgetgroups.c
@@ -64,6 +64,11 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups)
   gid_t *g;
 
 #if HAVE_GETGROUPLIST
+# if HAVE_GETGROUPLIST_WITH_INT
+#  define getgrouplist_gids(g) ((int *) (g))
+# else
+#  define getgrouplist_gids(g) (g)
+# endif
   /* We prefer to use getgrouplist if available, because it has better
      performance characteristics.
 
@@ -87,7 +92,8 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups)
           int last_n_groups = max_n_groups;
 
           /* getgrouplist updates max_n_groups to num required.  */
-          ng = getgrouplist (username, gid, g, &max_n_groups);
+          ng = getgrouplist (username, gid, getgrouplist_gids (g),
+                             &max_n_groups);
 
           /* Some systems (like Darwin) have a bug where they
              never increase max_n_groups.  */
diff --git a/m4/mgetgroups.m4 b/m4/mgetgroups.m4
index 42b5cf8..5f19d4f 100644
--- a/m4/mgetgroups.m4
+++ b/m4/mgetgroups.m4
@@ -1,4 +1,4 @@
-#serial 5
+#serial 6
 dnl Copyright (C) 2007-2015 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -6,5 +6,41 @@ dnl with or without modifications, as long as this notice is preserved.
 
 AC_DEFUN([gl_MGETGROUPS],
 [
+  AC_CHECK_HEADERS_ONCE([grp.h])
   AC_CHECK_FUNCS_ONCE([getgrouplist])
+  if test "$ac_cv_func_getgrouplist" = yes; then
+    AC_CACHE_CHECK([for getgrouplist with int signature],
+      [gl_cv_getgrouplist_with_int],
+      [gl_cv_getgrouplist_with_int=no
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[#if HAVE_GRP_H
+               #include <grp.h>
+              #endif
+              int groups[1];
+              int ngroups = 1;
+              int getgrouplist (char const *, gid_t, gid_t *, int *);
+            ]],
+            [[
+              return - getgrouplist ("root", 0, groups, &ngroups);
+            ]])],
+         [],
+         [AC_COMPILE_IFELSE(
+           [AC_LANG_PROGRAM(
+              [[#if HAVE_GRP_H
+                 #include <grp.h>
+                #endif
+                int groups[sizeof (gid_t) == sizeof (int) ? 1 : -1];
+                int ngroups = 1;
+                int getgrouplist (char const *, int, int *, int *);
+              ]],
+              [[
+                return - getgrouplist ("root", 0, groups, &ngroups);
+              ]])],
+            [gl_cv_getgrouplist_with_int=yes])])])
+    if test "$gl_cv_getgrouplist_with_int" = yes; then
+      AC_DEFINE([HAVE_GETGROUPLIST_WITH_INT], 1,
+        [Define to 1 if getgrouplist accepts and returns int and not gid_t.])
+    fi
+  fi
 ])
-- 
2.1.0

Reply via email to