A bit more messing around.
This commit is contained in:
@@ -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),
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
const io = @import("std").io;
|
||||
|
||||
pub const DeviceInode = packed struct {
|
||||
hard_links: u32,
|
||||
device: u32,
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user