From 0f412e570c26d6d791d6a81e6dc7744fc02eb407 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 31 May 2023 22:36:26 +0300 Subject: [PATCH] LibC: add execl --- libc/unistd.cpp | 32 ++++++++++++++++++++++++++++++++ userspace/test/test.cpp | 6 +----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/libc/unistd.cpp b/libc/unistd.cpp index 9c7918e5..970a1fc0 100644 --- a/libc/unistd.cpp +++ b/libc/unistd.cpp @@ -147,6 +147,38 @@ long syscall(long syscall, ...) return ret; } +int execl(const char* pathname, const char* arg0, ...) +{ + if (arg0 == nullptr) + { + char* temp = nullptr; + return execv(pathname, &temp); + } + + va_list ap; + va_start(ap, arg0); + int argc = 1; + while (va_arg(ap, const char*)) + argc++; + va_end(ap); + + char** argv = (char**)malloc(sizeof(char*) * (argc + 1)); + if (argv == nullptr) + { + errno = ENOMEM; + return -1; + } + + va_start(ap, arg0); + argv[0] = (char*)arg0; + for (int i = 1; i < argc; i++) + argv[i] = va_arg(ap, char*); + argv[argc] = nullptr; + va_end(ap); + + return execv(pathname, argv); +} + int execv(const char* pathname, char* const argv[]) { return syscall(SYS_EXEC, pathname, argv, nullptr); diff --git a/userspace/test/test.cpp b/userspace/test/test.cpp index 47253ca6..576828df 100644 --- a/userspace/test/test.cpp +++ b/userspace/test/test.cpp @@ -12,11 +12,7 @@ int main() if (fork() == 0) { - char* argv[3]; - argv[0] = (char*)malloc(100); strcpy(argv[0], "/usr/bin/cat"); - argv[1] = (char*)malloc(100); strcpy(argv[1], "/usr/include/kernel/kprint.h"); - argv[2] = NULL; - execv("/usr/bin/cat", (char**)argv); + execl("/usr/bin/cat", "/usr/bin/cat", "/usr/include/kernel/kprint.h", NULL); ERROR("execl"); return 0; }