1# serial 24
2
3dnl From Jim Meyering.
4dnl A wrapper around AC_FUNC_GETGROUPS.
5
6# Copyright (C) 1996-1997, 1999-2004, 2008-2021 Free Software Foundation, Inc.
7#
8# This file is free software; the Free Software Foundation
9# gives unlimited permission to copy and/or distribute it,
10# with or without modifications, as long as this notice is preserved.
11
12# This is taken from the following Autoconf patch:
13# https://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=7fbb553727ed7e0e689a17594b58559ecf3ea6e9
14AC_DEFUN([AC_FUNC_GETGROUPS],
15[
16  AC_REQUIRE([AC_TYPE_GETGROUPS])dnl
17  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
18  AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
19  AC_CHECK_FUNC([getgroups])
20
21  # If we don't yet have getgroups, see if it's in -lbsd.
22  # This is reported to be necessary on an ITOS 3000WS running SEIUX 3.1.
23  ac_save_LIBS=$LIBS
24  if test $ac_cv_func_getgroups = no; then
25    AC_CHECK_LIB(bsd, getgroups, [GETGROUPS_LIB=-lbsd])
26  fi
27
28  # Run the program to test the functionality of the system-supplied
29  # getgroups function only if there is such a function.
30  if test $ac_cv_func_getgroups = yes; then
31    AC_CACHE_CHECK([for working getgroups], [ac_cv_func_getgroups_works],
32      [AC_RUN_IFELSE(
33         [AC_LANG_PROGRAM(
34            [AC_INCLUDES_DEFAULT],
35            [[/* On NeXTstep 3.2, getgroups (0, 0) always fails.  */
36              return getgroups (0, 0) == -1;]])
37         ],
38         [ac_cv_func_getgroups_works=yes],
39         [ac_cv_func_getgroups_works=no],
40         [case "$host_os" in # ((
41                           # Guess yes on glibc systems.
42            *-gnu* | gnu*) ac_cv_func_getgroups_works="guessing yes" ;;
43                           # Guess yes on musl systems.
44            *-musl*)       ac_cv_func_getgroups_works="guessing yes" ;;
45                           # If we don't know, obey --enable-cross-guesses.
46            *)             ac_cv_func_getgroups_works="$gl_cross_guess_normal" ;;
47          esac
48         ])
49      ])
50  else
51    ac_cv_func_getgroups_works=no
52  fi
53  case "$ac_cv_func_getgroups_works" in
54    *yes)
55      AC_DEFINE([HAVE_GETGROUPS], [1],
56        [Define to 1 if your system has a working `getgroups' function.])
57      ;;
58  esac
59  LIBS=$ac_save_LIBS
60])# AC_FUNC_GETGROUPS
61
62AC_DEFUN([gl_FUNC_GETGROUPS],
63[
64  AC_REQUIRE([AC_TYPE_GETGROUPS])
65  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
66  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
67
68  AC_FUNC_GETGROUPS
69  if test $ac_cv_func_getgroups != yes; then
70    HAVE_GETGROUPS=0
71  else
72    if test "$ac_cv_type_getgroups" != gid_t \
73       || { case "$ac_cv_func_getgroups_works" in
74              *yes) false;;
75              *) true;;
76            esac
77          }; then
78      REPLACE_GETGROUPS=1
79      AC_DEFINE([GETGROUPS_ZERO_BUG], [1], [Define this to 1 if
80        getgroups(0,NULL) does not return the number of groups.])
81    else
82      dnl Detect Mac OS X and FreeBSD bug; POSIX requires getgroups(-1,ptr)
83      dnl to fail.
84      AC_CACHE_CHECK([whether getgroups handles negative values],
85        [gl_cv_func_getgroups_works],
86        [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
87          [[int size = getgroups (0, 0);
88            gid_t *list = malloc (size * sizeof *list);
89            int result = getgroups (-1, list) != -1;
90            free (list);
91            return result;]])],
92          [gl_cv_func_getgroups_works=yes],
93          [gl_cv_func_getgroups_works=no],
94          [case "$host_os" in
95                            # Guess yes on glibc systems.
96             *-gnu* | gnu*) gl_cv_func_getgroups_works="guessing yes" ;;
97                            # Guess yes on musl systems.
98             *-musl*)       gl_cv_func_getgroups_works="guessing yes" ;;
99                            # If we don't know, obey --enable-cross-guesses.
100             *)             gl_cv_func_getgroups_works="$gl_cross_guess_normal" ;;
101           esac
102          ])])
103      case "$gl_cv_func_getgroups_works" in
104        *yes) ;;
105        *) REPLACE_GETGROUPS=1 ;;
106      esac
107    fi
108  fi
109  test -n "$GETGROUPS_LIB" && LIBS="$GETGROUPS_LIB $LIBS"
110])
111