libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit 4d2fa143e6ec87c345fd1337e5de63bf96c303eb
parent 684f8f56dbde888790abaff779b27608f050e487
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Wed, 18 Mar 2026 22:34:10 +0100

Added support for POSIX.1-2024 in configure

Changed strategy for visibility macros definition. Previously, configure
tried to always define _XOPEN_SOURCE if it is supported by headers and
not defined already.
However, some platforms are hiding everything not mentioned explicitly
by POSIX for "compatibility" if _XOPEN_SOURCE is defined.
On the other hand, some platforms require _XOPEN_SOURCE to expose modern
interfaces (otherwise historical interfaces are used).
The new approach has shortcuts for known platforms, which require
_XOPEN_SOURCE, and shortcuts for known platforms, which do not require
_XOPEN_SOURCE. Fallback path with detection is sed for unknown
platforms.
Also, greatly simplified detection of supported _XOPEN_SOURCE values
with (almost) universal test with fallback path (of course).
Additionally, added direct support for more platforms and simplified
on optimised shell (configure) scripts for better efficiency.

In overall: new macros are faster, better, have improved compatibility
and work better with unknown systems.

Sidenote: the code is already using POSIX.1-2024 features, like memmem
(POST parsing), pipe2 (Intr-Thread Communication), SOCK_CLOEXEC and
SOCK_NONBLOCK (sockets). Previously the code worked only as non-standard
extension. Now codes detects and uses these features as part of standard
features, enabled automatically by visibility precompiler macros.

Diffstat:
Mm4/mhd_sys_extentions.m4 | 691++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 490 insertions(+), 201 deletions(-)

