From d262f13d293ff9b7b4a484d71036e6cf61463d83 Mon Sep 17 00:00:00 2001 From: Aleksander Melnikov Date: Wed, 15 Mar 2017 21:22:23 +0700 Subject: [PATCH 1/2] CDRIVER-2080 detect socket API parameters for legacy platforms --- CMakeLists.txt | 58 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 461d032335..42ebc298e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,24 +179,68 @@ endif () # Reasonable default. CheckCompiler.m4 checks thoroughly for HP-UX's sake. set (MONGOC_SOCKET_ARG2 "struct sockaddr") +set (MONGOC_SOCKET_ARG3 "socklen_t") + +if (NOT WIN32) + +set(MONGOC_ACCEPT_ARG2_LIST "struct sockaddr" "void") +set(MONGOC_ACCEPT_ARG3_LIST "socklen_t" "size_t" "int") + +list(LENGTH MONGOC_ACCEPT_ARG2_LIST MONGOC_ACCEPT_ARG2_LIST_LEN) +math(EXPR MONGOC_ACCEPT_ARG2_LIST_LEN_R "${MONGOC_ACCEPT_ARG2_LIST_LEN} - 1") +list(LENGTH MONGOC_ACCEPT_ARG3_LIST MONGOC_ACCEPT_ARG3_LIST_LEN) +math(EXPR MONGOC_ACCEPT_ARG3_LIST_LEN_R "${MONGOC_ACCEPT_ARG3_LIST_LEN} - 1") + +foreach(MONGOC_ACCEPT_ARG2_L RANGE ${MONGOC_ACCEPT_ARG2_LIST_LEN_R}) +foreach(MONGOC_ACCEPT_ARG3_L RANGE ${MONGOC_ACCEPT_ARG3_LIST_LEN_R}) + +list(GET MONGOC_ACCEPT_ARG2_LIST ${MONGOC_ACCEPT_ARG2_L} MONGOC_ACCEPT_ARG2_VAL) +list(GET MONGOC_ACCEPT_ARG3_LIST ${MONGOC_ACCEPT_ARG3_L} MONGOC_ACCEPT_ARG3_VAL) + +FILE(WRITE accept_test.cxx +"#include + #include + + int main () + { + int a = 0; + ${MONGOC_ACCEPT_ARG2_VAL} *b = 0; + ${MONGOC_ACCEPT_ARG3_VAL} *c = 0; + accept (a, b, c); + return 0; +} +") + message(STATUS "${MONGOC_ACCEPT_ARG2_VAL} & ${MONGOC_ACCEPT_ARG3_VAL} ${RES}") + TRY_COMPILE(RES ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/accept_test.cxx CMAKE_FLAGS + "-DCMAKE_CXX_LINK_EXECUTABLE='echo not linking now...'" OUTPUT_VARIABLE + LOG2) + if (RES) + set(MONGOC_SOCKET_ARG2 ${MONGOC_ACCEPT_ARG2_VAL}) + set(MONGOC_SOCKET_ARG3 ${MONGOC_ACCEPT_ARG3_VAL}) + endif () +endforeach() +endforeach() include(CheckTypeSize) -if (MSVC) - SET(CMAKE_EXTRA_INCLUDE_FILES "ws2tcpip.h") -else() - SET(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") -endif () +SET(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") CHECK_TYPE_SIZE(socklen_t HAVE_SOCKLEN) SET(CMAKE_EXTRA_INCLUDE_FILES) if (HAVE_SOCKLEN) set(MONGOC_HAVE_SOCKLEN 1) - set (MONGOC_SOCKET_ARG3 "socklen_t") else() set(MONGOC_HAVE_SOCKLEN 0) - set (MONGOC_SOCKET_ARG3 "int") endif() +else() + # WIN32 + set(MONGOC_HAVE_SOCKLEN 1) +endif() + + +message(STATUS "accept arguments type is: ${MONGOC_SOCKET_ARG2} and ${MONGOC_SOCKET_ARG3}") + set (SOURCE_DIR "${PROJECT_SOURCE_DIR}/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/build/cmake) From a1714d401918c771b2a4bb6e34a693776bf4f727 Mon Sep 17 00:00:00 2001 From: Aleksander Melnikov Date: Thu, 23 Mar 2017 06:47:27 +0300 Subject: [PATCH 2/2] CDRIVER-2080 Improve checking for arguments --- CMakeLists.txt | 97 ++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 47 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42ebc298e0..52619399c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,61 +177,64 @@ if (MINGW) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_RAND_S") endif () + +function(mongoc_get_accept_args ARG2 ARG3) + SET(VAR 0) + foreach (ARG2_VAL "struct sockaddr" "void") + foreach (ARG3_VAL "socklen_t" "size_t" "int") + + MATH(EXPR VAR "${VAR}+1") + + FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/accept_test${VAR}.cxx + "#include + #include + + int main () + { + int a = 0; + ${ARG2_VAL} *b = 0; + ${ARG3_VAL} *c = 0; + accept (a, b, c); + return 0; + } + ") + + TRY_COMPILE(RES ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/accept_test${VAR}.cxx CMAKE_FLAGS + "-Werror -DCMAKE_CXX_LINK_EXECUTABLE='echo not linking now...'" OUTPUT_VARIABLE LOG2) + + if (RES) + message(STATUS "Detected accept args is ${ARG2_VAL} and ${ARG3_VAL}") + set(${ARG2} ${ARG2_VAL} PARENT_SCOPE) + set(${ARG3} ${ARG3_VAL} PARENT_SCOPE) + return () + endif () + + endforeach() + endforeach() + +endfunction() + + # Reasonable default. CheckCompiler.m4 checks thoroughly for HP-UX's sake. set (MONGOC_SOCKET_ARG2 "struct sockaddr") set (MONGOC_SOCKET_ARG3 "socklen_t") + if (NOT WIN32) -set(MONGOC_ACCEPT_ARG2_LIST "struct sockaddr" "void") -set(MONGOC_ACCEPT_ARG3_LIST "socklen_t" "size_t" "int") - -list(LENGTH MONGOC_ACCEPT_ARG2_LIST MONGOC_ACCEPT_ARG2_LIST_LEN) -math(EXPR MONGOC_ACCEPT_ARG2_LIST_LEN_R "${MONGOC_ACCEPT_ARG2_LIST_LEN} - 1") -list(LENGTH MONGOC_ACCEPT_ARG3_LIST MONGOC_ACCEPT_ARG3_LIST_LEN) -math(EXPR MONGOC_ACCEPT_ARG3_LIST_LEN_R "${MONGOC_ACCEPT_ARG3_LIST_LEN} - 1") - -foreach(MONGOC_ACCEPT_ARG2_L RANGE ${MONGOC_ACCEPT_ARG2_LIST_LEN_R}) -foreach(MONGOC_ACCEPT_ARG3_L RANGE ${MONGOC_ACCEPT_ARG3_LIST_LEN_R}) - -list(GET MONGOC_ACCEPT_ARG2_LIST ${MONGOC_ACCEPT_ARG2_L} MONGOC_ACCEPT_ARG2_VAL) -list(GET MONGOC_ACCEPT_ARG3_LIST ${MONGOC_ACCEPT_ARG3_L} MONGOC_ACCEPT_ARG3_VAL) - -FILE(WRITE accept_test.cxx -"#include - #include - - int main () - { - int a = 0; - ${MONGOC_ACCEPT_ARG2_VAL} *b = 0; - ${MONGOC_ACCEPT_ARG3_VAL} *c = 0; - accept (a, b, c); - return 0; -} -") - message(STATUS "${MONGOC_ACCEPT_ARG2_VAL} & ${MONGOC_ACCEPT_ARG3_VAL} ${RES}") - TRY_COMPILE(RES ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/accept_test.cxx CMAKE_FLAGS - "-DCMAKE_CXX_LINK_EXECUTABLE='echo not linking now...'" OUTPUT_VARIABLE - LOG2) - if (RES) - set(MONGOC_SOCKET_ARG2 ${MONGOC_ACCEPT_ARG2_VAL}) - set(MONGOC_SOCKET_ARG3 ${MONGOC_ACCEPT_ARG3_VAL}) - endif () -endforeach() -endforeach() + mongoc_get_accept_args(MONGOC_SOCKET_ARG2 MONGOC_SOCKET_ARG3) -include(CheckTypeSize) -SET(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") -CHECK_TYPE_SIZE(socklen_t HAVE_SOCKLEN) -SET(CMAKE_EXTRA_INCLUDE_FILES) + include(CheckTypeSize) + SET(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") + CHECK_TYPE_SIZE(socklen_t HAVE_SOCKLEN) + SET(CMAKE_EXTRA_INCLUDE_FILES) -if (HAVE_SOCKLEN) - set(MONGOC_HAVE_SOCKLEN 1) -else() - set(MONGOC_HAVE_SOCKLEN 0) -endif() + if (HAVE_SOCKLEN) + set(MONGOC_HAVE_SOCKLEN 1) + else() + set(MONGOC_HAVE_SOCKLEN 0) + endif() else() # WIN32