summaryrefslogtreecommitdiff
path: root/src/exec.c
diff options
context:
space:
mode:
authorÁkos Kőrösi <korakos99@gmail.com>2026-05-22 01:36:49 +0200
committerÁkos Kőrösi <korakos99@gmail.com>2026-05-22 01:36:49 +0200
commitf67ef17c65aa5acc27c8bb148c2a0c76987c1f00 (patch)
tree35d4c86b8c383b660e306596b3c931d5a68f156e /src/exec.c
parent6b1cb479a7b8939e8d38479191b4ce7447033b5f (diff)
add more builtins
Diffstat (limited to 'src/exec.c')
-rw-r--r--src/exec.c25
1 files changed, 22 insertions, 3 deletions
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) {