From 95c5a9cccc87b791861ed98d78463b82033cf4bb Mon Sep 17 00:00:00 2001 From: Robby Zambito Date: Tue, 25 Mar 2025 21:49:30 -0400 Subject: [PATCH] Trying to get prompt --- src/get_prompt.bash | 7 +++++++ src/main.zig | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/get_prompt.bash diff --git a/src/get_prompt.bash b/src/get_prompt.bash new file mode 100644 index 0000000..64f2147 --- /dev/null +++ b/src/get_prompt.bash @@ -0,0 +1,7 @@ +ver=$(bash --version | head -n 1 | awk '{print $4}' | grep -o "\.\..") +check_ver=$(echo -e "${ver}\n4.3" | sort -V | head -n 1) +if [[ "${ver}" == "${check_ver}" ]]; then + echo "[${USER}@${HOSTNAME} ${PWD##*/}]$ " +else + echo "${PS1@P}" +fi diff --git a/src/main.zig b/src/main.zig index 0d30c54..19e8060 100644 --- a/src/main.zig +++ b/src/main.zig @@ -5,6 +5,49 @@ fn clear() !void { const stdout = std.io.getStdOut().writer(); try stdout.print("\u{001b}[H\u{001b}[J", .{}); } +const Pipe = packed struct { + const fd_t = std.posix.fd_t; + read: fd_t, + write: fd_t, +}; + +fn pipe() !Pipe { + return @bitCast(try std.posix.pipe()); +} + +fn getPrompt() ![]const u8 { + const p = try pipe(); + + const close = std.posix.close; + const dup2 = std.posix.dup2; + const STDIN_FILENO = std.posix.STDIN_FILENO; + const STDOUT_FILENO = std.posix.STDOUT_FILENO; + const STDERR_FILENO = std.posix.STDERR_FILENO; + const script = @embedFile("./get_prompt.bash"); + + if (std.posix.fork()) |pid| { + if (pid == 0) { + close(p.read); + + try dup2(p.write, STDOUT_FILENO); + close(STDIN_FILENO); + close(STDERR_FILENO); // Do not print errors to the screen + + // Command-line arguments (must include program name as first argument) + // const args = [_:null]?[*:0]const u8{ "bash", "-i", "-c", script, null }; + var args = [_:null]?[*:0]const u8{ "bash", "-i", "-c", script, null }; + try std.posix.execvpeZ("bash", &args, std.c.environ); + + // std.posix.execvpeZ("bash", @as([*:null]const ?[*:0]const u8, &args[0]), std.os.environ); + _ = std.posix.execvpeZ("bash", @as([*:null]const ?[*:0]const u8, &args[0]), std.os.environ); + // kill the child + std.process.exit(0); + } else {} + return ""; + } else |err| { + return err; + } +} pub fn main() !void { try clear(); @@ -13,6 +56,8 @@ pub fn main() !void { var ln = Linenoise.init(allocator); defer ln.deinit(); + _ = try getPrompt(); + while (try ln.linenoise("hello> ")) |input| { defer allocator.free(input); std.debug.print("input: {s}\n", .{input});