From fbf7bb9c9766df4ce4991d627870558331072c07 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 29 Jul 2017 23:18:41 +0200 Subject: [PATCH] enable non blocking capture using selectable fd --- src/lib.rs | 19 +++++++++++++++++++ src/raw.rs | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7d45e246a..16e7e5639 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -660,6 +660,25 @@ impl Capture { .map(|_| Stat::new(stats.ps_recv, stats.ps_drop, stats.ps_ifdrop)) } } + + pub fn setnonblock(&self, non_blocking: bool) -> Result<(), Error> { + with_errbuf(|err| unsafe { + + let nonblock: ::libc::c_int = if non_blocking { 1 } else { 0 }; + + if -1 == raw::pcap_setnonblock(*self.handle, nonblock, err) { + return Err(Error::new(err)); + } + Ok(()) + }) + } + + pub fn get_selectable_fd(&self) -> Result { + unsafe { + let fd = raw::pcap_get_selectable_fd(*self.handle); + self.check_err(fd != -1).map(|_| fd as RawFd) + } + } } impl Capture { diff --git a/src/raw.rs b/src/raw.rs index 75c43baff..1d67b1cde 100644 --- a/src/raw.rs +++ b/src/raw.rs @@ -129,7 +129,7 @@ extern "C" { pub fn pcap_setfilter(arg1: *mut pcap_t, arg2: *mut bpf_program) -> c_int; pub fn pcap_setdirection(arg1: *mut pcap_t, arg2: pcap_direction_t) -> c_int; // pub fn pcap_getnonblock(arg1: *mut pcap_t, arg2: *mut c_char) -> c_int; - // pub fn pcap_setnonblock(arg1: *mut pcap_t, arg2: c_int, arg3: *mut c_char) -> c_int; + pub fn pcap_setnonblock(arg1: *mut pcap_t, arg2: c_int, arg3: *mut c_char) -> c_int; pub fn pcap_sendpacket(arg1: *mut pcap_t, arg2: *const c_uchar, arg3: c_int) -> c_int; // pub fn pcap_statustostr(arg1: c_int) -> *const c_char; // pub fn pcap_strerror(arg1: c_int) -> *const c_char; @@ -170,7 +170,7 @@ extern "C" { // pub fn pcap_lib_version() -> *const c_char; // pub fn bpf_image(arg1: *const bpf_insn, arg2: c_int) -> *mut c_char; // pub fn bpf_dump(arg1: *const bpf_program, arg2: c_int) -> (); - // pub fn pcap_get_selectable_fd(arg1: *mut pcap_t) -> c_int; + pub fn pcap_get_selectable_fd(arg1: *mut pcap_t) -> c_int; } #[cfg(windows)]