pselect.m4 2.37 KB
Newer Older
Paul Eggert's avatar
Paul Eggert committed
1
# pselect.m4 serial 8
Paul Eggert's avatar
Paul Eggert committed
2
dnl Copyright (C) 2011-2020 Free Software Foundation, Inc.
3 4 5 6 7 8 9 10
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

AC_DEFUN([gl_FUNC_PSELECT],
[
  AC_REQUIRE([gl_HEADER_SYS_SELECT])
  AC_REQUIRE([AC_C_RESTRICT])
Paul Eggert's avatar
Paul Eggert committed
11
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
12 13 14 15
  AC_CHECK_FUNCS_ONCE([pselect])

  if test $ac_cv_func_pselect = yes; then
    AC_CACHE_CHECK([whether signature of pselect conforms to POSIX],
Paul Eggert's avatar
Paul Eggert committed
16
      [gl_cv_sig_pselect],
17 18 19 20 21 22 23 24 25 26
      [AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
              [[#include <sys/select.h>
                ]],
              [[int (*p) (int, fd_set *, fd_set *, fd_set *restrict,
                          struct timespec const *restrict,
                          sigset_t const *restrict) = pselect;
                return !p;]])],
         [gl_cv_sig_pselect=yes],
         [gl_cv_sig_pselect=no])])
Paul Eggert's avatar
Paul Eggert committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

    dnl On FreeBSD 8.2, pselect() doesn't always reject bad fds.
    AC_CACHE_CHECK([whether pselect detects invalid fds],
      [gl_cv_func_pselect_detects_ebadf],
      [
        AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <sys/types.h>
#include <sys/time.h>
#if HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
#include <unistd.h>
#include <errno.h>
]],[[
  fd_set set;
  dup2(0, 16);
  FD_ZERO(&set);
  FD_SET(16, &set);
  close(16);
  struct timespec timeout;
  timeout.tv_sec = 0;
  timeout.tv_nsec = 5000;
  return pselect (17, &set, NULL, NULL, &timeout, NULL) != -1 || errno != EBADF;
]])], [gl_cv_func_pselect_detects_ebadf=yes],
      [gl_cv_func_pselect_detects_ebadf=no],
          [
           case "$host_os" in
Paul Eggert's avatar
Paul Eggert committed
54 55 56 57
                             # Guess yes on Linux systems.
            linux-* | linux) gl_cv_func_pselect_detects_ebadf="guessing yes" ;;
                             # Guess yes on glibc systems.
            *-gnu* | gnu*)   gl_cv_func_pselect_detects_ebadf="guessing yes" ;;
Paul Eggert's avatar
Paul Eggert committed
58 59
                             # If we don't know, obey --enable-cross-guesses.
            *)               gl_cv_func_pselect_detects_ebadf="$gl_cross_guess_normal" ;;
Paul Eggert's avatar
Paul Eggert committed
60 61 62 63 64 65 66
           esac
          ])
      ])
    case $gl_cv_func_pselect_detects_ebadf in
      *yes) ;;
      *) REPLACE_PSELECT=1 ;;
    esac
67 68 69 70 71 72
  fi

  if test $ac_cv_func_pselect = no || test $gl_cv_sig_pselect = no; then
    REPLACE_PSELECT=1
  fi
])