Making things work properly

This commit is contained in:
Caleb Gardner
2025-05-17 09:05:24 -05:00
parent bbf3539dcf
commit f77c2ecf48
3 changed files with 37 additions and 34 deletions
+25 -3
View File
@@ -1,8 +1,11 @@
const std = @import("std");
const inode = @import("inode/inode.zig");
const FileHolder = @import("readers/file_holder.zig").FileHolder;
const Superblock = @import("superblock.zig").Superblock;
const File = @import("file.zig").File;
const MetadataReader = @import("readers/metadata.zig").MetadataReader;
pub const Reader = struct {
arena: std.heap.ArenaAllocator,
@@ -12,7 +15,7 @@ pub const Reader = struct {
pub fn init(alloc: std.mem.Allocator, filepath: []const u8, offset: u64) !Reader {
var holder: FileHolder = try .init(filepath, offset);
const super: Superblock = try holder.anyAt(0).readStruct(Superblock);
const super: Superblock = try holder.reader().readStruct(Superblock);
try super.validate();
const arena: std.heap.ArenaAllocator = .init(alloc);
var out: Reader = .{
@@ -21,13 +24,32 @@ pub const Reader = struct {
.super = super,
.root = undefined,
};
out.root = try .fromRef(&out, super.root_ref, "");
out.root = try out.fileFromRef(super.root_ref, "");
return out;
}
pub fn deinit(self: *const Reader) void {
pub fn deinit(self: *Reader) void {
self.arena.deinit();
self.holder.deinit();
}
fn fileFromRef(self: *Reader, ref: inode.InodeRef, name: []const u8) !File {
var offset_rdr = self.holder.readerAt(ref.block_start + self.super.inode_table_start);
var meta_rdr: MetadataReader = try .init(
self.arena.allocator(),
offset_rdr.any(),
self.super.decomp,
);
defer meta_rdr.deinit();
try meta_rdr.skip(ref.offset);
return .{
.name = name,
.inode = try .init(
self.arena.allocator(),
meta_rdr.any(),
self.super.block_size,
),
};
}
};
test "reader" {