From 78dbaaed7e43c0a5a634600e8e627e554933d67f Mon Sep 17 00:00:00 2001 From: "Caleb J. Gardner" Date: Sat, 8 Aug 2026 21:56:22 -0500 Subject: [PATCH] Re-adding stuff --- src/archive.zig | 54 +++++++++++++++++++++++++++--- src/inode.zig | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 src/inode.zig diff --git a/src/archive.zig b/src/archive.zig index 314ac0c..2d3e0e6 100644 --- a/src/archive.zig +++ b/src/archive.zig @@ -5,12 +5,56 @@ const Archive = @This(); map: Io.File.MemoryMap, +super: Superblock, + pub fn open(io: Io, file: Io.File, offset: u64) !Archive { + var map = try file.createMemoryMap(io, .{ + .len = try file.length(io) - offset, + .offset = offset, + .protection = .{ .read = true }, + }); + + var super: Superblock = std.mem.bytesToValue(Superblock, map.memory[0..@sizeOf(Superblock)]); + try super.check(); + return .{ - .map = try file.createMemoryMap(io, .{ - .len = super.size, - .offset = offset, - .protection = .{ .read = true }, - }), + .map = map, + + .super = super, }; } + +// Superblock + +pub const Superblock = extern struct { + pub const MAGIC: u32 = 0x73717368; + + magic: u32, + inode_count: u32, + mod_time: u32, + block_size: u32, + frag_count: u32, + compression: u16, + block_log: u16, + flags: u16, // TODO: break out into packed struct. + id_count: u16, + version_major: u16, + version_minor: u16, + root_inode_ref: u64, // TODO: Change to inode reference packed struct. + size: u64, + id_table_start: u64, + xattr_table_start: u64, + inode_table_start: u64, + dir_table_start: u64, + frag_table_start: u64, + export_table_start: u64, + + fn check(self: Superblock) !void { + if (self.magic != MAGIC) + return error.InvalidMagic; + if (self.version_major != 4 or self.version_minor != 0) + return error.IncompatibleVersion; + if (std.math.log2(self.block_size) != self.block_log) + return error.BadBlockLog; + } +}; diff --git a/src/inode.zig b/src/inode.zig new file mode 100644 index 0000000..2f1aac2 --- /dev/null +++ b/src/inode.zig @@ -0,0 +1,89 @@ +const std = @import("std"); +const Io = std.Io; + +const Inode = @This(); + +header: Header, +data: Data, + +// Types + +pub const Reference = packed struct(u64) { + _: u16, + block: u32, + offset: u16, +}; + +pub const Type = enum(u16) { + dir, + file, + symlink, + block_dev, + char_dev, + fifo, + socket, + ext_dir, + ext_file, + ext_symlink, + ext_block_dev, + ext_char_dev, + ext_fifo, + ext_socket, +}; + +pub const Header = extern struct { + type: Type, // TODO: enum + permission: u16, + uid_idx: u16, + gid_idx: u16, + mod_time: u32, + inode_num: u32, +}; + +pub const Data = union(Type) { + dir: Dir, + file: File, + symlink: Symlink, + block_dev: Dev, + char_dev: Dev, + fifo: Fifo, + socket: Fifo, + ext_dir: ExtDir, + ext_file: ExtFile, + ext_symlink: ExtSymlink, + ext_block_dev: ExtDev, + ext_char_dev: ExtDev, + ext_fifo: ExtFifo, + ext_socket: ExtFifo, +}; + +// Inode data types + +pub const Dir = extern struct { + block: u32, + hard_links: u32, + size: u16, + offset: u16, + parent_inode_num: u32, +}; +pub const ExtDir = extern struct { + hard_links: u32, + size: u32, + block: u32, + parent_inode_num: u32, + idx_count: u16, + offset: u16, + xattr_idx: u32, +}; + +pub const File = struct {}; +pub const ExtFile = struct {}; + +pub const Symlink = struct {}; +pub const ExtSymlink = struct {}; + +pub const Dev = extern struct {}; +pub const ExtDev = extern struct {}; + +pub const Fifo = extern struct {}; +pub const ExtFifo = extern struct {};