changeset 18032:cbcda721f9b4

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.
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 30 Jun 2015 09:32:07 -0700
parents e856c8618738
children f282834ddccc
files ChangeLog lib/mgetgroups.c m4/mgetgroups.m4
diffstat 3 files changed, 16 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-06-30  Paul Eggert  <eggert@cs.ucla.edu>
+
+	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  <eggert@cs.ucla.edu>
 
 	mgetgroups: port to strict OS X
--- 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 @@
   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 @@
           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.  */
--- 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 @@
 
 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
 ])