Re-adding stuff
This commit is contained in:
+48
-4
@@ -5,12 +5,56 @@ const Archive = @This();
|
||||
|
||||
map: Io.File.MemoryMap,
|
||||
|
||||
super: Superblock,
|
||||
|
||||
pub fn open(io: Io, file: Io.File, offset: u64) !Archive {
|
||||
return .{
|
||||
.map = try file.createMemoryMap(io, .{
|
||||
.len = super.size,
|
||||
var map = try file.createMemoryMap(io, .{
|
||||
.len = try file.length(io) - offset,
|
||||
.offset = offset,
|
||||
.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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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 {};
|
||||
Reference in New Issue
Block a user