diff options
author | Guy Harris <guy@alum.mit.edu> | 2017-11-11 15:44:38 -0800 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2017-11-11 15:44:38 -0800 |
commit | 9c0c1fe79b784bfce7dc77fceefe6dbed5ea37a4 (patch) | |
tree | b3d849f5d1626da44febf1f5a8f5c347b0486e76 | |
parent | f8469da1aeb2505f7882617211e47c5752e7b1a5 (diff) | |
download | libpcap-9c0c1fe79b784bfce7dc77fceefe6dbed5ea37a4.tar.gz |
Check for msg_control or msg_flags in struct msghdr.
Solaris doesn't have either of them, so don't assume all UN*Xes do.
-rw-r--r-- | CMakeLists.txt | 5 | ||||
-rw-r--r-- | cmakeconfig.h.in | 6 | ||||
-rw-r--r-- | config.h.in | 6 | ||||
-rwxr-xr-x | configure | 68 | ||||
-rw-r--r-- | configure.ac | 26 | ||||
-rw-r--r-- | sockutils.c | 4 |
6 files changed, 115 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index df4414a8..29486df4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1251,6 +1251,11 @@ endif() # if(ENABLE_REMOTE) + # + # Check for various members of struct msghdr. + # + check_struct_has_member("struct msghdr" msg_control "sys/socket.h" STRUCT_MSGHDR_HAS_MSG_CONTROL) + check_struct_has_member("struct msghdr" msg_flags "sys/socket.h" STRUCT_MSGHDR_HAS_MSG_FLAGS) set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-new.c pcap-rpcap.c rpcap-protocol.c sockutils.c) add_subdirectory(rpcapd) diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in index d78bbe39..35578365 100644 --- a/cmakeconfig.h.in +++ b/cmakeconfig.h.in @@ -309,6 +309,12 @@ /* Define to 1 if strings.h declares `ffs' */ #cmakedefine STRINGS_H_DECLARES_FFS 1 +/* if struct msghdr has a msg_control member */ +#cmakedefine STRUCT_MSGHDR_HAS_MSG_CONTROL 1 + +/* if struct msghdr has a msg_flags member */ +#cmakedefine STRUCT_MSGHDR_HAS_MSG_FLAGS 1 + /* Define to 1 if sys/ethernet.h declares `ether_hostton' */ #cmakedefine SYS_ETHERNET_H_DECLARES_ETHER_HOSTTON 1 diff --git a/config.h.in b/config.h.in index b5e3d9c0..277918ff 100644 --- a/config.h.in +++ b/config.h.in @@ -306,6 +306,12 @@ /* Define to 1 if strings.h declares `ffs' */ #undef STRINGS_H_DECLARES_FFS +/* if struct msghdr has a msg_control member */ +#undef STRUCT_MSGHDR_HAS_MSG_CONTROL + +/* if struct msghdr has a msg_flags member */ +#undef STRUCT_MSGHDR_HAS_MSG_FLAGS + /* Define to 1 if sys/ethernet.h declares `ether_hostton' */ #undef SYS_ETHERNET_H_DECLARES_ETHER_HOSTTON @@ -7273,6 +7273,74 @@ fi done + # + # Check for various members of struct msghdr. + # + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if struct msghdr has a msg_control member" >&5 +$as_echo_n "checking if struct msghdr has a msg_control member... " >&6; } + if ${ac_cv_lbl_struct_msghdr_has_msg_control+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# include <sys/socket.h> +int +main () +{ +u_int i = sizeof(((struct msghdr *)0)->msg_control) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_lbl_struct_msghdr_has_msg_control=yes +else + ac_cv_lbl_struct_msghdr_has_msg_control=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_struct_msghdr_has_msg_control" >&5 +$as_echo "$ac_cv_lbl_struct_msghdr_has_msg_control" >&6; } + if test $ac_cv_lbl_struct_msghdr_has_msg_control = yes ; then + +$as_echo "#define STRUCT_MSGHDR_HAS_MSG_CONTROL 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if struct msghdr has a msg_flags member" >&5 +$as_echo_n "checking if struct msghdr has a msg_flags member... " >&6; } + if ${ac_cv_lbl_struct_msghdr_has_msg_flags+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# include <sys/socket.h> +int +main () +{ +u_int i = sizeof(((struct msghdr *)0)->msg_flags) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_lbl_struct_msghdr_has_msg_flags=yes +else + ac_cv_lbl_struct_msghdr_has_msg_flags=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_struct_msghdr_has_msg_flags" >&5 +$as_echo "$ac_cv_lbl_struct_msghdr_has_msg_flags" >&6; } + if test $ac_cv_lbl_struct_msghdr_has_msg_flags = yes ; then + +$as_echo "#define STRUCT_MSGHDR_HAS_MSG_FLAGS 1" >>confdefs.h + + fi + $as_echo "#define ENABLE_REMOTE /**/" >>confdefs.h diff --git a/configure.ac b/configure.ac index 1b4009e3..1f608ee2 100644 --- a/configure.ac +++ b/configure.ac @@ -1300,6 +1300,32 @@ yes) AC_MSG_RESULT(yes) # AC_CHECK_FUNCS(getspnam) + # + # Check for various members of struct msghdr. + # + AC_MSG_CHECKING(if struct msghdr has a msg_control member) + AC_CACHE_VAL(ac_cv_lbl_struct_msghdr_has_msg_control, + AC_TRY_COMPILE([ +# include <sys/socket.h>], + [u_int i = sizeof(((struct msghdr *)0)->msg_control)], + ac_cv_lbl_struct_msghdr_has_msg_control=yes, + ac_cv_lbl_struct_msghdr_has_msg_control=no)) + AC_MSG_RESULT($ac_cv_lbl_struct_msghdr_has_msg_control) + if test $ac_cv_lbl_struct_msghdr_has_msg_control = yes ; then + AC_DEFINE(STRUCT_MSGHDR_HAS_MSG_CONTROL,1,[if struct msghdr has a msg_control member]) + fi + AC_MSG_CHECKING(if struct msghdr has a msg_flags member) + AC_CACHE_VAL(ac_cv_lbl_struct_msghdr_has_msg_flags, + AC_TRY_COMPILE([ +# include <sys/socket.h>], + [u_int i = sizeof(((struct msghdr *)0)->msg_flags)], + ac_cv_lbl_struct_msghdr_has_msg_flags=yes, + ac_cv_lbl_struct_msghdr_has_msg_flags=no)) + AC_MSG_RESULT($ac_cv_lbl_struct_msghdr_has_msg_flags) + if test $ac_cv_lbl_struct_msghdr_has_msg_flags = yes ; then + AC_DEFINE(STRUCT_MSGHDR_HAS_MSG_FLAGS,1,[if struct msghdr has a msg_flags member]) + fi + AC_DEFINE(ENABLE_REMOTE,, [Define to 1 if remote packet capture is to be supported]) SSRC="$SSRC pcap-new.c pcap-rpcap.c rpcap-protocol.c sockutils.c" diff --git a/sockutils.c b/sockutils.c index ad1a4661..011e4d7b 100644 --- a/sockutils.c +++ b/sockutils.c @@ -916,9 +916,13 @@ int sock_recv_dgram(SOCKET sock, void *buffer, size_t size, iov.iov_len = size; message.msg_iov = &iov; message.msg_iovlen = 1; +#ifdef STRUCT_MSGHDR_HAS_MSG_CONTROL message.msg_control = NULL; /* we don't care about control information */ message.msg_controllen = 0; +#endif +#ifdef STRUCT_MSGHDR_HAS_MSG_FLAGS message.msg_flags = 0; +#endif nread = recvmsg(sock, &message, 0); if (nread == -1) { |