mirror of
https://github.com/Cisco-Talos/clamav.git
synced 2025-10-19 10:23:17 +00:00
106 lines
3.6 KiB
CMake
106 lines
3.6 KiB
CMake
![]() |
#
|
||
|
# Check if file descriptor passing is supported
|
||
|
# Derived from work submitted by Richard Lyons <frob-clamav@webcentral.com.au>
|
||
|
#
|
||
|
|
||
|
GET_FILENAME_COMPONENT(_selfdir_CheckFDPassing
|
||
|
"${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||
|
|
||
|
include(CheckSymbolExists)
|
||
|
check_symbol_exists(recvmsg "sys/socket.h" HAVE_RECVMSG)
|
||
|
check_symbol_exists(sendmsg "sys/socket.h" HAVE_SENDMSG)
|
||
|
|
||
|
# Extra -D Compile Definitions for check_c_source_compiles()
|
||
|
set(CMAKE_REQUIRED_DEFINITIONS "")
|
||
|
if(HAVE_SYS_TYPES_H)
|
||
|
set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS};-DHAVE_SYS_TYPES_H=1")
|
||
|
endif()
|
||
|
if(HAVE_SYS_UIO_H)
|
||
|
set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS};-DHAVE_SYS_UIO_H=1")
|
||
|
endif()
|
||
|
|
||
|
# Check for msg_control field in struct msghdr
|
||
|
check_c_source_compiles(
|
||
|
"
|
||
|
#define _XOPEN_SOURCE 500
|
||
|
#ifdef HAVE_SYS_TYPES_H
|
||
|
# include <sys/types.h>
|
||
|
#endif
|
||
|
#include <sys/socket.h>
|
||
|
#ifdef HAVE_SYS_UIO_H
|
||
|
# include <sys/uio.h>
|
||
|
#endif
|
||
|
|
||
|
int main(void) {
|
||
|
#ifdef msg_control
|
||
|
# error msg_control defined
|
||
|
#endif
|
||
|
|
||
|
struct msghdr m;
|
||
|
m.msg_control = 0;
|
||
|
return 0;
|
||
|
}
|
||
|
"
|
||
|
HAVE_CONTROL_IN_MSGHDR )
|
||
|
|
||
|
if(HAVE_CONTROL_IN_MSGHDR)
|
||
|
#
|
||
|
# Check whether BSD 4.4 / RFC2292 style fd passing works
|
||
|
#
|
||
|
set(EXTRA_COMPILE_DEFINITIONS "")
|
||
|
if(HAVE_SYS_TYPES_H)
|
||
|
set(EXTRA_COMPILE_DEFINITIONS "${EXTRA_COMPILE_DEFINITIONS} -DHAVE_SYS_TYPES_H=1")
|
||
|
endif()
|
||
|
if(HAVE_SYS_UIO_H)
|
||
|
set(EXTRA_COMPILE_DEFINITIONS "${EXTRA_COMPILE_DEFINITIONS} -DHAVE_SYS_UIO_H=1")
|
||
|
endif()
|
||
|
|
||
|
# Try without _XOPEN_SOURCE first
|
||
|
try_run(
|
||
|
# Name of variable to store the run result (process exit status; number) in:
|
||
|
test_run_result
|
||
|
# Name of variable to store the compile result (TRUE or FALSE) in:
|
||
|
test_compile_result
|
||
|
# Binary directory:
|
||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||
|
# Source file to be compiled:
|
||
|
${_selfdir_CheckFDPassing}/CheckFDPassing.c
|
||
|
# Extra -D Compile Definitions
|
||
|
COMPILE_DEFINITIONS ${EXTRA_COMPILE_DEFINITIONS}
|
||
|
# Where to store the output produced during compilation:
|
||
|
COMPILE_OUTPUT_VARIABLE test_compile_output
|
||
|
# Where to store the output produced by running the compiled executable:
|
||
|
RUN_OUTPUT_VARIABLE test_run_output )
|
||
|
|
||
|
# Did compilation succeed and process return 0 (success)?
|
||
|
if("${test_compile_result}" AND ("${test_run_result}" EQUAL 0))
|
||
|
set(HAVE_FD_PASSING 1)
|
||
|
else()
|
||
|
# Try again, this time with: #define _XOPEN_SOURCE 500
|
||
|
set(EXTRA_COMPILE_DEFINITIONS "${EXTRA_COMPILE_DEFINITIONS} -D_XOPEN_SOURCE=500")
|
||
|
|
||
|
try_run(
|
||
|
# Name of variable to store the run result (process exit status; number) in:
|
||
|
test_run_result
|
||
|
# Name of variable to store the compile result (TRUE or FALSE) in:
|
||
|
test_compile_result
|
||
|
# Binary directory:
|
||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||
|
# Source file to be compiled:
|
||
|
${_selfdir_CheckFDPassing}/CheckFDPassing.c
|
||
|
# Extra -D Compile Definitions
|
||
|
COMPILE_DEFINITIONS ${EXTRA_COMPILE_DEFINITIONS}
|
||
|
# Where to store the output produced during compilation:
|
||
|
COMPILE_OUTPUT_VARIABLE test_compile_output
|
||
|
# Where to store the output produced by running the compiled executable:
|
||
|
RUN_OUTPUT_VARIABLE test_run_output )
|
||
|
|
||
|
# Did compilation succeed and process return 0 (success)?
|
||
|
if("${test_compile_result}" AND ("${test_run_result}" EQUAL 0))
|
||
|
set(HAVE_FD_PASSING 1)
|
||
|
set(FDPASS_NEED_XOPEN 1)
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
endif()
|