Jim Meyering wrote:

same result as before:

OK, let's give up on this approach and try something more direct. I installed the attached patch; does it work on OS X?


>From b1a1450d454698a765a625804fe336305209c696 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Tue, 30 Jun 2015 09:32:07 -0700
Subject: [PATCH] mgetgroups: port to strict OS X

The previous fix wasn't working, so use a bigger hammer (Bug#20923).
* lib/mgetgroups.c: Ignore -Wpointer-sign diagnostics.
(getgrouplist_gids) [HAVE_GETGROUPLIST]: Remove.  All uses removed.
* m4/mgetgroups.m4 (gl_MGETGROUPS): Revert recent changes.
---
 ChangeLog        |  8 ++++++++
 lib/mgetgroups.c | 14 +++++++-------
 m4/mgetgroups.m4 | 35 +----------------------------------
 3 files changed, 16 insertions(+), 41 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cb6ca08..37120cd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-06-30  Paul Eggert  <[email protected]>
+
+	mgetgroups: port to strict OS X
+	The previous fix wasn't working, so use a bigger hammer (Bug#20923).
+	* lib/mgetgroups.c: Ignore -Wpointer-sign diagnostics.
+	(getgrouplist_gids) [HAVE_GETGROUPLIST]: Remove.  All uses removed.
+	* m4/mgetgroups.m4 (gl_MGETGROUPS): Revert recent changes.
+
 2015-06-29  Paul Eggert  <[email protected]>
 
 	mgetgroups: port to strict OS X
diff --git a/lib/mgetgroups.c b/lib/mgetgroups.c
index dd0c7a5..6acb019 100644
--- a/lib/mgetgroups.c
+++ b/lib/mgetgroups.c
@@ -33,6 +33,12 @@
 #include "getugroups.h"
 #include "xalloc-oversized.h"
 
+/* Work around an incompatibility of OS X 10.11: getgrouplist
+   accepts int *, not gid_t *, and int and gid_t differ in sign.  */
+#if 4 < __GNUC__ + (3 <= __GNUC_MINOR__)
+# pragma GCC diagnostic ignored "-Wpointer-sign"
+#endif
+
 static gid_t *
 realloc_groupbuf (gid_t *g, size_t num)
 {
@@ -64,11 +70,6 @@ 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.
 
@@ -92,8 +93,7 @@ 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, getgrouplist_gids (g),
-                             &max_n_groups);
+          ng = getgrouplist (username, gid, 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 5747148..42b5cf8 100644
--- a/m4/mgetgroups.m4
+++ b/m4/mgetgroups.m4
@@ -1,4 +1,4 @@
-#serial 7
+#serial 5
 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,38 +6,5 @@ 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
-       gl_save_c_werror_flag=$ac_c_werror_flag
-       ac_c_werror_flag=yes
-       AC_COMPILE_IFELSE(
-         [AC_LANG_PROGRAM(
-            [[#if HAVE_GRP_H
-               #include <grp.h>
-              #endif
-              int groups[1];
-              int ngroups = 1;
-            ]],
-            [[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;
-              ]],
-              [[return - getgrouplist ("root", 0, groups, &ngroups);]])],
-            [gl_cv_getgrouplist_with_int=yes])])
-       ac_c_werror_flag=$gl_save_c_werror_flag])
-    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