summaryrefslogtreecommitdiffstats
path: root/patches/source/wpa_supplicant/0001-Add-os_exec-helper-to-run-external-programs.patch
diff options
context:
space:
mode:
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.patch99
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;
++}