Add os_exec() helper to run external programs
authorJouni Malinen <jouni@qca.qualcomm.com>
Mon, 6 Oct 2014 13:27:44 +0000 (16:27 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 9 Oct 2014 14:38:25 +0000 (17:38 +0300)
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/utils/os.h
src/utils/os_unix.c
src/utils/os_win32.c

index f196209..b9247d8 100644 (file)
@@ -601,6 +601,15 @@ size_t os_strlcpy(char *dest, const char *src, size_t siz);
  */
 int os_memcmp_const(const void *a, const void *b, size_t len);
 
+/**
+ * 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
index 7498967..523a4d0 100644 (file)
@@ -9,6 +9,7 @@
 #include "includes.h"
 
 #include <time.h>
+#include <sys/wait.h>
 
 #ifdef ANDROID
 #include <sys/capability.h>
@@ -554,3 +555,57 @@ char * os_strdup(const char *s)
 }
 
 #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;
+}
index 55937de..57ee132 100644 (file)
@@ -258,3 +258,9 @@ int os_memcmp_const(const void *a, const void *b, size_t len)
 
        return res;
 }
+
+
+int os_exec(const char *program, const char *arg, int wait_completion)
+{
+       return -1;
+}