aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2017-11-11 15:44:38 -0800
committerGuy Harris <guy@alum.mit.edu>2017-11-11 15:44:38 -0800
commit9c0c1fe79b784bfce7dc77fceefe6dbed5ea37a4 (patch)
treeb3d849f5d1626da44febf1f5a8f5c347b0486e76
parentf8469da1aeb2505f7882617211e47c5752e7b1a5 (diff)
downloadlibpcap-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.txt5
-rw-r--r--cmakeconfig.h.in6
-rw-r--r--config.h.in6
-rwxr-xr-xconfigure68
-rw-r--r--configure.ac26
-rw-r--r--sockutils.c4
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
diff --git a/configure b/configure
index a9f59bb5..d5a9c7b9 100755
--- a/configure
+++ b/configure
@@ -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)
{