const std = @import("std"); const Dir = std.Io.Dir; const ALIGN_SIZE: usize = 4096; pub fn main(init: std.process.Init) !void { const args = try init.minimal.args.toSlice(init.arena.allocator()); if (args.len != 4) { std.debug.print("Usage: {s} \n", .{args[0]}); std.process.exit(1); } const header_path = args[1]; const kcapsule_path = args[2]; const output_path = args[3]; var image = try Dir.cwd().createFile(init.io, output_path, .{ .truncate = true }); defer image.close(init.io); var image_buffer: [4096]u8 = undefined; var w = image.writer(init.io, &image_buffer); var read_buffer: [4096]u8 = undefined; const header_file = try Dir.cwd().openFile(init.io, header_path, .{}); var r = header_file.reader(init.io, &[0]u8{}); var written: usize = 0; while (true) { const read_bytes = try r.interface.readSliceShort(&read_buffer); if (read_bytes == 0) break; try w.interface.writeAll(read_buffer[0..read_bytes]); written += read_bytes; } header_file.close(init.io); if (written % ALIGN_SIZE != 0) { var padding_size = ALIGN_SIZE - (written % ALIGN_SIZE); @memset(read_buffer[0..@min(padding_size, read_buffer.len)], 0); while (padding_size > 0) { const to_write = @min(padding_size, read_buffer.len); try w.interface.writeAll(read_buffer[0..to_write]); padding_size -= to_write; } } const kcapsule_file = try Dir.cwd().openFile(init.io, kcapsule_path, .{}); r = kcapsule_file.reader(init.io, &[0]u8{}); while (true) { const read_bytes = try r.interface.readSliceShort(&read_buffer); if (read_bytes == 0) break; try w.interface.writeAll(read_buffer[0..read_bytes]); written += read_bytes; } kcapsule_file.close(init.io); try w.interface.flush(); }