libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 2db0eabd118370fd2937bd9021ade9b0e40473fa
parent 2a59d367d6ff2be09d5cc952f3ece82517062702
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Thu, 30 May 2019 23:32:09 +0300

configure: fixed detection of 'getsockname' on some systems (W32 x32),
do not use 'getsockname()' if it is not detected by configure.

Diffstat:
Mconfigure.ac | 40++++++++++++++++++++--------------------
Am4/mhd_check_func.m4 | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/microhttpd/daemon.c | 2++
3 files changed, 102 insertions(+), 20 deletions(-)

diff --git a/configure.ac b/configure.ac @@ -789,12 +789,25 @@ AC_CHECK_MEMBERS([struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len, #endif ]) -AC_CHECK_DECLS([getsockname], +MHD_CHECK_FUNC([getsockname], + [[ +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_WINSOCK2_H +#include <winsock2.h> +#endif + ]], [ - AC_CHECK_FUNCS([getsockname], - [ - AC_CACHE_CHECK([[whether getsockname() is usable]], [[mhc_cv_getsockname_usable]], - [ + struct sockaddr_storage ss; + (void)getsockname(socket(0,0,0),(struct sockaddr *)&ss,(void*)0); + ], + [ + AC_CACHE_CHECK([[whether getsockname() is usable]], [[mhc_cv_getsockname_usable]], + [ AC_RUN_IFELSE( [ AC_LANG_SOURCE( @@ -888,22 +901,9 @@ int main(void) ) ] ) - AS_VAR_IF([[mhc_cv_getsockname_usable]], [["no"]], [:], + AS_VAR_IF([[mhc_cv_getsockname_usable]], [["no"]], [:], [AC_DEFINE([[MHD_USE_GETSOCKNAME]], [[1]], [Define if you have usable `getsockname' function.])]) - ] - ) - ], [], - [[ -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_WINSOCK2_H -#include <winsock2.h> -#endif - ]] + ] ) # Check for inter-thread signaling type diff --git a/m4/mhd_check_func.m4 b/m4/mhd_check_func.m4 @@ -0,0 +1,80 @@ +# SYNOPSIS +# +# MHD_CHECK_FUNC([FUNCTION_NAME], +# [INCLUDES=AC_INCLUDES_DEFAULT], [CHECK_CODE], +# [ACTION-IF-AVAILABLE], [ACTION-IF-NOT-AVAILABLE], +# [ADDITIONAL_LIBS]) +# +# DESCRIPTION +# +# This macro checks for presence of specific function by including +# specified headers and compiling and linking CHECK_CODE. +# This check both declaration and presence in library. +# Unlike AC_CHECK_FUNCS macro, this macro do not produce false +# negative result if function is declared with specific calling +# conventions like __stdcall' or attribute like +# __attribute__((__dllimport__)) and linker failed to build test +# program if library contains function with calling conventions +# different from declared. +# By using definition from provided headers, this macro ensures that +# correct calling convention is used for detection. +# +# Example usage: +# +# MHD_CHECK_FUNC([memmem], +# [[#include <string.h>]], +# [const void *ptr = memmem("aa", 2, "a", 1); (void)ptr;], +# [var_use_memmem='yes'], [var_use_memmem='no']) +# +# Defined cache variable used in check so if any test will not work +# correctly on some platform, user may simply fix it by giving cache +# variable in configure parameters, for example: +# +# ./configure mhd_cv_func_memmem_have=no +# +# This simplify building from source on exotic platforms as patching +# of configure.ac is not required to change results of tests. +# +# LICENSE +# +# Copyright (c) 2019 Karlson2k (Evgeny Grin) <k2k@narod.ru> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([MHD_CHECK_FUNC],[dnl + AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifblank, m4_ifnblank + m4_ifblank(m4_translit([$1],[()],[ ]), [m4_fatal([First macro argument must not be empty])])dnl + m4_ifblank([$3], [m4_fatal([Third macro argument must not be empty])])dnl + m4_bmatch(m4_normalize([$1]), [\s],dnl + [m4_fatal([First macro argument must not contain whitespaces])])dnl + m4_if(m4_index([$3], m4_normalize(m4_translit([$1],[()],[ ]))), [-1], dnl + [m4_fatal([CHECK_CODE parameter (third macro argument) do not contain ']m4_normalize([$1])[' token])])dnl + AS_VAR_PUSHDEF([cv_Var], [mhd_cv_func_]m4_bpatsubst(m4_normalize(m4_translit([$1],[()],[ ])),[[^a-zA-Z0-9]],[_]))dnl + dnl + AC_CACHE_CHECK([for function $1], [cv_Var], + [dnl + m4_ifnblank([$6],[dnl + mhd_check_func_SAVE_LIBS="$LIBS" + LIBS="$LIBS m4_normalize([$6])" + ])dnl + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([m4_default_nblank([$2],[AC_INCLUDES_DEFAULT])], [$3]) ], + [AS_VAR_SET([cv_Var],["yes"])], [AS_VAR_SET([cv_Var],["no"])] ) + m4_ifnblank([$6],[dnl + LIBS="${mhd_check_func_SAVE_LIBS}" + AS_UNSET([mhd_check_func_SAVE_LIBS]) + ])dnl + ]) + AS_VAR_IF([cv_Var], ["yes"], + [AC_DEFINE([[HAVE_]]m4_bpatsubst(m4_toupper(m4_normalize(m4_translit([$1],[()],[ ]))),[[^A-Z0-9]],[_]), + [1], [Define to 1 if you have the `]m4_normalize(m4_translit([$1],[()],[ ]))[' function.]) + m4_n([$4])dnl + ], [$5]) + AS_VAR_POPDEF([cv_Var])dnl +]) + diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -6092,6 +6092,7 @@ MHD_start_daemon_va (unsigned int flags, listen_fd = daemon->listen_fd; } +#ifdef HAVE_GETSOCKNAME if ( (0 == daemon->port) && (0 == (*pflags & MHD_USE_NO_LISTEN_SOCKET)) ) { /* Get port number. */ @@ -6160,6 +6161,7 @@ MHD_start_daemon_va (unsigned int flags, } } } +#endif /* HAVE_GETSOCKNAME */ if ( (MHD_INVALID_SOCKET != listen_fd) && (! MHD_socket_nonblocking_ (listen_fd)) )