better select() function detection that works
even when cross compiling a Windows target.
This commit is contained in:
parent
8fc2f8ef62
commit
9346e55d5a
198
acinclude.m4
198
acinclude.m4
@ -1978,6 +1978,204 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
|
|||||||
#
|
#
|
||||||
]) dnl AC_DEFUN
|
]) dnl AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_FUNC_SELECT
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Test if the socket select() function is available,
|
||||||
|
dnl and check its return type and the types of its
|
||||||
|
dnl arguments. If the function succeeds HAVE_SELECT
|
||||||
|
dnl will be defined, defining the types of the
|
||||||
|
dnl arguments in SELECT_TYPE_ARG1, SELECT_TYPE_ARG234
|
||||||
|
dnl and SELECT_TYPE_ARG5, defining the type of the
|
||||||
|
dnl function return value in SELECT_TYPE_RETV, and
|
||||||
|
dnl also defining the type qualifier of fifth argument
|
||||||
|
dnl in SELECT_QUAL_ARG5.
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_STRUCT_TIMEVAL])dnl
|
||||||
|
AC_CHECK_HEADERS(sys/select.h sys/socket.h)
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([for select])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#ifdef TIME_WITH_SYS_TIME
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_TIME_H
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_WINDOWS_H
|
||||||
|
#ifdef HAVE_SYS_SELECT_H
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
select(0, 0, 0, 0, 0);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
curl_cv_select="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
curl_cv_select="no"
|
||||||
|
])
|
||||||
|
#
|
||||||
|
if test "$curl_cv_select" = "yes"; then
|
||||||
|
AC_CACHE_CHECK([types of args and return type for select],
|
||||||
|
[curl_cv_func_select_args], [
|
||||||
|
curl_cv_func_select_args="unknown"
|
||||||
|
for sel_retv in 'int' 'ssize_t'; do
|
||||||
|
for sel_arg1 in 'int' 'ssize_t' 'size_t' 'unsigned long int' 'unsigned int'; do
|
||||||
|
for sel_arg234 in 'fd_set *' 'int *' 'void *'; do
|
||||||
|
for sel_arg5 in 'struct timeval *' 'const struct timeval *'; do
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#define SELECTCALLCONV PASCAL
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#ifdef TIME_WITH_SYS_TIME
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_TIME_H
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_WINDOWS_H
|
||||||
|
#ifdef HAVE_SYS_SELECT_H
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#define SELECTCALLCONV
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_STRUCT_TIMEVAL
|
||||||
|
struct timeval {
|
||||||
|
long tv_sec;
|
||||||
|
long tv_usec;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
extern $sel_retv SELECTCALLCONV select($sel_arg1,
|
||||||
|
$sel_arg234,
|
||||||
|
$sel_arg234,
|
||||||
|
$sel_arg234,
|
||||||
|
$sel_arg5);
|
||||||
|
],[
|
||||||
|
$sel_arg1 nfds=0;
|
||||||
|
$sel_arg234 rfds=0;
|
||||||
|
$sel_arg234 wfds=0;
|
||||||
|
$sel_arg234 efds=0;
|
||||||
|
$sel_retv res = select(nfds, rfds, wfds, efds, 0);
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
curl_cv_func_select_args="$sel_arg1,$sel_arg234,$sel_arg5,$sel_retv"
|
||||||
|
break 4
|
||||||
|
])
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
]) # AC_CACHE_CHECK
|
||||||
|
if test "$curl_cv_func_select_args" = "unknown"; then
|
||||||
|
AC_MSG_WARN([Cannot find proper types to use for select args])
|
||||||
|
AC_MSG_WARN([HAVE_SELECT will not be defined])
|
||||||
|
else
|
||||||
|
select_prev_IFS=$IFS; IFS=','
|
||||||
|
set dummy `echo "$curl_cv_func_select_args" | sed 's/\*/\*/g'`
|
||||||
|
IFS=$select_prev_IFS
|
||||||
|
shift
|
||||||
|
#
|
||||||
|
sel_qual_type_arg5=$[3]
|
||||||
|
#
|
||||||
|
AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1, $[1],
|
||||||
|
[Define to the type of arg 1 for select.])
|
||||||
|
AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234, $[2],
|
||||||
|
[Define to the type of args 2, 3 and 4 for select.])
|
||||||
|
AC_DEFINE_UNQUOTED(SELECT_TYPE_RETV, $[4],
|
||||||
|
[Define to the function return type for select.])
|
||||||
|
#
|
||||||
|
prev_sh_opts=$-
|
||||||
|
#
|
||||||
|
case $prev_sh_opts in
|
||||||
|
*f*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set -f
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
#
|
||||||
|
case "$sel_qual_type_arg5" in
|
||||||
|
const*)
|
||||||
|
sel_qual_arg5=const
|
||||||
|
sel_type_arg5=`echo $sel_qual_type_arg5 | sed 's/^const //'`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
sel_qual_arg5=
|
||||||
|
sel_type_arg5=$sel_qual_type_arg5
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
#
|
||||||
|
AC_DEFINE_UNQUOTED(SELECT_QUAL_ARG5, $sel_qual_arg5,
|
||||||
|
[Define to the type qualifier of arg 5 for select.])
|
||||||
|
AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5, $sel_type_arg5,
|
||||||
|
[Define to the type of arg 5 for select.])
|
||||||
|
#
|
||||||
|
case $prev_sh_opts in
|
||||||
|
*f*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set +f
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
#
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
|
||||||
|
[Define to 1 if you have the select function.])
|
||||||
|
ac_cv_func_select="yes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
dnl check for "localhost", if it doesn't exist, we can't do the
|
dnl check for "localhost", if it doesn't exist, we can't do the
|
||||||
dnl gethostbyname_r tests!
|
dnl gethostbyname_r tests!
|
||||||
|
34
configure.ac
34
configure.ac
@ -1992,7 +1992,7 @@ TYPE_SIG_ATOMIC_T
|
|||||||
|
|
||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
|
|
||||||
AC_FUNC_SELECT_ARGTYPES
|
CURL_CHECK_FUNC_SELECT
|
||||||
|
|
||||||
CURL_CHECK_FUNC_RECV
|
CURL_CHECK_FUNC_RECV
|
||||||
|
|
||||||
@ -2013,7 +2013,6 @@ case $host in
|
|||||||
esac
|
esac
|
||||||
AC_CHECK_FUNCS( strtoll \
|
AC_CHECK_FUNCS( strtoll \
|
||||||
socket \
|
socket \
|
||||||
select \
|
|
||||||
strdup \
|
strdup \
|
||||||
strstr \
|
strstr \
|
||||||
strcasestr \
|
strcasestr \
|
||||||
@ -2067,37 +2066,6 @@ if test "x$skipcheck" != "xyes"; then
|
|||||||
fi
|
fi
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl For some reason, the check above doesn't properly detect select() with
|
|
||||||
dnl Msys/Mingw
|
|
||||||
if test "$ac_cv_func_select" = "no"; then
|
|
||||||
AC_MSG_CHECKING([for select in $winsock_LIB])
|
|
||||||
AC_TRY_LINK([
|
|
||||||
#undef inline
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
#ifndef WIN32_LEAN_AND_MEAN
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#endif
|
|
||||||
#include <windows.h>
|
|
||||||
#ifdef HAVE_WINSOCK2_H
|
|
||||||
#include <winsock2.h>
|
|
||||||
#else
|
|
||||||
#ifdef HAVE_WINSOCK_H
|
|
||||||
#include <winsock.h>
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
],[
|
|
||||||
select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);
|
|
||||||
],[
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
HAVE_SELECT="1"
|
|
||||||
AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
|
|
||||||
[Define to 1 if you have the select function.])
|
|
||||||
],[
|
|
||||||
AC_MSG_ERROR([You can't compile without a select])
|
|
||||||
])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
||||||
dnl we make an extra check here!
|
dnl we make an extra check here!
|
||||||
if test "$ac_cv_func_sigsetjmp" != "yes"; then
|
if test "$ac_cv_func_sigsetjmp" != "yes"; then
|
||||||
|
Loading…
Reference in New Issue
Block a user