--- netutil.cc.old 2010-10-20 13:57:31.000000000 +0200 +++ netutil.cc 2010-10-20 13:54:58.000000000 +0200 @@ -128,6 +128,8 @@ #define NETINET_IP_H #endif +#include + #include "netutil.h" #define NBASE_MAX_ERR_STR_LEN 1024 /* Max length of an error message */ @@ -628,9 +630,23 @@ results. If you just want to test whether the function is supported, use pcap_selectable_fd_valid() instead. */ int my_pcap_get_selectable_fd(pcap_t *p) { -#if defined(WIN32) || defined(MACOSX) || (defined(FREEBSD) && (__FreeBSD_version < 500000)) +#if defined(WIN32) || (defined(FREEBSD) && (__FreeBSD_version < 500000)) return -1; #else + #if defined(FREEBSD) || defined(MACOSX) + int fd; + if ((fd = pcap_get_selectable_fd(p)) == -1) { + return -1; + } + int on=1; + if (ioctl(fd, BIOCIMMEDIATE, &on) <0) { + netutil_error("%s: %s", __func__, strerror(errno)); + } + if (fcntl(fd, F_SETFL, O_NONBLOCK) <0) { + netutil_error("%s: %s", __func__, strerror(errno)); + } + return -1; + #endif assert(pcap_selectable_fd_valid()); return pcap_get_selectable_fd(p); #endif @@ -647,7 +663,6 @@ if ((fd = my_pcap_get_selectable_fd(p)) == -1) return -1; - FD_ZERO(&rfds); FD_SET(fd, &rfds); @@ -3349,7 +3364,6 @@ sleep( compute_sleep_time(failed) ); } } while (!pt); - #ifdef WIN32 /* We want any responses back ASAP */ pcap_setmintocopy(pt, 1);