[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] 08/10: configure: added detection of FD_SETSIZE value an
From: |
gnunet |
Subject: |
[libmicrohttpd] 08/10: configure: added detection of FD_SETSIZE value and ability to override it |
Date: |
Wed, 01 Nov 2023 11:52:23 +0100 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 6e98d63538a3c15fb4fbd92955c56ad82dee9ac5
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Mon Oct 30 19:32:37 2023 +0300
configure: added detection of FD_SETSIZE value and ability to override it
---
configure.ac | 495 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 495 insertions(+)
diff --git a/configure.ac b/configure.ac
index a095fffd..d0fa4315 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1625,6 +1625,501 @@ MHD_FIND_LIB([socket],
MHD_CHECK_SOCKET_SHUTDOWN_TRIGGER([AC_DEFINE([HAVE_LISTEN_SHUTDOWN],[1],[can
use shutdown on listen sockets])])
AM_CONDITIONAL([HAVE_LISTEN_SHUTDOWN], [test
"x$mhd_cv_host_shtdwn_trgr_select" = "xyes"])
+AC_CACHE_CHECK([fo][r system default FD_SETSIZE
value],[mhd_cv_sys_fd_setsize_value],
+ [
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS} -UFD_SETSIZE"
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS} -UFD_SETSIZE"
+ AC_COMPUTE_INT([mhd_cv_sys_fd_setsize_value],[FD_SETSIZE],dnl
+ [[
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SOCKLIB_H
+#include <sockLib.h>
+#endif
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#include <winsock2.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+ ]], [mhd_cv_sys_fd_setsize_value="unknown"]
+ )
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
+ AS_IF([test "x${mhd_cv_sys_fd_setsize_value}" != "xunknown" && \
+ test "${mhd_cv_sys_fd_setsize_value}" -eq "0" \
+ ], [mhd_cv_sys_fd_setsize_value="unknown"]
+ )
+ ]
+)
+AS_VAR_IF([mhd_cv_sys_fd_setsize_value],["unknown"],[:],
+ [
+ AC_DEFINE_UNQUOTED([MHD_SYS_FD_SETSIZE_],[${mhd_cv_sys_fd_setsize_value}],
+ [Define to system default value of FD_SETSIZE macro]
+ )
+ ]
+)
+
+AC_CACHE_CHECK([fo][r current FD_SETSIZE value],[mhd_cv_fd_setsize_value],
+ [
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
+ AS_IF([test "x${cross_compiling}" != "xno" && test
"x${mhd_cv_sys_fd_setsize_value}" != "xunknown"],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SOCKLIB_H
+#include <sockLib.h>
+#endif
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#include <winsock2.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#define DETECTED_FD_SETZIE_VALUE ${mhd_cv_sys_fd_setsize_value}
+
+#if (FD_SETSIZE) != (DETECTED_FD_SETZIE_VALUE)
+#error The current default FD_SETSIZE value is different from
${mhd_cv_sys_fd_setsize_value}
+choke me here now
+#endif /* (FD_SETSIZE) != (DETECTED_FD_SETZIE_VALUE) */
+
+#if (FD_SETSIZE) != (${mhd_cv_sys_fd_setsize_value})
+#error The current default FD_SETSIZE value is different from
${mhd_cv_sys_fd_setsize_value}
+choke me here now
+#endif /* (FD_SETSIZE) != (${mhd_cv_sys_fd_setsize_value}) */
+ ]],[]
+ )
+ ],
+ [mhd_cv_fd_setsize_value="${mhd_cv_sys_fd_setsize_value}"]
+ )
+ ]
+ )
+ AS_VAR_SET_IF([mhd_cv_fd_setsize_value],[:],
+ [
+ AC_COMPUTE_INT([mhd_cv_fd_setsize_value],[FD_SETSIZE],dnl
+ [[
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SOCKLIB_H
+#include <sockLib.h>
+#endif
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#include <winsock2.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+ ]], [mhd_cv_fd_setsize_value="unknown"]
+ )
+ ]
+ )
+ AS_IF([test "x${mhd_cv_fd_setsize_value}" != "xunknown" && \
+ test "${mhd_cv_fd_setsize_value}" -eq "0"],
+ [mhd_cv_fd_setsize_value="unknown"]
+ )
+ ]
+)
+
+
+AC_CACHE_CHECK([whether FD_SETSIZE is
overridable],[mhd_cv_fd_setsize_overridable],
+ [
+ AS_VAR_IF([mhd_cv_fd_setsize_value],["unknown"],
+ [
+ AS_VAR_IF([mhd_cv_sys_fd_setsize_value],["unknown"],
+ [
+ # Assume the most popular FD_SETSIZE value
+ base_fd_setsize=1024
+ ],
+ [base_fd_setsize="${mhd_cv_sys_fd_setsize_value}"]
+ )
+ base_min_fd_setsize="${base_fd_setsize}"
+ ],
+ [
+ AS_VAR_IF([mhd_cv_sys_fd_setsize_value],["unknown"],
+ [
+ base_fd_setsize="${mhd_cv_fd_setsize_value}"
+ base_min_fd_setsize="${base_fd_setsize}"
+ ],
+ [
+ AS_IF([test "${mhd_cv_fd_setsize_value}" -ge
"${mhd_cv_sys_fd_setsize_value}"],
+ [
+ base_fd_setsize="${mhd_cv_fd_setsize_value}"
+ base_min_fd_setsize="${mhd_cv_sys_fd_setsize_value}"
+ ],
+ [
+ base_fd_setsize="${mhd_cv_sys_fd_setsize_value}"
+ base_min_fd_setsize="${mhd_cv_fd_setsize_value}"
+ ]
+ )
+ ]
+ )
+ ]
+ )
+ # Use two times larger FD_SETSIZE value for test
+ AS_VAR_ARITH([test_fd_setsize],[${base_fd_setsize} '+' ${base_fd_setsize}])
+ AS_IF([test "${test_fd_setsize}" -lt "128"],[test_fd_setsize=128])
+ test_type_fd_setsize="larger"
+
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
+
+ _AS_ECHO_LOG([testing whether FD_SETSIZE test value (${test_fd_setsize})
is suitable for 'int' type])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
+ [[
+ static int test_arr1[(((long long)${test_fd_setsize}) !=
((int)${test_fd_setsize})) ? -1 : 1];
+ static int test_arr2[(0 > ((int)${test_fd_setsize})) ? -1 : 1];
+ test_arr1[0] = 0;
+ test_arr2[0] = 0;
+ i][f (test_arr1[0] != test_arr2[0]) return 1;
+ ]]
+ )
+ ],[],
+ [
+ _AS_ECHO_LOG([The selected test FD_SETSIZE value (${test_fd_setsize})
is too large for 'int' type])
+ AS_VAR_ARITH([test_fd_setsize],[${base_min_fd_setsize} '/' '2'])
+ test_type_fd_setsize="smaller"
+ ]
+ )
+
+ _AS_ECHO_LOG([will try ${test_fd_setsize} as FD_SETSIZE value])
+
+ AS_IF([test "x${cross_compiling}" = "xno" && test
"x${test_type_fd_setsize}" = "xlarger"],
+ [
+ _AS_ECHO_LOG([will try ${test_fd_setsize} as FD_SETSIZE value with run
test])
+ AC_RUN_IFELSE(
+ [
+ AC_LANG_SOURCE(
+ [[
+#ifdef FD_SETSIZE
+#undef FD_SETSIZE
+#endif /* FD_SETSIZE */
+
+#define FD_SETSIZE ${test_fd_setsize}
+#define MY_TEST_FD_SETSIZE ${test_fd_setsize}
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SOCKLIB_H
+#include <sockLib.h>
+#endif
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#include <winsock2.h>
+#define MHD_TEST_SOCKET_TYPE SOCKET
+#else
+#define MHD_TEST_SOCKET_TYPE int
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#include <string.h>
+#include <stdio.h>
+
+/* Test fo][r mismatch by macro check */
+#if (FD_SETSIZE) != (MY_TEST_FD_SETSIZE)
+#error System headers ignore custom FD_SETSIZE value, FD_SETSIZE is NOT
${test_fd_setsize}
+choke me here now;
+#endif /* (FD_SETSIZE) != (MY_TEST_FD_SETSIZE) */
+
+/* Additional test fo][r mismatch by macro check */
+#if (FD_SETSIZE) != (${test_fd_setsize})
+#error System headers ignore custom FD_SETSIZE value, FD_SETSIZE is NOT
${test_fd_setsize}
+choke me here now;
+#endif /* (FD_SETSIZE) != (${test_fd_setsize}) */
+
+static unsigned long var_fd_setsize_value = FD_SETSIZE;
+static unsigned long var_my_test_fd_setsize_value = MY_TEST_FD_SETSIZE;
+
+int main(void)
+{
+ fd_set fds_num_one_copy;
+ fd_set fds_num_three_copy;
+ fd_set test_fdsets[6];
+ int i;
+ int ret = 0;
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+ WSADATA wsa_data;
+
+ if (0 != WSAStartup(MAKEWORD(2, 2), &wsa_data))
+ return 21;
+ if (MAKEWORD(2, 2) != wsa_data.wVersion)
+ {
+ WSACleanup();
+ return 22;
+ }
+#endif /* _WIN32 && ! __CYGWIN__ */
+
+ /* Init with zeros to make sure that slack areas are equal */
+ memset(test_fdsets, 0, sizeof(test_fdsets));
+
+ /* Correctly init fd_sets */
+ for (i = 0; i < 6; ++i)
+ FD_ZERO(test_fdsets + i);
+
+ /* Make copies of zero-inited fd_sets */
+ memcpy(&fds_num_one_copy, test_fdsets + 1, sizeof(fd_set));
+ memcpy(&fds_num_three_copy, test_fdsets + 3, sizeof(fd_set));
+
+ if (var_fd_setsize_value != var_my_test_fd_setsize_value)
+ {
+ fprintf (stderr, "System headers redefined FD_SETSIZE to another value
(%lu).\n",
+ (unsigned long) FD_SETSIZE);
+ ret = 2;
+ }
+ else
+ {
+ /* Set (almost) all FDs in test_fdset[2] */
+ for (i = 1; i < FD_SETSIZE; ++i)
+ FD_SET((MHD_TEST_SOCKET_TYPE)i, test_fdsets + 2);
+
+ if (! FD_ISSET((MHD_TEST_SOCKET_TYPE)1, test_fdsets + 2))
+ {
+ fprintf (stderr, "FD number one in original fd_set is unset, while
should be set.\n");
+ ret |= 3;
+ }
+ if (! FD_ISSET((MHD_TEST_SOCKET_TYPE)(FD_SETSIZE - 1), test_fdsets + 2))
+ {
+ fprintf (stderr, "FD number %lu in original fd_set is unset, while
should be set.\n",
+ (unsigned long) FD_SETSIZE);
+ ret |= 3;
+ }
+
+ if (FD_ISSET((MHD_TEST_SOCKET_TYPE)1, test_fdsets + 1))
+ {
+ fprintf (stderr, "FD number one in the first fd_set is unset, while
should be set.\n");
+ ret |= 4;
+ }
+ if (FD_ISSET((MHD_TEST_SOCKET_TYPE)(FD_SETSIZE - 1), test_fdsets + 1))
+ {
+ fprintf (stderr, "FD number %lu in the first fd_set is unset, while
should be set.\n",
+ (unsigned long) FD_SETSIZE);
+ ret |= 4;
+ }
+ if (0 != memcmp (&fds_num_one_copy, test_fdsets + 1, sizeof(fd_set)))
+ {
+ fprintf (stderr, "The first fd_set has been altered.\n");
+ ret |= 4;
+ }
+
+ if (FD_ISSET((MHD_TEST_SOCKET_TYPE)1, test_fdsets + 3))
+ {
+ fprintf (stderr, "FD number one in the third fd_set is unset, while
should be set.\n");
+ ret |= 8;
+ }
+ if (FD_ISSET((MHD_TEST_SOCKET_TYPE)(FD_SETSIZE - 1), test_fdsets + 3))
+ {
+ fprintf (stderr, "FD number %lu in the third fd_set is unset, while
should be set.\n",
+ (unsigned long) FD_SETSIZE);
+ ret |= 8;
+ }
+ if (0 != memcmp (&fds_num_three_copy, test_fdsets + 3, sizeof(fd_set)))
+ {
+ fprintf (stderr, "The third fd_set has been altered.\n");
+ ret |= 8;
+ }
+ }
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+ WSACleanup();
+#endif /* _WIN32 && ! __CYGWIN__ */
+ return ret;
+}
+ ]]
+ )
+ ],
+ [mhd_cv_fd_setsize_overridable="yes"],
+ [mhd_cv_fd_setsize_overridable="no"],
+ [[# Not used when cross-compiling ]]
+ )
+ ],
+ [
+ _AS_ECHO_LOG([will try ${test_fd_setsize} as FD_SETSIZE with simple
compile test])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[
+#ifdef FD_SETSIZE
+#undef FD_SETSIZE
+#endif /* FD_SETSIZE */
+
+#define FD_SETSIZE ${test_fd_setsize}
+#define MY_TEST_FD_SETSIZE ${test_fd_setsize}
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SOCKLIB_H
+#include <sockLib.h>
+#endif
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#include <winsock2.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+/* Test fo][r mismatch by macro check */
+#if (FD_SETSIZE) != (MY_TEST_FD_SETSIZE)
+#error System headers ignore custom FD_SETSIZE value, FD_SETSIZE is NOT
${test_fd_setsize}
+choke me here now
+#endif /* (FD_SETSIZE) != (MY_TEST_FD_SETSIZE) */
+
+/* Additional test fo][r mismatch by macro check */
+#if (FD_SETSIZE) != (${test_fd_setsize})
+#error System headers ignore custom FD_SETSIZE value, FD_SETSIZE is NOT
${test_fd_setsize}
+choke me here now
+#endif /* (FD_SETSIZE) != (${test_fd_setsize}) */
+ ]],[]
+ )
+ ],
+ [
+ _AS_ECHO_LOG([comple test succeed, will check whether another
FD_SETSIZE value changes the size of 'fd_set'])
+
+ # Check current size of fd_set
+ _AS_ECHO_LOG([find the sizeof(fd_setsize) with current default
(${mhd_cv_fd_setsize_value}) FD_SETSIZE value])
+ AC_COMPUTE_INT([sizeof_cur_fd_set],[sizeof(fd_set)],dnl
+ [[
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SOCKLIB_H
+#include <sockLib.h>
+#endif
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#include <winsock2.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+ ]], [sizeof_cur_fd_set="unknown"]
+ )
+ _AS_ECHO_LOG([the sizeof(fd_setsize) with current default
(${mhd_cv_fd_setsize_value}) FD_SETSIZE value is ${sizeof_cur_fd_set}])
+
+ # Check the size of fd_set with redefined FD_SETSIZE
+ _AS_ECHO_LOG([find the sizeof(fd_setsize) with redefined
(${test_fd_setsize}) FD_SETSIZE value])
+ AC_COMPUTE_INT([sizeof_mod_fd_set],[sizeof(fd_set)],dnl
+ [[
+#ifdef FD_SETSIZE
+#undef FD_SETSIZE
+#endif /* FD_SETSIZE */
+
+#define FD_SETSIZE ${test_fd_setsize}
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SOCKLIB_H
+#include <sockLib.h>
+#endif
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#include <winsock2.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+ ]], [sizeof_mod_fd_set="unknown"]
+ )
+ _AS_ECHO_LOG([the sizeof(fd_setsize) with redefined
(${test_fd_setsize}) FD_SETSIZE value is ${sizeof_mod_fd_set}])
+ _AS_ECHO_LOG([detected sizes of 'fd_set': '${sizeof_cur_fd_set}'
(by default), '${sizeof_mod_fd_set}' with modified FD_SETSIZE])
+ AS_IF([test "x${sizeof_cur_fd_set}" != "x${sizeof_mod_fd_set}"],
+ [mhd_cv_fd_setsize_overridable="yes"],
+ [mhd_cv_fd_setsize_overridable="no"]
+ )
+ AS_UNSET([sizeof_mod_fd_set])
+ AS_UNSET([sizeof_cur_fd_set])
+ ],
+ [mhd_cv_fd_setsize_overridable="no"]
+ )
+ ]
+ )
+ AS_UNSET([test_type_fd_setsize])
+ AS_UNSET([test_fd_setsize])
+ AS_UNSET([base_min_fd_setsize])
+ AS_UNSET([base_fd_setsize])
+ ]
+)
+
+AS_VAR_IF([mhd_cv_fd_setsize_overridable],["no"],
+ [
+ AS_VAR_IF([os_is_native_w32],["yes"],
+ [AC_MSG_ERROR([Non-overridable FD_SETSIZE detected for native W32 build.
FD_SETSIZE is overridable on W32.])]
+ )
+ AS_IF([test "x${mhd_cv_fd_setsize_value}" != "xunknown" && test
"x${mhd_cv_sys_fd_setsize_value}" != "xunknown" && test
"${mhd_cv_fd_setsize_value}" -ne "${mhd_cv_sys_fd_setsize_value}"],
+ [AC_MSG_WARN([Detected non-overridable FD_SETSIZE, but the toolchain
uses FD_SETSIZE (${mhd_cv_fd_setsize_value}) different from system default
(${mhd_cv_sys_fd_setsize_value})])]
+ )
+ ],
+ [AC_DEFINE([HAS_FD_SETSIZE_OVERRIDABLE],[1],[Define to 1 i][f your system
allow overriding the value of FD_SETSIZE macro])]
+)
+
+
MHD_CHECK_FUNC([writev],
[[#include <sys/uio.h>]],
[[
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [libmicrohttpd] branch master updated (90fcf2fc -> 75e2addd), gnunet, 2023/11/01
- [libmicrohttpd] 03/10: daemon.c: cosmetics, gnunet, 2023/11/01
- [libmicrohttpd] 04/10: daemon: muted possible compiler warning, gnunet, 2023/11/01
- [libmicrohttpd] 02/10: Upgraded connection: cosmetics, gnunet, 2023/11/01
- [libmicrohttpd] 01/10: digestauth: added asserts, fixed internal doxy, gnunet, 2023/11/01
- [libmicrohttpd] 07/10: configure: warn if building without threads, gnunet, 2023/11/01
- [libmicrohttpd] 09/10: Adjusted default value of maximum connections, gnunet, 2023/11/01
- [libmicrohttpd] 06/10: configure: cosmetics, gnunet, 2023/11/01
- [libmicrohttpd] 10/10: internal.h: added macros for polling mode detection, gnunet, 2023/11/01
- [libmicrohttpd] 08/10: configure: added detection of FD_SETSIZE value and ability to override it,
gnunet <=
- [libmicrohttpd] 05/10: microhttpd.h: updated doxy for MHD_USE_PEDANTIC_CHECKS, gnunet, 2023/11/01