Files
zig-squashfs/superblock.zig
T
2025-05-14 01:59:19 -05:00

55 lines
1.3 KiB
Zig

const math = @import("std").math;
const InodeRef = @import("inode.zig").InodeRef;
const CompressionType = @import("decompress.zig").CompressionType;
pub const SuperblockError = error{
InvalidMagic,
InvalidLog,
InvalidVersion,
};
pub const Superblock = packed struct {
magic: u32,
count: u32,
mod_time: u32,
block_size: u32,
frags: u32,
comp: CompressionType,
block_log: u16,
flags: packed struct {
inode_uncomp: bool,
data_uncomp: bool,
_unused: bool,
frag_uncomp: bool,
frag_always: bool,
data_dedupe: bool,
export_table: bool,
xattr_uncomp: bool,
no_xattr: bool,
comp_options: bool,
id_uncomp: bool,
_padding: u5,
},
id_count: u16,
ver_maj: u16,
ver_min: u16,
root_inode: InodeRef,
size: u64,
id_table: u64,
xattr_table: u64,
inode_table: u64,
dir_table: u64,
frag_table: u64,
export_table: u64,
pub fn valid(self: Superblock) SuperblockError!void {
if (self.magic != 0x73717368) {
return SuperblockError.InvalidMagic;
} else if (self.block_log != math.log2(self.block_size)) {
return SuperblockError.InvalidLog;
} else if (self.ver_maj != 4 or self.ver_min != 0) {
return SuperblockError.InvalidVersion;
}
}
};