dotfiles/scripts/withjava/src/main.zig

59 lines
1.7 KiB
Zig

const std = @import("std");
pub const std_options = std.Options{
.log_level = .debug,
.logFn = @import("common").logFn,
};
pub fn main() !u8 {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const alloc = gpa.allocator();
if (std.os.argv.len < 3) {
std.log.err("Not enough arguments, expected at least 2, got {}!", .{std.os.argv.len - 1});
return 1;
}
var env = try std.process.getEnvMap(alloc);
defer env.deinit();
if (env.getPtr("PATH")) |path_p| {
const newpath = try std.fmt.allocPrint(
alloc,
"/usr/lib/jvm/{s}/bin:{s}",
.{ std.os.argv[1], path_p.* },
);
alloc.free(path_p.*);
path_p.* = newpath;
} else {
const newpath = try std.fmt.allocPrint(alloc, "/usr/lib/jvm/{s}/bin", .{std.os.argv[1]});
errdefer alloc.free(newpath);
try env.putMove(try alloc.dupe(u8, "PATH"), newpath);
}
{
const java_home = try std.fmt.allocPrint(alloc, "/usr/lib/jvm/{s}", .{std.os.argv[1]});
errdefer alloc.free(java_home);
try env.putMove(try alloc.dupe(u8, "JAVA_HOME"), java_home);
}
const child_argv = try alloc.alloc([]const u8, std.os.argv[2..].len);
defer alloc.free(child_argv);
for (std.os.argv[2..], child_argv) |a1, *a2|
a2.* = std.mem.span(a1);
var child = std.ChildProcess.init(child_argv, alloc);
child.env_map = &env;
const term = try child.spawnAndWait();
switch (term) {
.Exited => |ret| return ret,
.Signal, .Stopped, .Unknown => |ret| {
std.log.err("child signalled {}", .{ret});
return 1;
},
}
}