diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index f7a62fe7..3dbe5c1f 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -115,21 +115,31 @@ dlfcn.o \ dup.o \ env.o \ errorprint.o \ +execle.o \ +execl.o \ +execlp.o \ +execve.o \ +execv.o \ +execvpe.o \ +execvp.o \ _exit.o \ -exit.o \ _Exit.o \ +exit.o \ fchmod.o \ fcloseall.o \ fcntl.o \ fddir-sortix.o \ fdio.o \ fileno.o \ +fork.o \ fpipe.o \ fstat.o \ ftruncate.o \ getc.o \ getcwd.o \ getdtablesize.o \ +getpid.o \ +getppid.o \ gettermmode.o \ init.o \ ioleast.o \ @@ -143,7 +153,6 @@ on_exit.o \ open.o \ pipe.o \ print.o \ -process.o \ putc.o \ random.o \ readdirents.o \ @@ -153,16 +162,23 @@ scanf.o \ setjmp.o \ setlocale.o \ settermmode.o \ +sfork.o \ signal.o \ sleep.o \ stat.o \ stdio.o \ +tfork.o \ time.o \ truncate.o \ umask.o \ unlink.o \ usleep.o \ +vexecle.o \ +vexecl.o \ +vexeclp.o \ vscanf.o \ +wait.o \ +waitpid.o \ winsize.o \ write.o \ diff --git a/libmaxsi/execl.cpp b/libmaxsi/execl.cpp new file mode 100644 index 00000000..040f2f22 --- /dev/null +++ b/libmaxsi/execl.cpp @@ -0,0 +1,35 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + execl.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include + +extern "C" int execl(const char* pathname, ...) +{ + va_list args; + va_start(args, pathname); + int result = vexecl(pathname, args); + va_end(args); + return result; +} diff --git a/libmaxsi/execle.cpp b/libmaxsi/execle.cpp new file mode 100644 index 00000000..b9ce43bc --- /dev/null +++ b/libmaxsi/execle.cpp @@ -0,0 +1,35 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + execlp.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include + +extern "C" int execle(const char* pathname, ...) +{ + va_list args; + va_start(args, pathname); + int result = vexecle(pathname, args); + va_end(args); + return result; +} diff --git a/libmaxsi/execlp.cpp b/libmaxsi/execlp.cpp new file mode 100644 index 00000000..b313c11f --- /dev/null +++ b/libmaxsi/execlp.cpp @@ -0,0 +1,35 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + execlp.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include + +extern "C" int execlp(const char* filename, ...) +{ + va_list args; + va_start(args, filename); + int result = vexeclp(filename, args); + va_end(args); + return result; +} diff --git a/libmaxsi/execv.cpp b/libmaxsi/execv.cpp new file mode 100644 index 00000000..e778ad6d --- /dev/null +++ b/libmaxsi/execv.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + execv.cpp + Loads a process image. + +*******************************************************************************/ + +#define _WANT_ENVIRON +#include + +extern "C" int execv(const char* pathname, char* const* argv) +{ + return execve(pathname, argv, environ); +} diff --git a/libmaxsi/execve.cpp b/libmaxsi/execve.cpp new file mode 100644 index 00000000..fcc7c00c --- /dev/null +++ b/libmaxsi/execve.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + execve.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include + +DEFN_SYSCALL3(int, sys_execve, SYSCALL_EXEC, const char*, char* const*, char* const*); + +extern "C" int execve(const char* pathname, char* const* argv, + char* const* envp) +{ + return sys_execve(pathname, argv, envp); +} diff --git a/libmaxsi/execvp.cpp b/libmaxsi/execvp.cpp new file mode 100644 index 00000000..8804bbd5 --- /dev/null +++ b/libmaxsi/execvp.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + execvp.cpp + Loads a process image. + +*******************************************************************************/ + +#define _WANT_ENVIRON +#include + +extern "C" int execvp(const char* filename, char* const* argv) +{ + return execvpe(filename, argv, environ); +} diff --git a/libmaxsi/execvpe.cpp b/libmaxsi/execvpe.cpp new file mode 100644 index 00000000..b1a81bde --- /dev/null +++ b/libmaxsi/execvpe.cpp @@ -0,0 +1,44 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + execvpe.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include +#include + +// Note that the only PATH variable in Sortix is the one used here. +extern "C" int execvpe(const char* filename, char* const* argv, + char* const* envp) +{ + if ( strchr(filename, '/') ) + return execve(filename, argv, envp); + size_t filenamelen = strlen(filename); + const char* PATH = "/bin"; + size_t pathlen = strlen(PATH); + char* pathname = (char*) malloc(filenamelen + 1 + pathlen + 1); + if ( !pathname ) { return -1; } + stpcpy(stpcpy(stpcpy(pathname, PATH), "/"), filename); + int result = execve(pathname, argv, envp); + free(pathname); + return result; +} diff --git a/libmaxsi/fork.cpp b/libmaxsi/fork.cpp new file mode 100644 index 00000000..ab2229aa --- /dev/null +++ b/libmaxsi/fork.cpp @@ -0,0 +1,30 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + fork.cpp + Create a new task inheriting some properties from the current task. + +*******************************************************************************/ + +#include + +extern "C" pid_t fork() +{ + return sfork(SFFORK); +} diff --git a/libmaxsi/getpid.cpp b/libmaxsi/getpid.cpp new file mode 100644 index 00000000..6063b48f --- /dev/null +++ b/libmaxsi/getpid.cpp @@ -0,0 +1,33 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + getpid.cpp + Get current process id. + +*******************************************************************************/ + +#include +#include + +DEFN_SYSCALL0(pid_t, sys_getpid, SYSCALL_GETPID); + +extern "C" pid_t getpid() +{ + return sys_getpid(); +} diff --git a/libmaxsi/getppid.cpp b/libmaxsi/getppid.cpp new file mode 100644 index 00000000..fadf220f --- /dev/null +++ b/libmaxsi/getppid.cpp @@ -0,0 +1,33 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + getpid.cpp + Get parent process id. + +*******************************************************************************/ + +#include +#include + +DEFN_SYSCALL0(pid_t, sys_getppid, SYSCALL_GETPPID); + +extern "C" pid_t getppid() +{ + return sys_getppid(); +} diff --git a/libmaxsi/process.cpp b/libmaxsi/process.cpp deleted file mode 100644 index c73517fe..00000000 --- a/libmaxsi/process.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/******************************************************************************* - - Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. - - This file is part of LibMaxsi. - - LibMaxsi 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. - - LibMaxsi 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 LibMaxsi. If not, see . - - process.cpp - Exposes system calls for process creation and management. - -*******************************************************************************/ - -#define _WANT_ENVIRON -#include -#include -#include -#include -#include -#include -#include - -namespace Maxsi -{ - namespace Process - { - DEFN_SYSCALL3(int, SysExecVE, SYSCALL_EXEC, const char*, char* const*, char* const*); - DEFN_SYSCALL2(pid_t, SysTFork, SYSCALL_TFORK, int, tforkregs_t*); - DEFN_SYSCALL0(pid_t, SysGetPID, SYSCALL_GETPID); - DEFN_SYSCALL0(pid_t, SysGetParentPID, SYSCALL_GETPPID); - DEFN_SYSCALL3(pid_t, SysWait, SYSCALL_WAIT, pid_t, int*, int); - - extern "C" int execve(const char* pathname, char* const* argv, - char* const* envp) - { - return SysExecVE(pathname, argv, envp); - } - - extern "C" int execv(const char* pathname, char* const* argv) - { - return execve(pathname, argv, environ); - } - - // Note that the only PATH variable in Sortix is the one used here. - extern "C" int execvpe(const char* filename, char* const* argv, - char* const* envp) - { - if ( strchr(filename, '/') ) - return execve(filename, argv, envp); - size_t filenamelen = strlen(filename); - const char* PATH = "/bin"; - size_t pathlen = strlen(PATH); - char* pathname = (char*) malloc(filenamelen + 1 + pathlen + 1); - if ( !pathname ) { return -1; } - stpcpy(stpcpy(stpcpy(pathname, PATH), "/"), filename); - int result = execve(pathname, argv, envp); - free(pathname); - return result; - } - - extern "C" int execvp(const char* filename, char* const* argv) - { - return execvpe(filename, argv, environ); - } - - extern "C" int vexecl(const char* pathname, va_list args) - { - va_list iter; - va_copy(iter, args); - size_t numargs = 0; - while ( va_arg(iter, const char*) ) { numargs++; } - va_end(iter); - char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); - if ( !argv ) { return -1; } - for ( size_t i = 0; i <= numargs; i++ ) - { - argv[i] = (char*) va_arg(args, const char*); - } - int result = execv(pathname, argv); - free(argv); - return result; - } - - extern "C" int vexeclp(const char* filename, va_list args) - { - va_list iter; - va_copy(iter, args); - size_t numargs = 0; - while ( va_arg(iter, const char*) ) { numargs++; } - va_end(iter); - char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); - if ( !argv ) { return -1; } - for ( size_t i = 0; i <= numargs; i++ ) - { - argv[i] = (char*) va_arg(args, const char*); - } - int result = execvp(filename, argv); - free(argv); - return result; - } - - extern "C" int vexecle(const char* pathname, va_list args) - { - va_list iter; - va_copy(iter, args); - size_t numargs = 0; - while ( va_arg(iter, const char*) ) { numargs++; } - va_end(iter); - numargs--; // envp - char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); - if ( !argv ) { return -1; } - for ( size_t i = 0; i < numargs; i++ ) - { - argv[i] = (char*) va_arg(args, const char*); - } - argv[numargs] = NULL; - char* const* envp = va_arg(args, char* const*); - int result = execve(pathname, argv, envp); - free(argv); - return result; - } - - extern "C" int execl(const char* pathname, ...) - { - va_list args; - va_start(args, pathname); - int result = vexecl(pathname, args); - va_end(args); - return result; - } - - extern "C" int execlp(const char* filename, ...) - { - va_list args; - va_start(args, filename); - int result = vexeclp(filename, args); - va_end(args); - return result; - } - - extern "C" int execle(const char* pathname, ...) - { - va_list args; - va_start(args, pathname); - int result = vexecle(pathname, args); - va_end(args); - return result; - } - - extern "C" pid_t tfork(int flags, tforkregs_t* regs) - { - return SysTFork(flags, regs); - } - - extern "C" pid_t __call_tfork_with_regs(int flags); - - extern "C" pid_t sfork(int flags) - { - return __call_tfork_with_regs(flags); - } - - extern "C" pid_t fork() - { - return sfork(SFFORK); - } - - extern "C" pid_t getpid() - { - return SysGetPID(); - } - - extern "C" pid_t getppid() - { - return SysGetParentPID(); - } - - extern "C" pid_t waitpid(pid_t pid, int* status, int options) - { - return SysWait(pid, status, options); - } - - extern "C" pid_t wait(int* status) - { - return waitpid(-1, status, 0); - } - } -} - diff --git a/libmaxsi/sfork.cpp b/libmaxsi/sfork.cpp new file mode 100644 index 00000000..d47896e9 --- /dev/null +++ b/libmaxsi/sfork.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + sfork.cpp + Create a new task inheriting some properties from the current task. + +*******************************************************************************/ + +#include + +extern "C" pid_t __call_tfork_with_regs(int flags); + +extern "C" pid_t sfork(int flags) +{ + return __call_tfork_with_regs(flags); +} diff --git a/libmaxsi/tfork.cpp b/libmaxsi/tfork.cpp new file mode 100644 index 00000000..7c04e360 --- /dev/null +++ b/libmaxsi/tfork.cpp @@ -0,0 +1,33 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + tfork.cpp + Create a new task inheriting some properties from the current task. + +*******************************************************************************/ + +#include +#include + +DEFN_SYSCALL2(pid_t, sys_tfork, SYSCALL_TFORK, int, tforkregs_t*); + +extern "C" pid_t tfork(int flags, tforkregs_t* regs) +{ + return sys_tfork(flags, regs); +} diff --git a/libmaxsi/vexecl.cpp b/libmaxsi/vexecl.cpp new file mode 100644 index 00000000..4e08040d --- /dev/null +++ b/libmaxsi/vexecl.cpp @@ -0,0 +1,45 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + vexecl.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int vexecl(const char* pathname, va_list args) +{ + va_list iter; + va_copy(iter, args); + size_t numargs = 0; + while ( va_arg(iter, const char*) ) { numargs++; } + va_end(iter); + char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); + if ( !argv ) { return -1; } + for ( size_t i = 0; i <= numargs; i++ ) + { + argv[i] = (char*) va_arg(args, const char*); + } + int result = execv(pathname, argv); + free(argv); + return result; +} diff --git a/libmaxsi/vexecle.cpp b/libmaxsi/vexecle.cpp new file mode 100644 index 00000000..043b9e55 --- /dev/null +++ b/libmaxsi/vexecle.cpp @@ -0,0 +1,48 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + vexecle.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int vexecle(const char* pathname, va_list args) +{ + va_list iter; + va_copy(iter, args); + size_t numargs = 0; + while ( va_arg(iter, const char*) ) { numargs++; } + va_end(iter); + numargs--; // envp + char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); + if ( !argv ) { return -1; } + for ( size_t i = 0; i < numargs; i++ ) + { + argv[i] = (char*) va_arg(args, const char*); + } + argv[numargs] = NULL; + char* const* envp = va_arg(args, char* const*); + int result = execve(pathname, argv, envp); + free(argv); + return result; +} diff --git a/libmaxsi/vexeclp.cpp b/libmaxsi/vexeclp.cpp new file mode 100644 index 00000000..2bd9effc --- /dev/null +++ b/libmaxsi/vexeclp.cpp @@ -0,0 +1,45 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + vexeclp.cpp + Loads a process image. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int vexeclp(const char* filename, va_list args) +{ + va_list iter; + va_copy(iter, args); + size_t numargs = 0; + while ( va_arg(iter, const char*) ) { numargs++; } + va_end(iter); + char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); + if ( !argv ) { return -1; } + for ( size_t i = 0; i <= numargs; i++ ) + { + argv[i] = (char*) va_arg(args, const char*); + } + int result = execvp(filename, argv); + free(argv); + return result; +} diff --git a/libmaxsi/wait.cpp b/libmaxsi/wait.cpp new file mode 100644 index 00000000..27ccd10e --- /dev/null +++ b/libmaxsi/wait.cpp @@ -0,0 +1,30 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + waitpid.cpp + Wait for child process. + +*******************************************************************************/ + +#include + +extern "C" pid_t wait(int* status) +{ + return waitpid(-1, status, 0); +} diff --git a/libmaxsi/waitpid.cpp b/libmaxsi/waitpid.cpp new file mode 100644 index 00000000..33eb3c9d --- /dev/null +++ b/libmaxsi/waitpid.cpp @@ -0,0 +1,33 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + waitpid.cpp + Wait for child process. + +*******************************************************************************/ + +#include +#include + +DEFN_SYSCALL3(pid_t, sys_wait, SYSCALL_WAIT, pid_t, int*, int); + +extern "C" pid_t waitpid(pid_t pid, int* status, int options) +{ + return sys_wait(pid, status, options); +}