diff --git a/libc/Makefile b/libc/Makefile index 0a5e6358..cfc355ff 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -225,6 +225,7 @@ signal.o \ sleep.o \ stat.o \ stdio.o \ +system.o \ tfork.o \ time.o \ truncateat.o \ diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 5c528966..01dc6eb5 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -74,6 +74,7 @@ long strtol(const char* restrict, char** restrict, int); unsigned long strtoul(const char* restrict, char** restrict, int); unsigned long long strtoull(const char* restrict, char** restrict, int); long long strtoll(const char* restrict, char** restrict, int); +int system(const char*); int unsetenv(const char*); int wctomb(char*, wchar_t); @@ -130,7 +131,6 @@ void srandom(unsigned); double strtod(const char* restrict, char** restrict); float strtof(const char* restrict, char** restrict); long double strtold(const char* restrict, char** restrict); -int system(const char*); int unlockpt(int); size_t wcstombs(char* restrict, const wchar_t *restrict, size_t); diff --git a/libc/system.cpp b/libc/system.cpp new file mode 100644 index 00000000..df52aa07 --- /dev/null +++ b/libc/system.cpp @@ -0,0 +1,49 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + system.cpp + Execute a shell command. + +*******************************************************************************/ + +#include + +#include +#include + +extern "C" int system(const char* command) +{ + const int ret_error = command ? -1 : 0; + const int exit_error = command ? 127 : 0; + if ( !command ) + command = "exit 1"; + // TODO: Block SIGHCHLD, SIGINT, anda SIGQUIT while waiting. + pid_t childpid = fork(); + if ( childpid < 0 ) + return ret_error; + if ( childpid ) + { + int status; + if ( waitpid(childpid, &status, 0) < 0 ) + return ret_error; + return status; + } + execlp("sh", "sh", "-c", command, NULL); + _exit(exit_error); +}