diff --git a/nsock/include/nsock_config.h.in b/nsock/include/nsock_config.h.in index 8279c2924..4bc334f11 100644 --- a/nsock/include/nsock_config.h.in +++ b/nsock/include/nsock_config.h.in @@ -85,3 +85,5 @@ #undef HAVE_EPOLL #undef HAVE_POLL #undef HAVE_KQUEUE + +#undef PCAP_NETMASK_UNKNOWN diff --git a/nsock/include/nsock_winconfig.h b/nsock/include/nsock_winconfig.h index 5d77527cb..0f281c8cb 100644 --- a/nsock/include/nsock_winconfig.h +++ b/nsock/include/nsock_winconfig.h @@ -95,6 +95,8 @@ #ifndef DISABLE_NSOCK_PCAP #define HAVE_PCAP 1 +/* WinPCAP doesn't have this */ +#define PCAP_NETMASK_UNKNOWN 0 #endif /* WSAPoll() isn't available before Vista */ diff --git a/nsock/src/acinclude.m4 b/nsock/src/acinclude.m4 index 9a972cc97..696cd3414 100644 --- a/nsock/src/acinclude.m4 +++ b/nsock/src/acinclude.m4 @@ -118,3 +118,24 @@ $1],[AC_MSG_RESULT([no]) $2]) ])dnl +dnl Checks if PCAP_NETMASK_UNKNOWN is defined (has been since libpcap 1.1.1) +dnl Sets it to 0 (no checking) if it's not defined. +AC_DEFUN([PCAP_DEFINE_NETMASK_UNKNOWN], +[ + AC_MSG_CHECKING(if PCAP_NETMASK_UNKNOWN is defined/handled by libpcap) + AC_CACHE_VAL(ac_cv_have_pcap_netmask_unknown, + AC_TRY_COMPILE( + [ + #include + ], + [ + int i = PCAP_NETMASK_UNKNOWN; + ], + ac_cv_have_pcap_netmask_unknown=yes, + ac_cv_have_pcap_netmask_unknown=no)) + if test $ac_cv_have_pcap_netmask_unknown = no; then + AC_DEFINE(PCAP_NETMASK_UNKNOWN, 0, [Possibly using libpcap prior to 1.1.0.]) + fi + AC_MSG_RESULT($ac_cv_have_pcap_netmask_unknown) +]) + diff --git a/nsock/src/configure b/nsock/src/configure index f0d3cd22c..8e811ded8 100755 --- a/nsock/src/configure +++ b/nsock/src/configure @@ -3625,6 +3625,44 @@ if test "$have_libpcap" != "no"; then fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PCAP_NETMASK_UNKNOWN is defined/handled by libpcap" >&5 +$as_echo_n "checking if PCAP_NETMASK_UNKNOWN is defined/handled by libpcap... " >&6; } + if ${ac_cv_have_pcap_netmask_unknown+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + int i = PCAP_NETMASK_UNKNOWN; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_pcap_netmask_unknown=yes +else + ac_cv_have_pcap_netmask_unknown=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + if test $ac_cv_have_pcap_netmask_unknown = no; then + +$as_echo "#define PCAP_NETMASK_UNKNOWN 0" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_pcap_netmask_unknown" >&5 +$as_echo "$ac_cv_have_pcap_netmask_unknown" >&6; } + + ax_have_epoll_cppflags="${CPPFLAGS}" ac_fn_c_check_header_mongrel "$LINENO" "linux/version.h" "ac_cv_header_linux_version_h" "$ac_includes_default" if test "x$ac_cv_header_linux_version_h" = xyes; then : diff --git a/nsock/src/configure.ac b/nsock/src/configure.ac index 1772e9da8..2a0ba2034 100644 --- a/nsock/src/configure.ac +++ b/nsock/src/configure.ac @@ -168,6 +168,8 @@ if test "$have_libpcap" != "no"; then fi AC_SUBST(LIBPCAP_LIBS) +PCAP_DEFINE_NETMASK_UNKNOWN + AX_HAVE_EPOLL([AC_DEFINE(HAVE_EPOLL)], ) AX_HAVE_POLL([AC_DEFINE(HAVE_POLL)], ) AC_CHECK_FUNCS(kqueue kevent, [AC_DEFINE(HAVE_KQUEUE)], ) diff --git a/nsock/src/error.h b/nsock/src/error.h index c00088759..60a97bbff 100644 --- a/nsock/src/error.h +++ b/nsock/src/error.h @@ -74,13 +74,18 @@ #include #endif +#if defined(__GNUC__) +#define NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define NORETURN __declspec((noreturn)) +#else +#define NORETURN +#endif -void fatal(char *fmt, ...) - __attribute__ ((noreturn)) +NORETURN void fatal(char *fmt, ...) __attribute__ ((format (printf, 1, 2))); -void pfatal(char *fmt, ...) - __attribute__ ((noreturn)) +NORETURN void pfatal(char *fmt, ...) __attribute__ ((format (printf, 1, 2))); #endif /* ERROR_H */ diff --git a/nsock/src/nsock_pcap.c b/nsock/src/nsock_pcap.c index aa977a5f9..04980cb18 100644 --- a/nsock/src/nsock_pcap.c +++ b/nsock/src/nsock_pcap.c @@ -107,7 +107,7 @@ static int nsock_pcap_set_filter(struct npool *nsp, pcap_t *pt, const char *devi struct bpf_program fcode; int rc; - rc = pcap_compile(pt, &fcode, (char *)bpf, 1, 0); + rc = pcap_compile(pt, &fcode, (char *)bpf, 1, PCAP_NETMASK_UNKNOWN); if (rc) { nsock_log_error(nsp, "Error compiling pcap filter: %s", pcap_geterr(pt)); return rc; diff --git a/nsock/src/nsock_proxy.c b/nsock/src/nsock_proxy.c index 71891db37..1ede70219 100644 --- a/nsock/src/nsock_proxy.c +++ b/nsock/src/nsock_proxy.c @@ -375,6 +375,7 @@ static struct proxy_node *proxy_node_new(char *proxystr) { } } fatal("Invalid protocol in proxy specification string: %s", proxystr); + return NULL; } struct proxy_parser *proxy_parser_new(const char *proxychainstr) { diff --git a/nsock/tests/connect.c b/nsock/tests/connect.c index 0baf602db..e4027bf38 100644 --- a/nsock/tests/connect.c +++ b/nsock/tests/connect.c @@ -93,7 +93,7 @@ static int connect_tcp_failure(void *tdata) { (struct sockaddr *)&peer, 0, PORT_TCP); nsock_loop(ctd->nsp, 4000); - AssertEqual(ctd->connect_result, -EINVAL); + AssertEqual(ctd->connect_result, EINVAL); return 0; }