58 lines
2.0 KiB
Zig
58 lines
2.0 KiB
Zig
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, alloc: std.mem.Allocator) !FileInode {
|
|
var 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) {
|
|
block_num += 1;
|
|
}
|
|
out.block_sizes = try alloc.alloc(u32, block_num);
|
|
_ = try rdr.readAll(std.mem.asBytes(&out.block_sizes));
|
|
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, alloc: std.mem.Allocator) !ExtFileInode {
|
|
var 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;
|
|
}
|
|
out.block_sizes = try alloc.alloc(u32, block_num);
|
|
_ = try rdr.readAll(std.mem.asBytes(&out.block_sizes));
|
|
return out;
|
|
}
|