diff --git a/m4/mhd_sys_extentions.m4 b/m4/mhd_sys_extentions.m4 @@ -59,10 +59,378 @@ m4_ifdef([_AC_UNDECLARED_BUILTIN], [_AC_UNDECLARED_BUILTIN])]dnl [AC_REQUIRE([_AC_UNDECLARED_BUILTIN_]_AC_LANG_ABBREV)]dnl )dnl m4_ifdef _AC_UNDECLARED_BUILTIN + AC_REQUIRE([_MHD_SET_BASIC_INCLUDES]) mhd_mse_sys_ext_defines="" mhd_mse_sys_ext_flags="" - dnl Check platform-specific extensions. + + AC_CACHE_CHECK([[whether _XOPEN_SOURCE is already defined]], + [[mhd_cv_macro__xopen_source_defined]], [ + _MHD_CHECK_DEFINED([[_XOPEN_SOURCE]], [[${mhd_mse_sys_ext_defines}]], + [[mhd_cv_macro__xopen_source_defined="yes"]], + [[mhd_cv_macro__xopen_source_defined="no"]] + ) + ] + ) + + AS_VAR_IF([mhd_cv_macro__xopen_source_defined],["no"], + [ + _MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED([_MHD_SYS_EXT_CHECK_XOPEN_VAL_MAPPED]) + ] + ) + + _MHD_SYS_EXT_PLATFORM_VISIBILITY + + mhd_mse_xopen_features="" + mhd_mse_xopen_defines="" + mhd_mse_xopen_flags="" + + AS_IF([[test "X${mhd_cv_macro__xopen_source_defined}" = "Xno" && test "X${mhd_cv_hdrs_need__xopen_source}" != "Xno"]], + [ + AS_CASE([${mhd_cv__xopen_source_mapped}], + [?00], + [ + _MHD_SYS_EXT_VAR_ADD_FLAG([mhd_mse_xopen_defines],[mhd_mse_xopen_flags],[_XOPEN_SOURCE],[${mhd_cv__xopen_source_mapped}]) + ], + + [ + # Some platforms (NetBSD, illumos, Solaris) use '==' checks instead of '>=' + # for _XOPEN_SOURCE, resulting that unknown for the platform values are + # interpreted as the oldest and the platform exposes reduced number of + # interfaces. Next checks will ensure that the platform recognises + # requested mode instead of blindly defining high number that can + # be simply ignored by the platform. + _MHD_CHECK_POSIX2024([[mhd_mse_xopen_defines]], + [[mhd_mse_xopen_flags]], + [[${mhd_mse_sys_ext_defines}]], + [mhd_mse_xopen_features="${mhd_cv_headers_posix2024}"], + [ + _MHD_CHECK_POSIX2008([[mhd_mse_xopen_defines]], + [[mhd_mse_xopen_flags]], + [[${mhd_mse_sys_ext_defines}]], + [mhd_mse_xopen_features="${mhd_cv_headers_posix2008}"], + [ + _MHD_CHECK_POSIX2001([[mhd_mse_xopen_defines]], + [[mhd_mse_xopen_flags]], + [[${mhd_mse_sys_ext_defines}]], + [mhd_mse_xopen_features="${mhd_cv_headers_posix2001}"], + [ + _MHD_CHECK_SUSV2([[mhd_mse_xopen_defines]], + [[mhd_mse_xopen_flags]], + [[${mhd_mse_sys_ext_defines}]], + [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"], + [ + mhd_mse_xopen_features="${mhd_cv_headers_susv2}" + # Try basic fallback values + _MHD_XOPEN_VAR_ADD([mhd_mse_xopen_defines], [mhd_mse_xopen_flags], [${mhd_mse_sys_ext_defines}]) + ] + ) + ] + ) + ] + ) + ] + ) + ] + ) + ] + ) + + dnl Discard temporal source variables + AS_UNSET([[mhd_mse_sys_features_src]]) + AS_UNSET([[mhd_mse_xopen_defines]]) + AS_UNSET([[mhd_mse_sys_ext_defines]]) + + dnl Determined all required defines. + AC_MSG_CHECKING([[for the final set of defined symbols]]) + m4_ifblank([$1], [dnl + AH_TEMPLATE([[_XOPEN_SOURCE]], [Define to maximum value supported by system headers])dnl + AH_TEMPLATE([[_XOPEN_SOURCE_EXTENDED]], [Define to 1 if _XOPEN_SOURCE is defined to value less than 500 ]dnl + [and system headers require this symbol])dnl + AH_TEMPLATE([[_XOPEN_VERSION]], [Define to maximum value supported by system headers if _XOPEN_SOURCE ]dnl + [is defined to value less than 500 and headers do not support _XOPEN_SOURCE_EXTENDED])dnl + AH_TEMPLATE([[_GNU_SOURCE]], [Define to 1 to enable GNU-related header features])dnl + AH_TEMPLATE([[__BSD_VISIBLE]], [Define to 1 if it is required by headers to expose additional symbols])dnl + AH_TEMPLATE([[_DARWIN_C_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl + AH_TEMPLATE([[__EXTENSIONS__]], [Define to 1 if it is required by headers to expose additional symbols])dnl + AH_TEMPLATE([[_NETBSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl + AH_TEMPLATE([[_BSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl + AH_TEMPLATE([[_TANDEM_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl + AH_TEMPLATE([[_ALL_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl + AH_TEMPLATE([[_QNX_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl + ]) + mhd_mse_result="" + for mhd_mse_Flag in ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags} + do + mhd_mse_result="${mhd_mse_result}${mhd_mse_Flag} " + m4_ifnblank([$1], [dnl + AS_VAR_APPEND([$1],[[" -D$mhd_mse_Flag"]]) + ], [dnl + AS_CASE([[$mhd_mse_Flag]], [[*=*]], + [dnl + AC_DEFINE_UNQUOTED([[`expr "X$mhd_mse_Flag" : 'X\([^=]*\)'`]], + [[`expr "X$mhd_mse_Flag" : 'X[^=]*=\(.*\)'`]]) + ], [dnl + AC_DEFINE_UNQUOTED([[$mhd_mse_Flag]]) + ]) + ]) + done + AS_UNSET([[mhd_mse_Flag]]) + AC_MSG_RESULT([[${mhd_mse_result}]]) + AS_UNSET([[mhd_mse_result]]) + AS_UNSET([[mhd_mse_xopen_flags]]) + AS_UNSET([[mhd_mse_sys_ext_flags]]) +]) + +# _MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED([ACTION_IF_YES], +# [ACTION_IF_NO]) +# +# Set mhd_cv_hdrs_need__xopen_source to "yes", "no" or "unknown, assuming yes" +# +m4_define([_MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED], [dnl + AC_CACHE_CHECK([[whether the proper platform API/ABI is switched by _XOPEN_SOURCE]], + [[mhd_cv_hdrs_need__xopen_source]], + [ + mhd_cv_hdrs_need__xopen_source="" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +/* Warning: test with inverted logic! */ +#ifdef __NetBSD__ +#error NetBSD reqires _XOPEN_SOURCE or _POSIX_C_SOURCE for modern API +fail test here %%%@<:@-1@:>@ +#endif + +#ifdef __illumos__ +#error illumos reqires _XOPEN_SOURCE or _POSIX_C_SOURCE to switch to POSIX API +fail test here %%%@<:@-1@:>@ +#elif defined(__sun) +#error Solaris reqires _XOPEN_SOURCE or _POSIX_C_SOURCE to switch to POSIX API +fail test here %%%@<:@-1@:>@ +#endif + +void dummy_func(void); +void dummy_func(void) {return;} + ]]) + ],[],[mhd_cv_hdrs_need__xopen_source="yes"] + ) + AS_IF([test -z "$mhd_cv_hdrs_need__xopen_source"], + [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +${mhd_basic_headers_includes} +/* Warning: test with inverted logic! */ +#ifdef __linux__ +#if defined(__GNU_LIBRARY__) || defined(__GLIBC__) +#ifndef __UCLIBC__ +#error GNU libc does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#else +#error uClibc does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif +/* Note: musl is undetectable by design */ +#endif +#endif + +#ifdef __BIONIC__ +#error Bionic libc does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif + +void dummy_func(void); +void dummy_func(void) {return;} + ]]) + ],[],[mhd_cv_hdrs_need__xopen_source="no"] + ) + ] + ) + AS_IF([test -z "$mhd_cv_hdrs_need__xopen_source"], + [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +/* Warning: test with inverted logic! */ +#ifdef __FreeBSD__ +#error FreeBSD does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif + +#ifdef __OpenBSD__ +#error OpenBSD does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif + +#ifdef __APPLE__ +#error Darwin does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif + +#ifdef __HAIKU__ +#error Haiku does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif + +#ifdef __DragonFly__ +#error DragonFlyBSD does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif /* __DragonFly__ */ + +#ifdef __CYGWIN__ +#error Cygwin's newlib does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif /* __CYGWIN__ */ + +#if defined(__QNX__) || defined(__QNXNTO__) +#error QNX RTOS does not require _XOPEN_SOURCE +fail test here %%%@<:@-1@:>@ +#endif /* __QNX__ || __QNXNTO__ */ + +void dummy_func(void); +void dummy_func(void) {return;} + ]]) + ],[],[mhd_cv_hdrs_need__xopen_source="no"] + ) + ] + ) + AS_IF([test -z "$mhd_cv_hdrs_need__xopen_source"], + [mhd_cv_hdrs_need__xopen_source="unknown, assuming yes"] + ) + ] + ) + m4_ifnblank([$1$2],[AS_VAR_IF([mhd_cv_hdrs_need__xopen_source],["no"],[$2],[$1])]) +])dnl m4_define _MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED + +# +# Set mhd_cv__xopen_source_mapped to 800, 700, 600, 500 or none + +m4_define([_MHD_SYS_EXT_CHECK_XOPEN_VAL_MAPPED], [dnl + AC_REQUIRE([_MHD_SET_BASIC_INCLUDES]) + # Note: _XOPEN_SOURCE cannot be blindy set to some high or the latest value. + # Some platforms (NetBSD, illumos, Solaris) use '==' when checking its + # value; mismatched value is interpreted as lowest value and results + # in symbols hiding. + AC_CACHE_CHECK([fo][r correctly mapped _XOPEN_SOURCE value], + [mhd_cv__xopen_source_mapped], + [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +_MHD_UNDEF_ALL_EXT[ +#define _XOPEN_SOURCE 800 +${mhd_basic_headers_includes} + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined by headers +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) < 202405 +#error _POSIX_C_SOURCE is defined to value lower than expected +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) > 202405 +#error _POSIX_C_SOURCE is defined to value higher than expected +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) == 202405 +#else +#error weird preprocessor math +fail test here %%%@<:@-1@:>@ +#endif +void dummy_func(void); +void dummy_func(void) {return;} + ]]) + ],[mhd_cv__xopen_source_mapped="800"] + ) + + AS_IF([test -z "$mhd_cv__xopen_source_mapped"], + [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +_MHD_UNDEF_ALL_EXT[ +#define _XOPEN_SOURCE 700 +${mhd_basic_headers_includes} + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined by headers +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) < 200809 +#error _POSIX_C_SOURCE is defined to value lower than expected +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) > 200809 +#error _POSIX_C_SOURCE is defined to value higher than expected +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) == 200809 +#else +#error weird preprocessor math +fail test here %%%@<:@-1@:>@ +#endif +void dummy_func(void); +void dummy_func(void) {return;} + ]]) + ],[mhd_cv__xopen_source_mapped="700"] + ) + ] + ) + + AS_IF([test -z "$mhd_cv__xopen_source_mapped"], + [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +_MHD_UNDEF_ALL_EXT[ +#define _XOPEN_SOURCE 600 +${mhd_basic_headers_includes} + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined by headers +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) < 200112 +#error _POSIX_C_SOURCE is defined to value lower than expected +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) > 200112 +#error _POSIX_C_SOURCE is defined to value higher than expected +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) == 200112 +#else +#error weird preprocessor math +fail test here %%%@<:@-1@:>@ +#endif +void dummy_func(void); +void dummy_func(void) {return;} + ]]) + ],[mhd_cv__xopen_source_mapped="600"] + ) + ] + ) + + AS_IF([test -z "$mhd_cv__xopen_source_mapped"], + [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +_MHD_UNDEF_ALL_EXT[ +#define _XOPEN_SOURCE 500 +${mhd_basic_headers_includes} + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined by headers +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) > 199506 +#error _POSIX_C_SOURCE is defined to value higher than expected +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) == 0 +#error _POSIX_C_SOURCE is defined to zero value +fail test here %%%@<:@-1@:>@ +#elif (_POSIX_C_SOURCE + 0) <= 199506 +#else +#error weird preprocessor math +fail test here %%%@<:@-1@:>@ +#endif +void dummy_func(void); +void dummy_func(void) {return;} + ]]) + ],[mhd_cv__xopen_source_mapped="500"] + ) + ] + ) + + test -n "${mhd_cv__xopen_source_mapped}" || mhd_cv__xopen_source_mapped="none" + ] + ) +])dnl m4_define _MHD_SYS_EXT_CHECK_XOPEN_MAPPED + + +# +# Set mhd_mse_sys_ext_defines and mhd_mse_sys_ext_flags +# +m4_define([_MHD_SYS_EXT_PLATFORM_VISIBILITY], [dnl + dnl Check platform-specific visibility macros. dnl Use compiler-based test for determinig target. dnl Always add _GNU_SOURCE if headers allow. @@ -133,7 +501,6 @@ fail test here %%%@<:@-1@:>@ ]) ]) - dnl _DARWIN_C_SOURCE enables additional functionality on Darwin. MHD_CHECK_DEFINED_MSG([[__APPLE__]], [[${mhd_mse_sys_ext_defines}]], [[whether to try _DARWIN_C_SOURCE macro]], @@ -219,170 +586,30 @@ fail test here %%%@<:@-1@:>@ )dnl ]) - mhd_mse_xopen_features="" - mhd_mse_xopen_defines="" - mhd_mse_xopen_flags="" - - AC_CACHE_CHECK([[whether _XOPEN_SOURCE is already defined]], - [[mhd_cv_macro__xopen_source_defined]], [ - _MHD_CHECK_DEFINED([[_XOPEN_SOURCE]], [[${mhd_mse_sys_ext_defines}]], - [[mhd_cv_macro__xopen_source_defined="yes"]], - [[mhd_cv_macro__xopen_source_defined="no"]] - ) - ] - ) - AS_VAR_IF([[mhd_cv_macro__xopen_source_defined]], [["no"]], - [ - dnl Some platforms (namely: Solaris) use '==' checks instead of '>=' - dnl for _XOPEN_SOURCE, resulting that unknown for platform values are - dnl interpreted as oldest and platform expose reduced number of - dnl interfaces. Next checks will ensure that platform recognise - dnl requested mode instead of blindly define high number that can - dnl be simply ignored by platform. - _MHD_CHECK_POSIX2008([[mhd_mse_xopen_defines]], - [[mhd_mse_xopen_flags]], - [[${mhd_mse_sys_ext_defines}]], - [mhd_mse_xopen_features="${mhd_cv_headers_posix2008}"], - [ - _MHD_CHECK_POSIX2001([[mhd_mse_xopen_defines]], - [[mhd_mse_xopen_flags]], - [[${mhd_mse_sys_ext_defines}]], - [mhd_mse_xopen_features="${mhd_cv_headers_posix2001}"], - [ - _MHD_CHECK_SUSV2([[mhd_mse_xopen_defines]], - [[mhd_mse_xopen_flags]], - [[${mhd_mse_sys_ext_defines}]], - [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"], - [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"] - ) - ] - ) - ] - ) - ] - ) - - AS_IF([[test "x${mhd_cv_macro__xopen_source_defined}" = "xno" && \ - test "x${mhd_cv_macro__xopen_source_def_fiveh}" = "xno" || \ - test "x${mhd_mse_xopen_features}" = "xnot available" ]], - [ - _MHD_XOPEN_VAR_ADD([mhd_mse_xopen_defines], [mhd_mse_xopen_flags], [${mhd_mse_sys_ext_defines}]) - ] - ) - - mhd_mse_sys_features_src=" -#ifdef __APPLE__ -#include <sys/socket.h> -#else -#error No useful system features. + dnl _QNX_SOURCE enabled all available symbols in QNX RTOS. + AC_CACHE_CHECK([[whether to try _QNX_SOURCE macro]], + [[mhd_cv_macro_try__qnx_source]], [dnl + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#if !defined(__QNX__) && !defined (__QNXNTO__) +#error Target is not QNX RTOS fail test here %%%@<:@-1@:>@ #endif - -int main() -{ -#ifdef __APPLE__ -#ifndef sendfile - (void) sendfile; -#endif -#endif - return 0; -} -" - AC_CACHE_CHECK([[for useful system-specific features]], - [[mhd_cv_headers_useful_features_present]], [ - mhd_SYS_EXT_SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ac_[]_AC_LANG_ABBREV[]_undeclared_builtin_options" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ -${mhd_mse_sys_ext_defines} -${mhd_mse_sys_features_src} - ]])], - [[mhd_cv_headers_useful_features_present="yes"]], - [[mhd_cv_headers_useful_features_present="no"]] + ]],[])], + [[mhd_cv_macro_try__qnx_source="yes"]], + [[mhd_cv_macro_try__qnx_source="no"]] + ) + ]) + AS_VAR_IF([[mhd_cv_macro_try__qnx_source]], [["yes"]], + [dnl + MHD_CHECK_DEF_AND_ACCEPT( + [[_QNX_SOURCE]], [], [[${mhd_mse_sys_ext_defines}]], [], + [ + _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_QNX_SOURCE]]) + ] )dnl ]) - AS_VAR_IF([[mhd_cv_headers_useful_features_present]], [["yes"]], - [ - AS_IF([[test "x${mhd_mse_xopen_flags}" = "x"]], [[:]], - [ - AC_CACHE_CHECK([[whether useful system-specific features works with ${mhd_mse_xopen_flags}]], - [[mhd_cv_headers_useful_features_works_xopen]], [dnl - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ -${mhd_mse_sys_ext_defines} -${mhd_mse_xopen_defines} -${mhd_mse_sys_features_src} - ]])], - [[mhd_cv_headers_useful_features_works_xopen="yes"]], - [[mhd_cv_headers_useful_features_works_xopen="no"]] - )dnl - ])dnl - ] - ) - CFLAGS="$mhd_SYS_EXT_SAVE_CFLAGS" - AS_UNSET([mhd_SYS_EXT_SAVE_CFLAGS]) - ] - ) - - AS_IF([[test "x${mhd_cv_headers_useful_features_present}" = "xyes" && \ - test "x${mhd_cv_headers_useful_features_works_xopen}" = "xno" && \ - test "x${mhd_mse_xopen_flags}" != "x"]], - [ - _MHD_VAR_CONTAIN([[mhd_mse_xopen_features]], [[, activated by _XOPEN_SOURCE]], - [ - AC_MSG_WARN([[_XOPEN_SOURCE macro is required to activate all headers symbols, however some useful system-specific features does not work with _XOPEN_SOURCE. ]dnl - [_XOPEN_SOURCE macro will not be used.]]) - ] - ) - AS_UNSET([[mhd_mse_xopen_defines]]) - AS_UNSET([[mhd_mse_xopen_flags]]) - AS_UNSET([[mhd_mse_xopen_values]]) - ] - ) - - dnl Discard temporal source variables - AS_UNSET([[mhd_mse_sys_features_src]]) - AS_UNSET([[mhd_mse_xopen_defines]]) - AS_UNSET([[mhd_mse_sys_ext_defines]]) - - dnl Determined all required defines. - AC_MSG_CHECKING([[for final set of defined symbols]]) - m4_ifblank([$1], [dnl - AH_TEMPLATE([[_XOPEN_SOURCE]], [Define to maximum value supported by system headers])dnl - AH_TEMPLATE([[_XOPEN_SOURCE_EXTENDED]], [Define to 1 if _XOPEN_SOURCE is defined to value less than 500 ]dnl - [and system headers require this symbol])dnl - AH_TEMPLATE([[_XOPEN_VERSION]], [Define to maximum value supported by system headers if _XOPEN_SOURCE ]dnl - [is defined to value less than 500 and headers do not support _XOPEN_SOURCE_EXTENDED])dnl - AH_TEMPLATE([[_GNU_SOURCE]], [Define to 1 to enable GNU-related header features])dnl - AH_TEMPLATE([[__BSD_VISIBLE]], [Define to 1 if it is required by headers to expose additional symbols])dnl - AH_TEMPLATE([[_DARWIN_C_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl - AH_TEMPLATE([[__EXTENSIONS__]], [Define to 1 if it is required by headers to expose additional symbols])dnl - AH_TEMPLATE([[_NETBSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl - AH_TEMPLATE([[_BSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl - AH_TEMPLATE([[_TANDEM_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl - AH_TEMPLATE([[_ALL_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl - ]) - for mhd_mse_Flag in ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags} - do - m4_ifnblank([$1], [dnl - AS_VAR_APPEND([$1],[[" -D$mhd_mse_Flag"]]) - ], [dnl - AS_CASE([[$mhd_mse_Flag]], [[*=*]], - [dnl - AC_DEFINE_UNQUOTED([[`echo $mhd_mse_Flag | cut -f 1 -d =`]], - [[`echo $mhd_mse_Flag | cut -f 2 -d = -s`]]) - ], [dnl - AC_DEFINE_UNQUOTED([[$mhd_mse_Flag]]) - ]) - ]) - done - AS_UNSET([[mhd_mse_Flag]]) - dnl Trim whitespaces - mhd_mse_result=`echo ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags}` - AC_MSG_RESULT([[${mhd_mse_result}]]) - AS_UNSET([[mhd_mse_result]]) - AS_UNSET([[mhd_mse_xopen_flags]]) - AS_UNSET([[mhd_mse_sys_ext_flags]]) -]) +])dnl m4_define _MHD_SYS_EXT_PLATFORM_VISIBILITY # @@ -419,24 +646,83 @@ m4_define([_MHD_VAR_IF],[dnl m4_ifnblank([$3$4],[dnl AS_VAR_IF([$1],[$2],[$3],[$4])])]) + +# SYNOPSIS +# +# _MHD_CHECK_POSIX2024(DEFINES_VAR, FLAGS_VAR, +# [EXT_DEFINES], +# [ACTION-IF-AVAILABLE], +# [ACTION-IF-NOT-AVAILABLE]) # -# _MHD_STRING_CONTAIN(VAR, MATCH, [IF-MATCH], [IF-NOT-MATCH]) # +AC_DEFUN([_MHD_CHECK_POSIX2024], [dnl + AC_CACHE_CHECK([headers for POSIX.1-2024/SUSv5 features], + [[mhd_cv_headers_posix2024]], [dnl + _MHD_CHECK_POSIX_FEATURES_SINGLE([ +_MHD_BASIC_INCLUDES +[ +/* Check will be passed if ALL features are available + * and failed if ANY feature is not available. */ +int main() +{ -AC_DEFUN([_MHD_VAR_CONTAIN],[dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -AS_IF([[`echo "${]$1[}" | $FGREP ']$2[' >/dev/null 2>&1`]], [$3], [$4]) -]) +#if !defined(__linux__) && !defined(__apple__) && !defined(__CYGWIN__) +#ifndef FD_CLOFORK +#error FD_CLOFORK must be defined with POSIX.1-2024 +fail test here %%%@<:@-1@:>@ +#endif +#endif -# -# _MHD_STRING_CONTAIN_BRE(VAR, BRE, [IF-MATCH], [IF-NOT-MATCH]) -# +#ifndef memmem + (void) memmem; +#endif + +#ifndef strlcpy + (void) strlcpy; +#endif + +#ifndef strlcat + (void) strlcat; +#endif -AC_DEFUN([_MHD_VAR_CONTAIN_BRE],[dnl -AC_REQUIRE([AC_PROG_GREP])dnl -AS_IF([[`echo "${]$1[}" | $GREP ']$2[' >/dev/null 2>&1`]], [$3], [$4]) +#if !defined(__applce__) +#ifndef pipe2 + (void) pipe2; +#endif +#endif + +#if !defined(__applce__) +#ifndef getentropy + (void) getentropy; +#endif +#endif + +/* gmtime_r() becomes mandatory in POSIX.1-2008. */ +#ifndef gmtime_r + (void) gmtime_r; +#endif + + return 0; +} + ]], + [$3], [[800]], + [[mhd_cv_headers_posix2024]]dnl + ) + ] + ) + AS_CASE([${mhd_cv_headers_posix2024}], + [[available*]], + [ + AS_CASE([[${mhd_cv_headers_posix2024}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]], + [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[800]])] + ) + $4 + ], + [$5] + ) ]) + # SYNOPSIS # # _MHD_CHECK_POSIX2008(DEFINES_VAR, FLAGS_VAR, @@ -507,9 +793,10 @@ int main() ) ] ) - _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_posix2008]], [[^available]], + AS_CASE([${mhd_cv_headers_posix2008}], + [[available*]], [ - _MHD_VAR_CONTAIN([[mhd_cv_headers_posix2008]], [[does not work with _XOPEN_SOURCE]], [[:]], + AS_CASE([[${mhd_cv_headers_posix2008}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]], [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[700]])] ) $4 @@ -579,9 +866,10 @@ fail test here %%%@<:@-1@:>@ ) ] ) - _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_posix2001]], [[^available]], + AS_CASE([${mhd_cv_headers_posix2001}], + [[available*]], [ - _MHD_VAR_CONTAIN([[mhd_cv_headers_posix2001]], [[does not work with _XOPEN_SOURCE]], [[:]], + AS_CASE([[${mhd_cv_headers_posix2001}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]], [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[600]])] ) $4 @@ -648,9 +936,10 @@ int main() ) ] ) - _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_susv2]], [[^available]], + AS_CASE([${mhd_cv_headers_susv2}], + [[available*]], [ - _MHD_VAR_CONTAIN([[mhd_cv_headers_susv2]], [[does not work with _XOPEN_SOURCE]], [[:]], + AS_CASE([[${mhd_cv_headers_susv2}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]], [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[500]])] ) $4 @@ -1015,7 +1304,7 @@ AC_DEFUN([MHD_CHECK_HEADERS_PRESENCE], [dnl # Check basic headers for presence. AC_DEFUN([MHD_CHECK_BASIC_HEADERS_PRESENCE], [dnl - MHD_CHECK_HEADERS_PRESENCE([stdio.h wchar.h stdlib.h string.h strings.h stdint.h fcntl.h sys/types.h time.h unistd.h]) + MHD_CHECK_HEADERS_PRESENCE([sys/types.h stdint.h stdio.h stdlib.h wchar.h string.h strings.h time.h fcntl.h unistd.h]) ]) @@ -1027,53 +1316,53 @@ AC_DEFUN([MHD_CHECK_BASIC_HEADERS_PRESENCE], [dnl AC_DEFUN([_MHD_SET_BASIC_INCLUDES], [dnl AC_REQUIRE([MHD_CHECK_BASIC_HEADERS_PRESENCE])dnl AS_IF([[test -z "$mhd_basic_headers_includes"]], [dnl - AS_VAR_IF([mhd_cv_header_stdio_h_present], [["yes"]], - [[mhd_basic_headers_includes="\ -#include <stdio.h> -" ]],[[mhd_basic_headers_includes=""]] - ) AS_VAR_IF([mhd_cv_header_sys_types_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} #include <sys/types.h> " ]] ) - AS_VAR_IF([mhd_cv_header_wchar_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ -#include <wchar.h> + AS_VAR_IF([mhd_cv_header_stdint_h_present], [["yes"]], + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} +#include <stdint.h> " ]] ) + AS_VAR_IF([mhd_cv_header_stdio_h_present], [["yes"]], + [[mhd_basic_headers_includes=" +#include <stdio.h> +" ]],[[mhd_basic_headers_includes=""]] + ) AS_VAR_IF([mhd_cv_header_stdlib_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} #include <stdlib.h> " ]] ) + AS_VAR_IF([mhd_cv_header_wchar_h_present], [["yes"]], + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} +#include <wchar.h> +" ]] + ) AS_VAR_IF([mhd_cv_header_string_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} #include <string.h> " ]] ) AS_VAR_IF([mhd_cv_header_strings_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} #include <strings.h> " ]] ) - AS_VAR_IF([mhd_cv_header_stdint_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ -#include <stdint.h> + AS_VAR_IF([mhd_cv_header_time_h_present], [["yes"]], + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} +#include <time.h> " ]] ) AS_VAR_IF([mhd_cv_header_fcntl_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} #include <fcntl.h> " ]] ) - AS_VAR_IF([mhd_cv_header_time_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ -#include <time.h> -" ]] - ) AS_VAR_IF([mhd_cv_header_unistd_h_present], [["yes"]], - [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\ + [[mhd_basic_headers_includes="${mhd_basic_headers_includes} #include <unistd.h> " ]] )