summaryrefslogtreecommitdiff
path: root/src/executor.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/executor.zig')
-rw-r--r--src/executor.zig17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/executor.zig b/src/executor.zig
index f2db136..cdddb4f 100644
--- a/src/executor.zig
+++ b/src/executor.zig
@@ -28,7 +28,7 @@ pub fn runExternalProgram(allocator: std.mem.Allocator, program_path: []const u8
}
}
-pub fn runExternalProgramWithRedirect(allocator: std.mem.Allocator, program_path: []const u8, argv: []const []const u8, output_file: ?[]const u8, error_file: ?[]const u8, append_file: ?[]const u8) !void {
+pub fn runExternalProgramWithRedirect(allocator: std.mem.Allocator, program_path: []const u8, argv: []const []const u8, output_file: ?[]const u8, error_file: ?[]const u8, append_file: ?[]const u8, append_error_file: ?[]const u8) !void {
const argv_z = try allocator.allocSentinel(?[*:0]const u8, argv.len, null);
defer allocator.free(argv_z);
@@ -78,6 +78,21 @@ pub fn runExternalProgramWithRedirect(allocator: std.mem.Allocator, program_path
};
defer fd.close();
try std.posix.dup2(fd.handle, 2);
+ } else if (append_error_file) |file| {
+ const cwd = std.fs.cwd();
+ const fd = cwd.openFile(file, .{ .mode = .write_only }) catch |err| blk: {
+ if (err == error.FileNotFound) {
+ break :blk cwd.createFile(file, .{}) catch {
+ std.posix.exit(1);
+ };
+ }
+ std.posix.exit(1);
+ };
+ defer fd.close();
+ fd.seekFromEnd(0) catch {
+ std.posix.exit(1);
+ };
+ try std.posix.dup2(fd.handle, 2);
}
_ = std.posix.execveZ(program_path_z, argv_z, std.c.environ) catch {