1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::errors::Error;
use libc;
use log::*;
use std;

#[inline]
pub fn check_libpcap_error(handle: *mut pcap_sys::pcap_t, success: bool) -> Result<(), Error> {
    if success {
        Ok(())
    } else {
        Err(convert_libpcap_error(handle))
    }
}

#[inline]
pub fn convert_libpcap_error(handle: *mut pcap_sys::pcap_t) -> Error {
    let error = unsafe { pcap_sys::pcap_geterr(handle) };
    match cstr_to_string(error as _) {
        Err(e) => e,
        Ok(err) => {
            error!("LibPcap encountered an error: {}", err);
            Error::LibPcapError(err)
        }
    }
}

#[inline]
pub fn cstr_to_string(err: *mut std::os::raw::c_char) -> Result<String, Error> {
    if err.is_null() {
        Err(Error::NullPtr)
    } else {
        unsafe { std::ffi::CStr::from_ptr(err) }
            .to_str()
            .map_err(Error::Utf8)
            .map(|s| s.to_owned())
    }
}