use super::header::RawNewcHeader;
use crate::error::Result;
use crate::mode::FileType;
use core::fmt;
#[derive(Debug, Clone)]
pub struct CpioEntryHeader {
pub ino: u32,
pub mode: u32,
pub uid: u32,
pub gid: u32,
pub nlink: u32,
pub mtime: u32,
pub filesize: u32,
pub devmajor: u32,
pub devminor: u32,
pub rdevmajor: u32,
pub rdevminor: u32,
pub check: u32,
}
impl fmt::Display for CpioEntryHeader {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "ino {} ({} bytes)", self.ino, self.filesize)
}
}
impl CpioEntryHeader {
pub fn from_raw(raw: &RawNewcHeader) -> Result<Self> {
Ok(Self {
ino: raw.ino()?,
mode: raw.mode()?,
uid: raw.uid()?,
gid: raw.gid()?,
nlink: raw.nlink()?,
mtime: raw.mtime()?,
filesize: raw.filesize()?,
devmajor: raw.devmajor()?,
devminor: raw.devminor()?,
rdevmajor: raw.rdevmajor()?,
rdevminor: raw.rdevminor()?,
check: raw.check()?,
})
}
pub fn file_type(&self) -> FileType {
FileType::from_mode(self.mode)
}
pub fn permissions(&self) -> u32 {
self.mode & 0o7777
}
pub fn is_trailer_like(&self) -> bool {
self.ino == 0 && self.mode == 0 && self.nlink == 1 && self.filesize == 0
}
pub fn is_hard_link(&self) -> bool {
self.file_type() == FileType::Regular && self.nlink > 1
}
}