use std::mem;
#[repr(C)]
pub struct TarHeader {
pub name: [u8; 100],
pub mode: [u8; 8],
pub uid: [u8; 8],
pub gid: [u8; 8],
pub size: [u8; 12],
pub mtime: [u8; 12],
pub checksum: [u8; 8],
pub typeflag: u8,
pub linkname: [u8; 100],
pub magic: [u8; 6],
pub version: [u8; 2],
pub uname: [u8; 32],
pub gname: [u8; 32],
pub devmajor: [u8; 8],
pub devminor: [u8; 8],
pub prefix: [u8; 155],
pub padding: [u8; 12],
}
impl TarHeader {
pub fn new() -> Self {
let mut h = unsafe { mem::zeroed::<TarHeader>() };
h.magic.copy_from_slice(b"ustar ");
h.version.copy_from_slice(b" \0");
h
}
pub fn calculate_checksum(&self) -> u32 {
let ptr = self as *const _ as *const u8;
let mut sum: u32 = 0;
for i in 0..512 {
if i >= 148 && i < 156 {
sum += 32;
} else {
sum += unsafe { *ptr.add(i) } as u32;
}
}
sum
}
pub fn set_octal(dst: &mut [u8], val: u64) {
let len = dst.len();
let s = format!("{:0>width$o}", val, width = len - 1);
for (i, b) in s.as_bytes().iter().enumerate().take(len - 1) {
dst[i] = *b;
}
}
}