use std::ffi::{CStr};
use libc::{c_char, c_void, c_uint, c_uchar, c_ushort, timeval};
use std::mem::uninitialized;
use crate::common::InterfaceDescription;
use crate::utils::cstr_to_string;
use super::constants::ERRBUF_SIZE;
pub enum PCapHandle {}
pub enum PCapDumper {}
pub struct PCapErrBuf {
buffer: [c_char; ERRBUF_SIZE]
}
impl PCapErrBuf{
pub fn as_string(&self) -> String {
unsafe{
CStr::from_ptr(self.buffer.as_ptr())
}.to_string_lossy().into_owned()
}
pub fn buffer(&mut self) -> * mut c_char {
self.buffer.as_mut_ptr()
}
pub fn new () -> PCapErrBuf {
PCapErrBuf {
buffer: unsafe{uninitialized()}
}
}
}
#[repr(C)]
pub struct PCapInterface {
pub next: * const PCapInterface,
pub name: * const c_char,
pub description: * const c_char,
pub addresses: * const c_void,
pub flags: c_uint
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct PCapPacketHeader {
pub ts: timeval,
pub caplen: c_uint,
pub len: c_uint,
#[cfg(any(target_os = "macos", target_os = "ios"))]
pub comment: [c_char; 256]
}
pub enum PCapDirection {
InOut = 0,
In = 1,
Out = 2,
}
pub type PCapHandler=extern "C" fn(user: * mut c_uchar, h: * const PCapPacketHeader, bytes: * const c_uchar);
pub fn interface_data_from_pcap_list(interfs: * const PCapInterface) -> Vec<InterfaceDescription> {
let mut interfs_descr = Vec::new();
let mut curr = interfs;
while !curr.is_null() {
let id = InterfaceDescription {
name: cstr_to_string(unsafe{(*curr).name}),
description: cstr_to_string(unsafe{(*curr).description})
};
interfs_descr.push(id);
curr = unsafe{(*curr).next};
}
interfs_descr
}
pub struct BpfInsn {
pub code: c_ushort,
pub jt: c_uchar,
pub jf: c_uchar,
pub k: u32,
}
pub struct BpfProgram {
pub bf_len: c_uint,
pub bf_insns: *mut BpfInsn,
}