summaryrefslogtreecommitdiffstats
path: root/patches/source/wpa_supplicant/0001-Add-os_exec-helper-to-run-external-programs.patch
blob: 95ed09da579f6e0156c754c3477a1d5469b28f24 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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;
+}