mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Should fix fport_input_waiting when neither poll nor select nor FIONREAD are available, which is the case on MinGW. Thanks to Eli Zaretskii for the report.
113 lines
3.2 KiB
Text
113 lines
3.2 KiB
Text
# select.m4 serial 7
|
|
dnl Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
|
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_SELECT],
|
|
[
|
|
AC_REQUIRE([gl_HEADER_SYS_SELECT])
|
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
|
AC_REQUIRE([gl_SOCKETS])
|
|
if test "$ac_cv_header_winsock2_h" = yes; then
|
|
REPLACE_SELECT=1
|
|
else
|
|
dnl On Interix 3.5, select(0, NULL, NULL, NULL, timeout) fails with error
|
|
dnl EFAULT.
|
|
AC_CHECK_HEADERS_ONCE([sys/select.h])
|
|
AC_CACHE_CHECK([whether select supports a 0 argument],
|
|
[gl_cv_func_select_supports0],
|
|
[
|
|
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
|
#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
#if HAVE_SYS_SELECT_H
|
|
#include <sys/select.h>
|
|
#endif
|
|
int main ()
|
|
{
|
|
struct timeval timeout;
|
|
timeout.tv_sec = 0;
|
|
timeout.tv_usec = 5;
|
|
return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0;
|
|
}]])], [gl_cv_func_select_supports0=yes], [gl_cv_func_select_supports0=no],
|
|
[
|
|
changequote(,)dnl
|
|
case "$host_os" in
|
|
# Guess no on Interix.
|
|
interix*) gl_cv_func_select_supports0="guessing no";;
|
|
# Guess yes otherwise.
|
|
*) gl_cv_func_select_supports0="guessing yes";;
|
|
esac
|
|
changequote([,])dnl
|
|
])
|
|
])
|
|
case "$gl_cv_func_select_supports0" in
|
|
*yes) ;;
|
|
*) REPLACE_SELECT=1 ;;
|
|
esac
|
|
|
|
dnl On FreeBSD 8.2, select() doesn't always reject bad fds.
|
|
AC_CACHE_CHECK([whether select detects invalid fds],
|
|
[gl_cv_func_select_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 timeval timeout;
|
|
timeout.tv_sec = 0;
|
|
timeout.tv_usec = 5;
|
|
return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF;
|
|
]])], [gl_cv_func_select_detects_ebadf=yes],
|
|
[gl_cv_func_select_detects_ebadf=no],
|
|
[
|
|
case "$host_os" in
|
|
# Guess yes on glibc systems.
|
|
*-gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;;
|
|
# If we don't know, assume the worst.
|
|
*) gl_cv_func_select_detects_ebadf="guessing no" ;;
|
|
esac
|
|
])
|
|
])
|
|
case $gl_cv_func_select_detects_ebadf in
|
|
*yes) ;;
|
|
*) REPLACE_SELECT=1 ;;
|
|
esac
|
|
fi
|
|
|
|
dnl Determine the needed libraries.
|
|
LIB_SELECT="$LIBSOCKET"
|
|
if test $REPLACE_SELECT = 1; then
|
|
case "$host_os" in
|
|
mingw*)
|
|
dnl On the MSVC platform, the function MsgWaitForMultipleObjects
|
|
dnl (used in lib/select.c) requires linking with -luser32. On mingw,
|
|
dnl it is implicit.
|
|
AC_LINK_IFELSE(
|
|
[AC_LANG_SOURCE([[
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
int
|
|
main ()
|
|
{
|
|
MsgWaitForMultipleObjects (0, NULL, 0, 0, 0);
|
|
return 0;
|
|
}]])],
|
|
[],
|
|
[LIB_SELECT="$LIB_SELECT -luser32"])
|
|
;;
|
|
esac
|
|
fi
|
|
AC_SUBST([LIB_SELECT])
|
|
])
|