1use crate::errors::Error;
2use libc;
3use log::*;
4use std;
5
6#[inline]
7pub fn check_libpcap_error(handle: *mut pcap_sys::pcap_t, success: bool) -> Result<(), Error> {
8 if success {
9 Ok(())
10 } else {
11 Err(convert_libpcap_error(handle))
12 }
13}
14
15#[inline]
16pub fn convert_libpcap_error(handle: *mut pcap_sys::pcap_t) -> Error {
17 let error = unsafe { pcap_sys::pcap_geterr(handle) };
18 match cstr_to_string(error as _) {
19 Err(e) => e,
20 Ok(err) => {
21 error!("LibPcap encountered an error: {}", err);
22 Error::LibPcapError(err)
23 }
24 }
25}
26
27#[inline]
28pub fn cstr_to_string(err: *mut std::os::raw::c_char) -> Result<String, Error> {
29 if err.is_null() {
30 Err(Error::NullPtr)
31 } else {
32 unsafe { std::ffi::CStr::from_ptr(err) }
33 .to_str()
34 .map_err(Error::Utf8)
35 .map(|s| s.to_owned())
36 }
37}