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.
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.
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. */
-#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,
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
])