Starting work on inode decoding
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user