From dd3662e3d07b578074167dfea840f6a5121dec4a Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Wed, 16 Oct 2013 00:29:39 +0200 Subject: [PATCH] Fix prototypes for execl(3), execle(3), and execlp(3). --- libc/execl.cpp | 30 ++++++++++++++++++++++++++---- libc/execle.cpp | 37 +++++++++++++++++++++++++++++++++---- libc/execlp.cpp | 30 ++++++++++++++++++++++++++---- libc/include/unistd.h | 6 +++--- 4 files changed, 88 insertions(+), 15 deletions(-) diff --git a/libc/execl.cpp b/libc/execl.cpp index 79b6b888..5a6b8e32 100644 --- a/libc/execl.cpp +++ b/libc/execl.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013. This file is part of the Sortix C Library. @@ -23,13 +23,35 @@ *******************************************************************************/ #include +#include #include -extern "C" int execl(const char* pathname, ...) +extern "C" int execl(const char* pathname, const char* argv0, ...) { + if ( !argv0 ) + return execv(pathname, (char* const*) &argv0); + va_list args; - va_start(args, pathname); - int result = vexecl(pathname, args); + va_start(args, argv0); + size_t numargs = 1; + while ( argv0 && va_arg(args, const char*) ) + numargs++; va_end(args); + + char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); + if ( !argv ) + return -1; + + argv[0] = (char*) argv0; + va_start(args, argv0); + for ( size_t i = 1; i <= numargs; i++ ) + argv[i] = (char*) va_arg(args, const char*); + va_end(args); + argv[numargs] = NULL; + + int result = execv(pathname, argv); + + free(argv); + return result; } diff --git a/libc/execle.cpp b/libc/execle.cpp index e203f393..24f39bd8 100644 --- a/libc/execle.cpp +++ b/libc/execle.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013. This file is part of the Sortix C Library. @@ -23,13 +23,42 @@ *******************************************************************************/ #include +#include #include -extern "C" int execle(const char* pathname, ...) +extern "C" int execle(const char* pathname, const char* argv0, ...) { + if ( !argv0 ) + { + va_list args; + va_start(args, argv0); + char* const* envp = va_arg(args, char* const*); + va_end(args); + return execve(pathname, (char* const*) &argv0, envp); + } + va_list args; - va_start(args, pathname); - int result = vexecle(pathname, args); + va_start(args, argv0); + size_t numargs = 1; + while ( argv0 && va_arg(args, const char*) ) + numargs++; va_end(args); + + char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); + if ( !argv ) + return -1; + + argv[0] = (char*) argv0; + va_start(args, argv0); + for ( size_t i = 1; i <= numargs; i++ ) + argv[i] = (char*) va_arg(args, const char*); + char* const* envp = va_arg(args, char* const*); + va_end(args); + argv[numargs] = NULL; + + int result = execve(pathname, argv, envp); + + free(argv); + return result; } diff --git a/libc/execlp.cpp b/libc/execlp.cpp index 36ba0ec5..30f883dc 100644 --- a/libc/execlp.cpp +++ b/libc/execlp.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013. This file is part of the Sortix C Library. @@ -23,13 +23,35 @@ *******************************************************************************/ #include +#include #include -extern "C" int execlp(const char* filename, ...) +extern "C" int execlp(const char* filename, const char* argv0, ...) { + if ( !argv0 ) + return execvp(filename, (char* const*) &argv0); + va_list args; - va_start(args, filename); - int result = vexeclp(filename, args); + va_start(args, argv0); + size_t numargs = 1; + while ( argv0 && va_arg(args, const char*) ) + numargs++; va_end(args); + + char** argv = (char**) malloc(sizeof(char*) * (numargs+1)); + if ( !argv ) + return -1; + + argv[0] = (char*) argv0; + va_start(args, argv0); + for ( size_t i = 1; i <= numargs; i++ ) + argv[i] = (char*) va_arg(args, const char*); + va_end(args); + argv[numargs] = NULL; + + int result = execvp(filename, argv); + + free(argv); + return result; } diff --git a/libc/include/unistd.h b/libc/include/unistd.h index 4e650054..56021bf9 100644 --- a/libc/include/unistd.h +++ b/libc/include/unistd.h @@ -156,9 +156,9 @@ int chdir(const char*); int close(int); int dup(int); void _exit(int) __attribute__ ((noreturn)); -int execl(const char*, ...); -int execle(const char*, ...); -int execlp(const char*, ...); +int execl(const char*, const char*, ...); +int execle(const char*, const char*, ...); +int execlp(const char*, const char*, ...); int execv(const char*, char* const []); int execve(const char*, char* const [], char* const []); int execvp(const char*, char* const []);