use super::{HeadError, Meta};
use std::{borrow::Cow, ffi::CStr};
pub struct Header(*mut clamav_sys::cl_cvd);
impl Meta for Header {
fn from_header_bytes(bytes: &[u8; 512]) -> Result<Self, HeadError> {
unsafe {
let raw = clamav_sys::cl_cvdparse(bytes.as_ptr() as *const i8);
if raw.is_null() {
Err(HeadError::Parse)
} else {
Ok(Header(raw))
}
}
}
fn f_level(&self) -> usize {
unsafe { (*self.0).fl as usize }
}
fn n_sigs(&self) -> usize {
unsafe { (*self.0).sigs as usize }
}
fn time_str(&self) -> Cow<'_, str> {
unsafe { CStr::from_ptr((*self.0).time).to_string_lossy() }
}
fn version(&self) -> usize {
unsafe { (*self.0).version as usize }
}
fn md5_str(&self) -> Cow<'_, str> {
unsafe { CStr::from_ptr((*self.0).md5).to_string_lossy() }
}
fn dsig_str(&self) -> Cow<'_, str> {
unsafe { CStr::from_ptr((*self.0).dsig).to_string_lossy() }
}
fn builder(&self) -> Cow<'_, str> {
unsafe { CStr::from_ptr((*self.0).builder).to_string_lossy() }
}
fn stime(&self) -> u64 {
unsafe { (*self.0).stime }
}
}
impl std::fmt::Debug for Header {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CvdHead")
.field("f_level", &self.f_level())
.field("n_sigs", &self.n_sigs())
.field("time", &self.time_str())
.field("version", &self.version())
.field("md5", &self.md5_str())
.field("dsig", &self.dsig_str())
.field("builder", &self.builder())
.field("stime", &self.stime())
.finish()
}
}