Jim Meyering wrote:
the first variant compiled
just fine here (and probably everywhere),
so HAVE_GETGROUPLIST_WITH_INT was not defined.
Yes, well, it did work on GNU/Linux, which is what I tested it on.....
How about if we make the check pickier, so that it is likely to be triggered
even without --enable-gcc-warnings, as in the attached?
>From 99cda43b0f8d5a375a7641eb203e524714947946 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 | 29 ++++++++++++++++++++++++++++-
4 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5525922..1023d87 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2015-06-29 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..9413559 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,32 @@ 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 (*f) (char const *, gid_t, gid_t *, int *) = getgrouplist;
+ ]])],
+ [],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_GRP_H
+ #include <grp.h>
+ #endif
+ int groups[sizeof (gid_t) == sizeof (int) ? 1 : -1];
+ int (*f) (char const *, int, int *, int *) = getgrouplist;
+ ]])],
+ [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