1# select.m4 serial 7 2dnl Copyright (C) 2009-2014 Free Software Foundation, Inc. 3dnl This file is free software; the Free Software Foundation 4dnl gives unlimited permission to copy and/or distribute it, 5dnl with or without modifications, as long as this notice is preserved. 6 7AC_DEFUN([gl_FUNC_SELECT], 8[ 9 AC_REQUIRE([gl_HEADER_SYS_SELECT]) 10 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 11 AC_REQUIRE([gl_SOCKETS]) 12 if test "$ac_cv_header_winsock2_h" = yes; then 13 REPLACE_SELECT=1 14 else 15 dnl On Interix 3.5, select(0, NULL, NULL, NULL, timeout) fails with error 16 dnl EFAULT. 17 AC_CHECK_HEADERS_ONCE([sys/select.h]) 18 AC_CACHE_CHECK([whether select supports a 0 argument], 19 [gl_cv_func_select_supports0], 20 [ 21 AC_RUN_IFELSE([AC_LANG_SOURCE([[ 22#include <sys/types.h> 23#include <sys/time.h> 24#if HAVE_SYS_SELECT_H 25#include <sys/select.h> 26#endif 27int main () 28{ 29 struct timeval timeout; 30 timeout.tv_sec = 0; 31 timeout.tv_usec = 5; 32 return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0; 33}]])], [gl_cv_func_select_supports0=yes], [gl_cv_func_select_supports0=no], 34 [ 35changequote(,)dnl 36 case "$host_os" in 37 # Guess no on Interix. 38 interix*) gl_cv_func_select_supports0="guessing no";; 39 # Guess yes otherwise. 40 *) gl_cv_func_select_supports0="guessing yes";; 41 esac 42changequote([,])dnl 43 ]) 44 ]) 45 case "$gl_cv_func_select_supports0" in 46 *yes) ;; 47 *) REPLACE_SELECT=1 ;; 48 esac 49 50 dnl On FreeBSD 8.2, select() doesn't always reject bad fds. 51 AC_CACHE_CHECK([whether select detects invalid fds], 52 [gl_cv_func_select_detects_ebadf], 53 [ 54 AC_RUN_IFELSE([AC_LANG_PROGRAM([[ 55#include <sys/types.h> 56#include <sys/time.h> 57#if HAVE_SYS_SELECT_H 58# include <sys/select.h> 59#endif 60#include <unistd.h> 61#include <errno.h> 62]],[[ 63 fd_set set; 64 dup2(0, 16); 65 FD_ZERO(&set); 66 FD_SET(16, &set); 67 close(16); 68 struct timeval timeout; 69 timeout.tv_sec = 0; 70 timeout.tv_usec = 5; 71 return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF; 72]])], [gl_cv_func_select_detects_ebadf=yes], 73 [gl_cv_func_select_detects_ebadf=no], 74 [ 75 case "$host_os" in 76 # Guess yes on glibc systems. 77 *-gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;; 78 # If we don't know, assume the worst. 79 *) gl_cv_func_select_detects_ebadf="guessing no" ;; 80 esac 81 ]) 82 ]) 83 case $gl_cv_func_select_detects_ebadf in 84 *yes) ;; 85 *) REPLACE_SELECT=1 ;; 86 esac 87 fi 88 89 dnl Determine the needed libraries. 90 LIB_SELECT="$LIBSOCKET" 91 if test $REPLACE_SELECT = 1; then 92 case "$host_os" in 93 mingw*) 94 dnl On the MSVC platform, the function MsgWaitForMultipleObjects 95 dnl (used in lib/select.c) requires linking with -luser32. On mingw, 96 dnl it is implicit. 97 AC_LINK_IFELSE( 98 [AC_LANG_SOURCE([[ 99#define WIN32_LEAN_AND_MEAN 100#include <windows.h> 101int 102main () 103{ 104 MsgWaitForMultipleObjects (0, NULL, 0, 0, 0); 105 return 0; 106}]])], 107 [], 108 [LIB_SELECT="$LIB_SELECT -luser32"]) 109 ;; 110 esac 111 fi 112 AC_SUBST([LIB_SELECT]) 113]) 114