diff options
Diffstat (limited to 'patches/source/wpa_supplicant/0001-Add-os_exec-helper-to-run-external-programs.patch')
-rw-r--r-- | patches/source/wpa_supplicant/0001-Add-os_exec-helper-to-run-external-programs.patch | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/patches/source/wpa_supplicant/0001-Add-os_exec-helper-to-run-external-programs.patch b/patches/source/wpa_supplicant/0001-Add-os_exec-helper-to-run-external-programs.patch new file mode 100644 index 000000000..95ed09da5 --- /dev/null +++ b/patches/source/wpa_supplicant/0001-Add-os_exec-helper-to-run-external-programs.patch @@ -0,0 +1,99 @@ +--- ./src/utils/os_win32.c.orig 2010-09-07 10:43:39.000000000 -0500 ++++ ./src/utils/os_win32.c 2014-12-07 14:27:02.070038369 -0600 +@@ -220,3 +220,9 @@ + + return s - src - 1; + } ++ ++ ++int os_exec(const char *program, const char *arg, int wait_completion) ++{ ++ return -1; ++} +--- ./src/utils/os.h.orig 2010-09-07 10:43:39.000000000 -0500 ++++ ./src/utils/os.h 2014-12-07 14:27:02.065038369 -0600 +@@ -475,6 +475,15 @@ + */ + 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 +--- ./src/utils/os_unix.c.orig 2010-09-07 10:43:39.000000000 -0500 ++++ ./src/utils/os_unix.c 2014-12-07 14:27:37.815040567 -0600 +@@ -14,6 +14,8 @@ + + #include "includes.h" + ++#include <sys/wait.h> ++ + #include "os.h" + + #ifdef WPA_TRACE +@@ -435,3 +437,57 @@ + } + + #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; ++} |