Starting work on inode decoding

This commit is contained in:
Caleb Gardner
2025-05-12 13:46:46 -05:00
parent 58e89c0981
commit b3a5ff8f94
7 changed files with 236 additions and 81 deletions
+65
View File
@@ -0,0 +1,65 @@
const std = @import("std");
const io = std.io;
pub const DirInode = packed struct {
dir_block_start: u32,
hard_links: u32,
dir_table_size: u16,
dir_block_offset: u16,
parent_inode_num: u32,
};
pub fn readDirInode(rdr: io.AnyReader) !DirInode {
return try rdr.readStruct(DirInode);
}
pub const DirIndex = struct {
dir_header_offset: u32,
dir_table_offset: u32,
name_size: u32,
name: []const u8,
};
fn readDirIndex(rdr: io.AnyReader) !DirIndex {
const out = DirIndex{
.dir_header_offset = try rdr.readInt(u32, std.builtin.Endian.little),
.dir_table_offset = try rdr.readInt(u32, std.builtin.Endian.little),
.name_size = try rdr.readInt(u32, std.builtin.Endian.little),
.name = undefined,
};
const buf = try std.heap.page_allocator.alloc(u8, out.name_size);
defer std.heap.page_allocator.free(buf);
try rdr.read(buf);
out.name = buf[0..];
return out;
}
pub const ExtDirInode = struct {
hard_links: u32,
dir_table_size: u32,
dir_block_start: u32,
parent_inode_num: u32,
dir_index_count: u16,
dir_block_offset: u16,
xattr_index: u32,
indexes: []const DirIndex,
};
pub fn readExtDirInode(rdr: io.AnyReader) !ExtDirInode {
const out = ExtDirInode{
.hard_links = rdr.readInt(u32, std.builtin.Endian.little),
.dir_table_size = rdr.readInt(u32, std.builtin.Endian.little),
.dir_block_start = rdr.readInt(u32, std.builtin.Endian.little),
.parent_inode_num = rdr.readInt(u32, std.builtin.Endian.little),
.dir_index_count = rdr.readInt(u16, std.builtin.Endian.little),
.dir_block_offset = rdr.readInt(u16, std.builtin.Endian.little),
.xattr_index = rdr.readInt(u32, std.builtin.Endian.little),
.indexes = undefined,
};
out.indexes = []const DirIndex{undefined} ** out.dir_index_count;
const i: u16 = 0;
while (i < out.dir_index_count) : (i += 1) {
out.indexes[i] = try readDirIndex(rdr);
}
return out;
}
+54
View File
@@ -0,0 +1,54 @@
const std = @import("std");
pub const FileInode = struct {
start: u32,
frag_index: u32,
frag_block_offset: u32,
size: u32,
block_sizes: []const u32,
};
pub fn readFileInode(rdr: std.io.AnyReader, block_size: u32) !FileInode {
const out = FileInode{
.start = try rdr.readInt(u32, std.builtin.Endian.little),
.frag_index = try rdr.readInt(u32, std.builtin.Endian.little),
.frag_block_offset = try rdr.readInt(u32, std.builtin.Endian.little),
.size = try rdr.readInt(u32, std.builtin.Endian.little),
.block_sizes = undefined,
};
var block_num = out.size / block_size;
if (out.frag_index != 0xFFFFFFFF and out.size % block_size != 0) {
block_num += 1;
}
return out;
}
pub const ExtFileInode = struct {
start: u64,
size: u64,
sparse: u64,
hard_links: u32,
frag_index: u32,
frag_block_offset: u32,
xattr_index: u32,
block_sizes: []const u32,
};
pub fn readExtFileInode(rdr: std.io.AnyReader, block_size: u32) !ExtFileInode {
const out = ExtFileInode{
.start = try rdr.readInt(u64, std.builtin.Endian.little),
.size = try rdr.readInt(u64, std.builtin.Endian.little),
.sparse = try rdr.readInt(u64, std.builtin.Endian.little),
.hard_links = try rdr.readInt(u32, std.builtin.Endian.little),
.frag_index = try rdr.readInt(u32, std.builtin.Endian.little),
.frag_block_offset = try rdr.readInt(u32, std.builtin.Endian.little),
.xattr_index = try rdr.readInt(u32, std.builtin.Endian.little),
.block_sizes = undefined,
};
var block_num = out.size / block_size;
if (out.frag_index != 0xFFFFFFFF and out.size % block_size != 0) {
block_num += 1;
}
//TODO: stuff
return out;
}
+19
View File
@@ -0,0 +1,19 @@
pub const DeviceInode = packed struct {
hard_links: u32,
device: u32,
};
pub const ExtDeviceInode = packed struct {
hard_links: u32,
device: u32,
xattr_index: u32,
};
pub const IPCInode = packed struct {
hard_links: u32,
};
pub const ExtIPCInode = packed struct {
hard_links: u32,
xattr_index: u32,
};
+37
View File
@@ -0,0 +1,37 @@
const std = @import("std");
const io = std.io;
pub const SymlinkInode = struct {
hard_links: u32,
target_size: u32,
path: []const u8,
};
pub fn readSymlinkInode(rdr: io.AnyReader) !SymlinkInode {
const out = SymlinkInode{
.hard_links = try rdr.readInt(u32, std.builtin.Endian.little),
.target_size = try rdr.readInt(u32, std.builtin.Endian.little),
.path = undefined,
};
out.path = (try rdr.readBoundedBytes(out.target_size + 1)).constSlice();
return out;
}
pub const ExtSymlinkInode = struct {
hard_links: u32,
target_size: u32,
path: []const u8,
xattr_index: u32,
};
pub fn readExtSymlinkInode(rdr: io.AnyReader) !SymlinkInode {
const out = ExtSymlinkInode{
.hard_links = try rdr.readInt(u32, std.builtin.Endian.little),
.target_size = try rdr.readInt(u32, std.builtin.Endian.little),
.path = undefined,
.xattr_index = undefined,
};
out.path = (try rdr.readBoundedBytes(out.target_size + 1)).constSlice();
out.xattr_index = try rdr.readInt(u32, std.builtin.Endian.little);
return out;
}