From 76577e69f186059aaceed0bdb1d7e1947afc612c Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sun, 23 Feb 2014 13:30:23 +0100 Subject: [PATCH] Add execlpe(3). --- libc/Makefile | 1 + libc/unistd/execlpe.cpp | 59 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 libc/unistd/execlpe.cpp diff --git a/libc/Makefile b/libc/Makefile index f8631b7f..922b3f6a 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -528,6 +528,7 @@ unistd/dup.o \ unistd/environ.o \ unistd/execle.o \ unistd/execl.o \ +unistd/execlpe.o \ unistd/execlp.o \ unistd/execve.o \ unistd/execv.o \ diff --git a/libc/unistd/execlpe.cpp b/libc/unistd/execlpe.cpp new file mode 100644 index 00000000..f9f118d8 --- /dev/null +++ b/libc/unistd/execlpe.cpp @@ -0,0 +1,59 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2014. + + 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 . + + unistd/execlpe.cpp + Loads a program image. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int execlpe(const char* filename, const char* argv0, ...) +{ + va_list args; + va_start(args, argv0); + size_t numargs = 0; + if ( argv0 ) + { + numargs++; + while ( va_arg(args, const char*) ) + numargs++; + } + (void) va_arg(args, char* const*) /* envp */; + va_end(args); + + char** argv = (char**) malloc(sizeof(char*) * (numargs + 1)); + if ( !argv ) + return -1; + + va_start(args, argv0); + argv[0] = (char*) 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); + + int result = execvpe(filename, argv, envp); + + free(argv); + + return result; +}