Updated a lot of packed structs to extern struct

Specified int types for remaining packed structs
Instead of manually decoding File & ExtFile structs, decode an extern struct first
Fixed some zstd issues
Some more File stuff
This commit is contained in:
Caleb Gardner
2026-05-02 06:10:24 -05:00
parent ab606bdfa5
commit a3f7b86e67
11 changed files with 190 additions and 63 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
const Reader = @import("std").Io.Reader;
pub const Dir = packed struct {
pub const Dir = extern struct {
block_start: u32,
hard_links: u32,
size: u16,
@@ -14,7 +14,7 @@ pub const Dir = packed struct {
}
};
pub const ExtDir = packed struct {
pub const ExtDir = extern struct {
hard_links: u32,
size: u32,
block_start: u32,
@@ -26,7 +26,7 @@ pub const ExtDir = packed struct {
pub fn read(rdr: *Reader) !ExtDir {
var d: ExtDir = undefined;
try rdr.readSliceEndian(Dir, @ptrCast(&d), .little);
try rdr.readSliceEndian(ExtDir, @ptrCast(&d), .little);
return d;
}
};
+56 -35
View File
@@ -1,34 +1,43 @@
const std = @import("std");
const Reader = std.Io.Reader;
pub const BlockSize = packed struct {
pub const BlockSize = packed struct(u32) {
size: u24,
uncompressed: bool,
_: u7,
};
const FileRawRead = extern struct {
block_start: u32,
frag_idx: u32,
frag_block_offset: u32,
size: u32,
};
pub const File = struct {
block_start: u32, // bytes 0-3
frag_idx: u32, // bytes 4-7
frag_block_offset: u32, // bytes 8-11
size: u32, // bytes 12-15
block_start: u32,
frag_idx: u32,
frag_block_offset: u32,
size: u32,
block_sizes: []BlockSize,
pub fn read(alloc: std.mem.Allocator, rdr: *Reader, block_size: u32) !File {
var start: [16]u8 = undefined;
try rdr.readSliceAll(&start);
const frag_idx: u32 = std.mem.readInt(u32, start[4..8], .little);
const size: u32 = std.mem.readInt(u32, start[12..16], .little);
var num_blocks: u32 = size / block_size;
if (size % block_size != 0 and frag_idx == 0xFFFFFFFF) num_blocks += 1;
var raw: FileRawRead = undefined;
try rdr.readSliceEndian(FileRawRead, @ptrCast(&raw), .little);
var num_blocks: u32 = raw.size / block_size;
if (raw.size % block_size != 0 and raw.frag_idx == 0xFFFFFFFF)
num_blocks += 1;
const sizes = try alloc.alloc(BlockSize, num_blocks);
errdefer alloc.free(sizes);
try rdr.readSliceEndian(BlockSize, sizes, .little);
return .{
.block_start = std.mem.readInt(u32, start[0..4], .little),
.frag_idx = frag_idx,
.frag_block_offset = std.mem.readInt(u32, start[8..12], .little),
.size = size,
.block_start = raw.block_start,
.frag_idx = raw.frag_idx,
.frag_block_offset = raw.frag_block_offset,
.size = raw.size,
.block_sizes = sizes,
};
}
@@ -38,34 +47,46 @@ pub const File = struct {
}
};
const ExtFileRawRead = extern struct {
block_start: u64,
size: u64,
sparse: u64,
hard_links: u32,
frag_idx: u32,
frag_block_offset: u32,
xattr_idx: u32,
};
pub const ExtFile = struct {
block_start: u64, // bytes 0-7
size: u64, // bytes 8-15
sparse: u64, // bytes 16-23
hard_links: u32, // bytes 24-27
frag_idx: u32, // bytes 28-31
frag_block_offset: u32, // bytes 32-35
xattr_idx: u32, // bytes 36-39
block_start: u64,
size: u64,
sparse: u64,
hard_links: u32,
frag_idx: u32,
frag_block_offset: u32,
xattr_idx: u32,
block_sizes: []BlockSize,
pub fn read(alloc: std.mem.Allocator, rdr: *Reader, block_size: u32) !ExtFile {
var start: [40]u8 = undefined;
try rdr.readSliceAll(&start);
const frag_idx: u32 = std.mem.readInt(u32, start[28..32], .little);
const size: u64 = std.mem.readInt(u64, start[8..16], .little);
var num_blocks: u32 = @truncate(size / block_size);
if (size % block_size != 0 and frag_idx == 0xFFFFFFFF) num_blocks += 1;
var raw: ExtFileRawRead = undefined;
try rdr.readSliceEndian(ExtFileRawRead, @ptrCast(&raw), .little);
var num_blocks: u32 = @truncate(raw.size / block_size);
if (raw.size % block_size != 0 and raw.frag_idx == 0xFFFFFFFF)
num_blocks += 1;
const sizes = try alloc.alloc(BlockSize, num_blocks);
errdefer alloc.free(sizes);
try rdr.readSliceEndian(BlockSize, sizes, .little);
return .{
.block_start = std.mem.readInt(u64, start[0..8], .little),
.size = size,
.sparse = std.mem.readInt(u64, start[16..24], .little),
.hard_links = std.mem.readInt(u32, start[24..28], .little),
.frag_idx = frag_idx,
.frag_block_offset = std.mem.readInt(u32, start[32..36], .little),
.xattr_idx = std.mem.readInt(u32, start[36..40], .little),
.block_start = raw.block_start,
.size = raw.size,
.sparse = raw.sparse,
.hard_links = raw.hard_links,
.frag_idx = raw.frag_idx,
.frag_block_offset = raw.frag_block_offset,
.xattr_idx = raw.xattr_idx,
.block_sizes = sizes,
};
}
+4 -4
View File
@@ -50,7 +50,7 @@ pub const ExtSymlink = struct {
};
/// A block or character device.
pub const Dev = packed struct {
pub const Dev = extern struct {
hard_links: u32,
dev: u32,
@@ -62,7 +62,7 @@ pub const Dev = packed struct {
};
/// An extended block or character device.
pub const ExtDev = packed struct {
pub const ExtDev = extern struct {
hard_links: u32,
dev: u32,
xattr_idx: u32,
@@ -75,7 +75,7 @@ pub const ExtDev = packed struct {
};
/// A socket or FIFO file.
pub const IPC = packed struct {
pub const IPC = extern struct {
hard_links: u32,
pub fn read(rdr: *Reader) !IPC {
@@ -86,7 +86,7 @@ pub const IPC = packed struct {
};
/// An extended socket or FIFO file.
pub const ExtIPC = packed struct {
pub const ExtIPC = extern struct {
hard_links: u32,
xattr_idx: u32,