50 lines
1.9 KiB
Zig
50 lines
1.9 KiB
Zig
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} <header_file> <kcapsule_file> <output_file>\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();
|
|
} |