X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/0765e7c133eb393d8cd0292af444543c2edf8ccc..bdc143a7aa3f51a46eceec62b0b364599533fa21:/lunaix-os/usr/sh/sh.c diff --git a/lunaix-os/usr/sh/sh.c b/lunaix-os/usr/sh/sh.c index 2c9bb8d..c2c8347 100644 --- a/lunaix-os/usr/sh/sh.c +++ b/lunaix-os/usr/sh/sh.c @@ -46,8 +46,8 @@ strltrim_safe(char* str) return strcpy(str, str + l); } -void -parse_cmdline(char* line, char** cmd, char** arg_part) +int +parse_cmdline(char* line, char** args) { strrtrim(line); line = strltrim_safe(line); @@ -60,12 +60,15 @@ parse_cmdline(char* line, char** cmd, char** arg_part) } l++; } - *cmd = line; - if (c) { - *arg_part = strltrim_safe(line + l); + + args[0] = line; + if (c && l) { + args[1] = strltrim_safe(line + l); } else { - *arg_part = NULL; + args[1] = NULL; } + + return !!l; } void @@ -108,17 +111,19 @@ sigint_handle(int signum) } void -sh_exec(const char* name, const char** argv) +sh_exec(const char** argv) { + const char* envp[] = { 0 }; + char* name = argv[0]; if (!strcmp(name, "cd")) { - chdir(argv[0] ? argv[0] : "."); + chdir(argv[1] ? argv[1] : "."); sh_printerr(); return; } pid_t p; if (!(p = fork())) { - if (execve(name, argv, NULL)) { + if (execve(name, argv, envp)) { sh_printerr(); } _exit(1); @@ -127,6 +132,27 @@ sh_exec(const char* name, const char** argv) waitpid(p, NULL, 0); } +static char* +sanity_filter(char* buf) +{ + int off = 0, i = 0; + char c; + do { + c = buf[i]; + + if ((32 <= c && c <= 126) || !c) { + buf[i - off] = c; + } + else { + off++; + } + + i++; + } while(c); + + return buf; +} + void sh_loop() { @@ -139,7 +165,7 @@ sh_loop() // stdout (by default, unless user did smth) is the tty we are currently at ioctl(stdout, TIOCSPGRP, getpgid()); - char* argv[] = {0, 0}; + char* argv[] = {0, 0, 0}; while (1) { getcwd(pwd, 512); @@ -152,21 +178,20 @@ sh_loop() } buf[sz] = '\0'; + sanity_filter(buf); // currently, this shell only support single argument - parse_cmdline(buf, &cmd, &argv[0]); - - if (cmd[0] == 0) { + if (!parse_cmdline(buf, argv)) { printf("\n"); goto cont; } // cmd=="exit" - if (*(unsigned int*)cmd == 0x74697865U) { + if (*(unsigned int*)argv[0] == 0x74697865U) { break; } - sh_exec(cmd, (const char**)&argv); + sh_exec((const char**)argv); cont: printf("\n"); }