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