From 43604bf71a21c31aad68114f8612a9c4180f22ad Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 13 May 2019 04:52:55 +0200 Subject: LibC+Shell: Make system() actually work. system() will now fork off a child process and execute the command via /bin/sh -c. There are probably some things to fix here, but it's a start. --- LibC/stdlib.cpp | 11 ++++++++++- Shell/main.cpp | 7 ++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/LibC/stdlib.cpp b/LibC/stdlib.cpp index 17486f7c25..d85483ce94 100644 --- a/LibC/stdlib.cpp +++ b/LibC/stdlib.cpp @@ -206,7 +206,16 @@ void srandom(unsigned seed) int system(const char* command) { - return execl("/bin/sh", "sh", "-c", command, nullptr); + auto child = fork(); + if (!child) { + int rc = execl("/bin/sh", "sh", "-c", command, nullptr); + if (rc < 0) + perror("execl"); + exit(0); + } + int wstatus; + waitpid(child, &wstatus, 0); + return WEXITSTATUS(wstatus); } char* mktemp(char* pattern) diff --git a/Shell/main.cpp b/Shell/main.cpp index 98009d8c58..a048a3c203 100644 --- a/Shell/main.cpp +++ b/Shell/main.cpp @@ -413,9 +413,10 @@ int main(int argc, char** argv) endpwent(); } - if (argc > 1 && !strcmp(argv[1], "-c")) { - fprintf(stderr, "FIXME: Implement /bin/sh -c\n"); - return 1; + if (argc > 2 && !strcmp(argv[1], "-c")) { + dbgprintf("sh -c '%s'\n", argv[2]); + run_command(argv[2]); + return 0; } { -- cgit v1.2.3