pub const INDEX_MAGIC: u32 = 0x6942_534D;
pub const INDEX_VERSION: u32 = 1;
pub const DIR_FLAG_OPAQUE: u8 = 0x01;
pub const ENTRY_FLAG_WHITEOUT: u8 = 0x01;
pub const DIR_RECORD_IDX_NONE: u32 = 0xFFFF_FFFF;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct IndexHeader {
pub magic: u32,
pub version: u32,
pub flags: u32,
pub dir_count: u32,
pub entry_count: u32,
pub hardlink_ref_count: u32,
pub string_pool_size: u32,
pub checksum: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct DirRecord {
pub path_off: u32,
pub path_len: u16,
pub flags: u8,
pub _pad: u8,
pub first_entry: u32,
pub entry_count: u32,
pub tombstone_off: u32,
pub tombstone_count: u16,
pub _pad2: u16,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct EntryRecord {
pub host_ino: u64,
pub size: u64,
pub name_off: u32,
pub mode: u32,
pub uid: u32,
pub gid: u32,
pub name_len: u16,
pub flags: u8,
pub _pad: u8,
pub dir_record_idx: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct HardlinkRef {
pub host_ino: u64,
pub path_off: u32,
pub path_len: u32,
}
const _: () = assert!(size_of::<IndexHeader>() == 32);
const _: () = assert!(size_of::<DirRecord>() == 24);
const _: () = assert!(size_of::<EntryRecord>() == 40);
const _: () = assert!(size_of::<HardlinkRef>() == 16);