53 lines
1.4 KiB
Diff
53 lines
1.4 KiB
Diff
|
--- pcap-bpf.c
|
||
|
+++ pcap-bpf.c
|
||
|
@@ -558,7 +558,7 @@
|
||
|
fd = open(device, O_RDWR);
|
||
|
if (fd == -1 && errno == EACCES)
|
||
|
fd = open(device, O_RDONLY);
|
||
|
- } while (fd < 0 && errno == EBUSY);
|
||
|
+ } while (fd < 0 && errno == EBUSY && n < 1000);
|
||
|
|
||
|
/*
|
||
|
* XXX better message for all minors used
|
||
|
--- pcap-linux.c
|
||
|
+++ pcap-linux.c
|
||
|
@@ -100,6 +100,7 @@
|
||
|
#include <netinet/in.h>
|
||
|
#include <linux/if_ether.h>
|
||
|
#include <net/if_arp.h>
|
||
|
+#include <sys/poll.h>
|
||
|
|
||
|
/*
|
||
|
* If PF_PACKET is defined, we can use {SOCK_RAW,SOCK_DGRAM}/PF_PACKET
|
||
|
@@ -1011,8 +1012,30 @@
|
||
|
if (can_filter_in_kernel) {
|
||
|
if ((err = set_kernel_filter(handle, &fcode)) == 0)
|
||
|
{
|
||
|
+ char buf[1024];
|
||
|
+ int oldflags;
|
||
|
+ int ret;
|
||
|
+ unsigned int received = 0, rec_len = 0;
|
||
|
+ socklen_t optlen = sizeof(rec_len);
|
||
|
/* Installation succeded - using kernel filter. */
|
||
|
handle->md.use_bpf = 1;
|
||
|
+
|
||
|
+ oldflags = fcntl(handle->fd, F_GETFL, 0);
|
||
|
+ oldflags |= O_NONBLOCK;
|
||
|
+ fcntl(handle->fd, F_SETFL, oldflags);
|
||
|
+ getsockopt(handle->fd, SOL_SOCKET, SO_RCVBUF,
|
||
|
+ (char *)&rec_len, &optlen);
|
||
|
+
|
||
|
+ /* now read all packets received until now */
|
||
|
+ while((ret = read(handle->fd, buf, 1024)) > 0
|
||
|
+ && received < rec_len) {
|
||
|
+ received += ret;
|
||
|
+ }
|
||
|
+
|
||
|
+ if(oldflags > 0) {
|
||
|
+ oldflags &= ~O_NONBLOCK;
|
||
|
+ fcntl(handle->fd, F_SETFL, oldflags);
|
||
|
+ }
|
||
|
}
|
||
|
else if (err == -1) /* Non-fatal error */
|
||
|
{
|