From f67ef17c65aa5acc27c8bb148c2a0c76987c1f00 Mon Sep 17 00:00:00 2001 From: Ákos Kőrösi Date: Fri, 22 May 2026 01:36:49 +0200 Subject: add more builtins --- src/exec.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'src/exec.c') diff --git a/src/exec.c b/src/exec.c index a65b442..e3ea28f 100644 --- a/src/exec.c +++ b/src/exec.c @@ -26,9 +26,15 @@ MaybeStrPair parse_assignment(char* token) { bool handle_builtin(ExecutableCommand cmd, ShellState* shstate) { - + MaybeStrPair m_assignment; assert(cmd.args[0] != NULL); // TODO: handle id=value assignments + + m_assignment = parse_assignment(cmd.args[0]); + if (m_assignment.some) { + set_map_pair(&shstate->shell_vars, m_assignment.value); + return true; + } if (strcmp(cmd.args[0], "exit") == 0) { exit(0); @@ -38,16 +44,29 @@ bool handle_builtin(ExecutableCommand cmd, ShellState* shstate) { return true; } else if (strcmp(cmd.args[0], "alias") == 0) { // TODO: if no arg1 -> print alias list - MaybeStrPair m_assignment = parse_assignment(cmd.args[1]); + m_assignment = parse_assignment(cmd.args[1]); assert(m_assignment.some); set_map_pair(&shstate->aliases, m_assignment.value); return true; + } else if (strcmp(cmd.args[0], "export") == 0) { + m_assignment = parse_assignment(cmd.args[1]); + assert(m_assignment.some); + setenv(m_assignment.value.key, m_assignment.value.val, 1); + return true; + } else if (strcmp(cmd.args[0], "unalias") == 0) { + assert(cmd.args[1] != NULL); + unset_map_key(&shstate->aliases, cmd.args[1]); + return true; + } else if (strcmp(cmd.args[0], "unset") == 0) { + assert(cmd.args[1] != NULL); + unset_map_key(&shstate->shell_vars, cmd.args[1]); + return true; } return false; } void execute_cmd(ExecutableCommand cmd, int* pgid) { - + pid_t pid = fork(); if (pid == 0) { -- cgit v1.2.3