Re-adding stuff

This commit is contained in:
Caleb J. Gardner
2026-08-08 21:56:22 -05:00
parent 0039b19b4b
commit 78dbaaed7e
2 changed files with 138 additions and 5 deletions
+48 -4
View File
@@ -5,12 +5,56 @@ const Archive = @This();
map: Io.File.MemoryMap, map: Io.File.MemoryMap,
super: Superblock,
pub fn open(io: Io, file: Io.File, offset: u64) !Archive { pub fn open(io: Io, file: Io.File, offset: u64) !Archive {
return .{ var map = try file.createMemoryMap(io, .{
.map = try file.createMemoryMap(io, .{ .len = try file.length(io) - offset,
.len = super.size,
.offset = offset, .offset = offset,
.protection = .{ .read = true }, .protection = .{ .read = true },
}), });
var super: Superblock = std.mem.bytesToValue(Superblock, map.memory[0..@sizeOf(Superblock)]);
try super.check();
return .{
.map = map,
.super = super,
}; };
} }
// Superblock
pub const Superblock = extern struct {
pub const MAGIC: u32 = 0x73717368;
magic: u32,
inode_count: u32,
mod_time: u32,
block_size: u32,
frag_count: u32,
compression: u16,
block_log: u16,
flags: u16, // TODO: break out into packed struct.
id_count: u16,
version_major: u16,
version_minor: u16,
root_inode_ref: u64, // TODO: Change to inode reference packed struct.
size: u64,
id_table_start: u64,
xattr_table_start: u64,
inode_table_start: u64,
dir_table_start: u64,
frag_table_start: u64,
export_table_start: u64,
fn check(self: Superblock) !void {
if (self.magic != MAGIC)
return error.InvalidMagic;
if (self.version_major != 4 or self.version_minor != 0)
return error.IncompatibleVersion;
if (std.math.log2(self.block_size) != self.block_log)
return error.BadBlockLog;
}
};
+89
View File
@@ -0,0 +1,89 @@
const std = @import("std");
const Io = std.Io;
const Inode = @This();
header: Header,
data: Data,
// Types
pub const Reference = packed struct(u64) {
_: u16,
block: u32,
offset: u16,
};
pub const Type = enum(u16) {
dir,
file,
symlink,
block_dev,
char_dev,
fifo,
socket,
ext_dir,
ext_file,
ext_symlink,
ext_block_dev,
ext_char_dev,
ext_fifo,
ext_socket,
};
pub const Header = extern struct {
type: Type, // TODO: enum
permission: u16,
uid_idx: u16,
gid_idx: u16,
mod_time: u32,
inode_num: u32,
};
pub const Data = union(Type) {
dir: Dir,
file: File,
symlink: Symlink,
block_dev: Dev,
char_dev: Dev,
fifo: Fifo,
socket: Fifo,
ext_dir: ExtDir,
ext_file: ExtFile,
ext_symlink: ExtSymlink,
ext_block_dev: ExtDev,
ext_char_dev: ExtDev,
ext_fifo: ExtFifo,
ext_socket: ExtFifo,
};
// Inode data types
pub const Dir = extern struct {
block: u32,
hard_links: u32,
size: u16,
offset: u16,
parent_inode_num: u32,
};
pub const ExtDir = extern struct {
hard_links: u32,
size: u32,
block: u32,
parent_inode_num: u32,
idx_count: u16,
offset: u16,
xattr_idx: u32,
};
pub const File = struct {};
pub const ExtFile = struct {};
pub const Symlink = struct {};
pub const ExtSymlink = struct {};
pub const Dev = extern struct {};
pub const ExtDev = extern struct {};
pub const Fifo = extern struct {};
pub const ExtFifo = extern struct {};