[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 1/2] lib/posix-process: Add more process creation functions
... such as vfork() and other members of exec*() family. We also add the declarations for nolibc. Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> --- lib/nolibc/include/stdlib.h | 4 ++ lib/nolibc/include/unistd.h | 15 +++++ lib/posix-process/process.c | 118 ++++++++++++++++++++++++++++-------- 3 files changed, 113 insertions(+), 24 deletions(-) diff --git a/lib/nolibc/include/stdlib.h b/lib/nolibc/include/stdlib.h index 28718153..02dd8500 100644 --- a/lib/nolibc/include/stdlib.h +++ b/lib/nolibc/include/stdlib.h @@ -86,6 +86,10 @@ int posix_memalign(void **memptr, size_t align, size_t size); void *memalign(size_t align, size_t size); #endif /* CONFIG_LIBUKALLOC */ +#if CONFIG_LIBPOSIX_PROCESS +int system(const char *command); +#endif + #ifdef __cplusplus } #endif diff --git a/lib/nolibc/include/unistd.h b/lib/nolibc/include/unistd.h index 96cce34d..56a472ce 100644 --- a/lib/nolibc/include/unistd.h +++ b/lib/nolibc/include/unistd.h @@ -60,6 +60,21 @@ extern "C" { unsigned int sleep(unsigned int seconds); #endif +#if CONFIG_LIBPOSIX_PROCESS +int execl(const char *path, const char *arg, ... + /* (char *) NULL */); +int execlp(const char *file, const char *arg, ... + /* (char *) NULL */); +int execle(const char *path, const char *arg, ... + /*, (char *) NULL, char * const envp[] */); +int execv(const char *path, char *const argv[]); +int execvp(const char *file, char *const argv[]); +int execvpe(const char *file, char *const argv[], + char *const envp[]); +int execve(const char *filename, char *const argv[], + char *const envp[]); +#endif + #if CONFIG_LIBVFSCORE int close(int fd); ssize_t write(int fd, const void *buf, size_t count); diff --git a/lib/posix-process/process.c b/lib/posix-process/process.c index 78c2f385..81f16659 100644 --- a/lib/posix-process/process.c +++ b/lib/posix-process/process.c @@ -33,13 +33,12 @@ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. */ -#include "../posix-process/include/uk/process.h" - #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <sys/prctl.h> #include <sys/resource.h> +#include <uk/process.h> #include <uk/print.h> @@ -50,47 +49,118 @@ int fork(void) return -1; } -static -void exec_warn(const char *func, - const char *path, char *const argv[], char *const envp[]) +int vfork(void) +{ + /* vfork() is not supported on this platform */ + errno = ENOSYS; + return -1; +} + +static void exec_warn_argv_variadic(const char *arg, va_list args) { - int i; + int i = 1; + char *argi; - uk_pr_warn("%s(): path=%s", func, path); + uk_pr_warn(" argv=[%s", arg); - /* print arguments */ - i = 0; - uk_pr_warn(" argv=["); - while (argv[i]) { - uk_pr_warn("%s%s", (i > 0 ? ", " : ""), argv[i]); + argi = va_arg(args, char *); + while (argi) { + uk_pr_warn("%s%s", (i > 0 ? ", " : ""), argi); i++; + argi = va_arg(args, char *); } - uk_pr_warn("]"); - - /* print environment variables */ - if (envp) { - i = 0; - uk_pr_warn(" envp=["); - while (envp[i]) { - uk_pr_warn("%s%s", (i > 0 ? ", " : ""), envp[i]); + uk_pr_warn("]\n"); +} + +static void __exec_warn_array(const char *name, char *const argv[]) +{ + int i = 0; + + uk_pr_warn(" %s=[", name); + + if (argv) { + while (argv[i]) { + uk_pr_warn("%s%s", (i > 0 ? ", " : ""), argv[i]); i++; } - uk_pr_warn("]"); } + uk_pr_warn("]\n"); +} +#define exec_warn_argv(values) __exec_warn_array("argv", values) +#define exec_warn_envp(values) __exec_warn_array("envp", values) + +int execl(const char *path, const char *arg, ... + /* (char *) NULL */) +{ + va_list args; + + uk_pr_warn("%s(): path=%s\n", __func__, path); + va_start(args, arg); + exec_warn_argv_variadic(arg, args); + va_end(args); + errno = ENOSYS; + return -1; +} + +int execlp(const char *file, const char *arg, ... + /* (char *) NULL */) +{ + va_list args; + + uk_pr_warn("%s(): file=%s\n", __func__, file); + va_start(args, arg); + exec_warn_argv_variadic(arg, args); + va_end(args); + errno = ENOSYS; + return -1; +} - uk_pr_warn("\n"); +int execle(const char *path, const char *arg, ... + /*, (char *) NULL, char * const envp[] */) +{ + va_list args; + char * const *envp; + + uk_pr_warn("%s(): path=%s\n", __func__, path); + va_start(args, arg); + exec_warn_argv_variadic(arg, args); + envp = va_arg(args, char * const *); + exec_warn_envp(envp); + va_end(args); + errno = ENOSYS; + return -1; } int execve(const char *path, char *const argv[], char *const envp[]) { - exec_warn(__func__, path, argv, envp); + uk_pr_warn("%s(): path=%s\n", __func__, path); + exec_warn_argv(argv); + exec_warn_envp(envp); errno = ENOSYS; return -1; } int execv(const char *path, char *const argv[]) { - exec_warn(__func__, path, argv, NULL); + uk_pr_warn("%s(): path=%s\n", __func__, path); + exec_warn_argv(argv); + errno = ENOSYS; + return -1; +} + +int execvp(const char *file, char *const argv[]) +{ + uk_pr_warn("%s(): file=%s\n", __func__, file); + exec_warn_argv(argv); + errno = ENOSYS; + return -1; +} + +int execvpe(const char *file, char *const argv[], char *const envp[]) +{ + uk_pr_warn("%s(): file=%s\n", __func__, file); + exec_warn_argv(argv); + exec_warn_envp(envp); errno = ENOSYS; return -1; } -- 2.20.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |