diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/resources.zig | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/src/lib/resources.zig b/src/lib/resources.zig deleted file mode 100644 index 08ad7a6..0000000 --- a/src/lib/resources.zig +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org> -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -const std = @import("std"); - -const Console = @import("Console.zig"); -const instructions = @import("instructions.zig"); -const mem = @import("mem.zig"); -const paging = @import("paging.zig"); -const syscall = @import("syscall.zig"); -const sysexchange = @import("sysexchange.zig"); -const userinit = @import("userinit.zig"); -const vfs = @import("vfs.zig"); - -const Result = sysexchange.Result; -const io = std.io; -const tar = std.tar; - -const File = tar.Iterator(io.FixedBufferStream([]const u8).Reader).File; - -const FileContext = struct { - buffer: []const u8, - fbs: io.FixedBufferStream([]const u8), -}; - -pub const Error = error{ - NoTarFileInitializer, - NoConsole, -}; - -pub fn provideBuiltin(allocator: std.mem.Allocator) !void { - try addDir("/userinit"); - - try provideUserinit(allocator); -} - -fn provideUserinit(allocator: std.mem.Allocator) !void { - var userinit_stream = io.fixedBufferStream(userinit.tarball); - const reader = userinit_stream.reader(); - - var file_name_buffer: [4086]u8 = undefined; - var link_name_buffer: [4086]u8 = undefined; - - var it = tar.iterator(reader, .{ - .file_name_buffer = file_name_buffer[0..], - .link_name_buffer = link_name_buffer[0..], - }); - - while (try it.next()) |file| { - const resolved = try std.fs.path.resolvePosix(allocator, &[_][]const u8{file.name}); - const path = try std.fmt.allocPrint(allocator, "/userinit/{s}", .{resolved}); - switch (file.kind) { - .file => try addFile(path, file), - .directory => try addDir(path), - .sym_link => {}, - } - } -} - -fn addFile(path: []const u8, file: File) !void { - const allocator = vfs.treeRoot().allocator; - - const buffer = try allocator.alloc(u8, file.size); - try file.reader().readNoEof(buffer); - - const initializer = try allocator.create(FileContext); - initializer.* = .{ - .buffer = buffer, - .fbs = io.fixedBufferStream(@as([]const u8, buffer)), - }; - - try vfs.provideResource(path, .{ - .tag = .file, - .data = .{ - .file = .{ - .readFn = read, - .writeFn = null, - .closeFn = close, - .initializer = initializer, - }, - }, - }, 0, .{ - .reclaimable = false, - }); -} - -fn addDir(path: []const u8) !void { - const allocator = vfs.treeRoot().allocator; - const tree = try allocator.create(vfs.Tree); - tree.* = vfs.Tree.init(allocator); - - try vfs.provideResource(path, .{ - .tag = .dir, - .data = .{ .dir = tree }, - }, 0, .{ - .reclaimable = false, - }); -} - -fn open(context: *vfs.FileContext, initializer: ?*anyopaque) !void { - const allocator = vfs.treeRoot().allocator; - - const init_to = initializer orelse return Error.NoTarFileInitializer; - const init_context: *FileContext = @alignCast(@ptrCast(init_to)); - - const new_context = try allocator.create(FileContext); - new_context.* = init_context.*; - - context.inner = new_context; -} - -fn read(context: *vfs.FileContext, ptr: [*]u8, len: usize) callconv(.C) Result(usize) { - if (context.inner == null) { - open(context, context.initializer) catch |err| { - return Result(usize).fromAnyTypeOrError(err); - }; - } - - const inner: *FileContext = @alignCast(@ptrCast(context.inner.?)); - - const buffer = ptr[0..len]; - return Result(usize).fromAnyTypeOrError(inner.fbs.read(buffer)); -} - -fn close(context: *vfs.FileContext) callconv(.C) void { - if (context.inner) |inner_opaque| { - const allocator = vfs.treeRoot().allocator; - - const inner: *FileContext = @alignCast(@ptrCast(inner_opaque)); - allocator.destroy(inner); - } -} |