]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Fix CONFIG_OS=internal build
authorJouni Malinen <j@w1.fi>
Thu, 25 Dec 2014 09:29:08 +0000 (11:29 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 25 Dec 2014 14:37:12 +0000 (16:37 +0200)
Signed-off-by: Jouni Malinen <j@w1.fi>
src/utils/os_internal.c

index 90b6688adc253f704a45d382541f9da1094dc7f1..a810ee88ec1d32065374e921be3abb53dd418da1 100644 (file)
  */
 
 #include "includes.h"
+#include <time.h>
+#include <sys/wait.h>
 
 #undef OS_REJECT_C_LIB_FUNCTIONS
-#include "os.h"
+#include "common.h"
 
 void os_sleep(os_time_t sec, os_time_t usec)
 {
@@ -167,8 +169,8 @@ char * os_rel2abs_path(const char *rel_path)
                }
        }
 
-       cwd_len = strlen(cwd);
-       rel_len = strlen(rel_path);
+       cwd_len = os_strlen(cwd);
+       rel_len = os_strlen(rel_path);
        ret_len = cwd_len + 1 + rel_len + 1;
        ret = os_malloc(ret_len);
        if (ret) {
@@ -506,3 +508,57 @@ int os_snprintf(char *str, size_t size, const char *format, ...)
                str[size - 1] = '\0';
        return ret;
 }
+
+
+int os_exec(const char *program, const char *arg, int wait_completion)
+{
+       pid_t pid;
+       int pid_status;
+
+       pid = fork();
+       if (pid < 0) {
+               wpa_printf(MSG_ERROR, "fork: %s", strerror(errno));
+               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);
+               wpa_printf(MSG_ERROR, "execv: %s", strerror(errno));
+               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;
+}