A bit more messing around.

This commit is contained in:
Caleb Gardner
2025-05-13 10:24:17 -05:00
parent b4848de95d
commit 246d63d48a
5 changed files with 67 additions and 23 deletions
+44 -22
View File
@@ -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),
},
},
};
}
+2
View File
@@ -1,3 +1,5 @@
const io = @import("std").io;
pub const DeviceInode = packed struct {
hard_links: u32,
device: u32,
+11
View File
@@ -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,
};
+1 -1
View File
@@ -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();
+9
View File
@@ -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,