37 lines
1.1 KiB
Zig
37 lines
1.1 KiB
Zig
const std = @import("std");
|
|
const fs = std.fs;
|
|
|
|
const Superblock = @import("superblock.zig").Superblock;
|
|
const inode = @import("inode.zig");
|
|
const MetadataReader = @import("metadata_reader.zig").MetadataReader;
|
|
|
|
pub const Reader = struct {
|
|
super: Superblock,
|
|
rdr: fs.File,
|
|
root: inode.Inode,
|
|
alloc: std.heap.GeneralPurposeAllocator(.{}),
|
|
|
|
pub fn close(self: *Reader) void {
|
|
self.rdr.close();
|
|
_ = self.alloc.deinit();
|
|
}
|
|
};
|
|
|
|
pub fn newReader(filename: []const u8) !Reader {
|
|
const file = try std.fs.cwd().openFile(filename, .{});
|
|
errdefer file.close();
|
|
var alloc: std.heap.GeneralPurposeAllocator(.{}) = .init;
|
|
errdefer _ = alloc.deinit();
|
|
const super = try file.reader().readStruct(Superblock);
|
|
try super.valid();
|
|
try file.seekTo(super.inode_table + super.root_inode.block_start);
|
|
var root_reader: MetadataReader = try .init(super.comp, file.reader().any(), alloc.allocator());
|
|
const root_inode = try inode.readInode(root_reader.any(), super.block_size, alloc.allocator());
|
|
return Reader{
|
|
.super = super,
|
|
.rdr = file,
|
|
.root = root_inode,
|
|
.alloc = alloc,
|
|
};
|
|
}
|