From 89de07a9442072f88d49869d8ecd8d42bae050a0 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Mon, 6 Oct 2014 16:27:44 +0300 Subject: [PATCH 1/2] Add os_exec() helper to run external programs Signed-off-by: Jouni Malinen --- src/utils/os.h | 9 +++++++++ src/utils/os_unix.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils/os_win32.c | 6 ++++++ 3 files changed, 70 insertions(+) diff --git a/src/utils/os.h b/src/utils/os.h index f196209..b9247d8 100644 --- a/src/utils/os.h +++ b/src/utils/os.h @@ -597,14 +597,23 @@ size_t os_strlcpy(char *dest, const char *src, size_t siz); * Returns: Total length of the target string (length of src) (not including * NUL-termination) * * This function matches in behavior with the strlcpy(3) function in OpenBSD. */ size_t os_strlcpy(char *dest, const char *src, size_t siz); +/** + * os_exec - Execute an external program + * @program: Path to the program + * @arg: Command line argument string + * @wait_completion: Whether to wait until the program execution completes + * Returns: 0 on success, -1 on error + */ +int os_exec(const char *program, const char *arg, int wait_completion); + #ifdef OS_REJECT_C_LIB_FUNCTIONS #define malloc OS_DO_NOT_USE_malloc #define realloc OS_DO_NOT_USE_realloc #define free OS_DO_NOT_USE_free #define memcpy OS_DO_NOT_USE_memcpy #define memmove OS_DO_NOT_USE_memmove diff --git a/src/utils/os_unix.c b/src/utils/os_unix.c index 7498967..523a4d0 100644 --- a/src/utils/os_unix.c +++ b/src/utils/os_unix.c @@ -5,14 +5,15 @@ * This software may be distributed under the terms of the BSD license. * See README for more details. */ #include "includes.h" #include +#include #ifdef ANDROID #include #include #include #endif /* ANDROID */ @@ -550,7 +551,61 @@ char * os_strdup(const char *s) return NULL; os_memcpy(d, s, len); d[len] = '\0'; return d; } #endif /* WPA_TRACE */ + + +int os_exec(const char *program, const char *arg, int wait_completion) +{ + pid_t pid; + int pid_status; + + pid = fork(); + if (pid < 0) { + perror("fork"); + return -1; + } + + if (pid == 0) { + /* run the external command in the child process */ + const int MAX_ARG = 30; + char *_program, *_arg, *pos; + char *argv[MAX_ARG + 1]; + int i; + + _program = os_strdup(program); + _arg = os_strdup(arg); + + argv[0] = _program; + + i = 1; + pos = _arg; + while (i < MAX_ARG && pos && *pos) { + while (*pos == ' ') + pos++; + if (*pos == '\0') + break; + argv[i++] = pos; + pos = os_strchr(pos, ' '); + if (pos) + *pos++ = '\0'; + } + argv[i] = NULL; + + execv(program, argv); + perror("execv"); + os_free(_program); + os_free(_arg); + exit(0); + return -1; + } + + if (wait_completion) { + /* wait for the child process to complete in the parent */ + waitpid(pid, &pid_status, 0); + } + + return 0; +} diff --git a/src/utils/os_win32.c b/src/utils/os_win32.c index 55937de..57ee132 100644 --- a/src/utils/os_win32.c +++ b/src/utils/os_win32.c @@ -254,7 +254,13 @@ int os_memcmp_const(const void *a, const void *b, size_t len) *dest = '\0'; while (*s++) ; /* determine total src string length */ } return s - src - 1; } + + +int os_exec(const char *program, const char *arg, int wait_completion) +{ + return -1; +} -- 1.9.3