From 246d63d48abacf13f9f6cff915c292882dd6d6ab Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Tue, 13 May 2025 10:24:17 -0500 Subject: [PATCH] A bit more messing around. --- inode.zig | 66 +++++++++++++++++++++++++++++--------------- inode_types/misc.zig | 2 ++ metadata_reader.zig | 11 ++++++++ squashfs.zig | 2 +- superblock.zig | 9 ++++++ 5 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 metadata_reader.zig diff --git a/inode.zig b/inode.zig index bb2eaba..7af5e93 100644 --- a/inode.zig +++ b/inode.zig @@ -63,29 +63,51 @@ const io = @import("std").io; pub fn readInode(rdr: io.AnyReader, block_size: u64, alloc: std.heap.Allocator) !Inode { const hdr = try rdr.readStruct(InodeHeader); - const data: InodeData = undefined; - switch (hdr.inode_type) { - .dir => data = .{ - .dir = dir.readDirInode(rdr), - }, - .ext_dir => data = .{ - .ext_dir = try dir.readExtDirInode(rdr, alloc), - }, - .file => data = .{ - .file = try file.readFileInode(rdr, block_size, alloc), - }, - .ext_file => data = .{ - .ext_file = try file.readExtFileInode(rdr, block_size, alloc), - }, - .symlink => data = .{ - .block_device = try misc.readSymlinkInode(rdr, alloc), - }, - .ext_symlink => data = .{ - .ext_symlink = try sym.readExtSymlinkInode(rdr, alloc), - }, - } return Inode{ .header = hdr, - .data = data, + .data = switch (hdr.inode_type) { + .dir => .{ + .dir = dir.readDirInode(rdr), + }, + .ext_dir => .{ + .ext_dir = try dir.readExtDirInode(rdr, alloc), + }, + .file => .{ + .file = try file.readFileInode(rdr, block_size, alloc), + }, + .ext_file => .{ + .ext_file = try file.readExtFileInode(rdr, block_size, alloc), + }, + .symlink => .{ + .block_device = try misc.readSymlinkInode(rdr, alloc), + }, + .ext_symlink => .{ + .ext_symlink = try sym.readExtSymlinkInode(rdr, alloc), + }, + .block_device => .{ + .block_device = try rdr.readStruct(misc.DeviceInode), + }, + .ext_block_device => .{ + .ext_block_device = try rdr.readStruct(misc.ExtDeviceInode), + }, + .char_device => .{ + .char_device = try rdr.readStruct(misc.DeviceInode), + }, + .ext_char_device => .{ + .ext_char_device = try rdr.readStruct(misc.ExtDeviceInode), + }, + .fifo => .{ + .fifo = try rdr.readStruct(misc.IPCInode), + }, + .ext_fifo => .{ + .ext_fifo = try rdr.readStruct(misc.ExtIPCInode), + }, + .socket => .{ + .socket = try rdr.readStruct(misc.IPCInode), + }, + .ext_socket => .{ + .ext_socket = try rdr.readStruct(misc.ExtIPCInode), + }, + }, }; } diff --git a/inode_types/misc.zig b/inode_types/misc.zig index 540a7b0..71cfef1 100644 --- a/inode_types/misc.zig +++ b/inode_types/misc.zig @@ -1,3 +1,5 @@ +const io = @import("std").io; + pub const DeviceInode = packed struct { hard_links: u32, device: u32, diff --git a/metadata_reader.zig b/metadata_reader.zig new file mode 100644 index 0000000..1bab78a --- /dev/null +++ b/metadata_reader.zig @@ -0,0 +1,11 @@ +const std = @import("std"); + +const MetadataHeader = packed struct { + compressed: bool, + size: u15, +}; + +const MetadataReader = struct { + rdr: std.io.AnyReader, + curBlock: []const u8, +}; diff --git a/squashfs.zig b/squashfs.zig index 15c74ce..1da4d9e 100644 --- a/squashfs.zig +++ b/squashfs.zig @@ -19,7 +19,7 @@ pub const Reader = struct { pub fn newReader(filename: []const u8) !Reader { const file = try std.fs.cwd().openFile(filename, .{}); errdefer file.close(); - const alloc = std.heap.GeneralPurposeAllocator(.{}); + const alloc = std.heap.GeneralPurposeAllocator(.{}).init(); errdefer alloc.deinit(); const super = try file.reader().readStruct(Superblock); try super.valid(); diff --git a/superblock.zig b/superblock.zig index c303751..2834083 100644 --- a/superblock.zig +++ b/superblock.zig @@ -7,6 +7,15 @@ pub const SuperblockError = error{ InvalidVersion, }; +pub const CompressionType = enum(u16) { + gzip = 1, + lzma, + lzo, + xz, + lz4, + zstd, +}; + pub const Superblock = packed struct { magic: u32, count: u32,