Fix CONFIG_OS=internal build
Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
7d9286d3e7
commit
ff013b94ca
1 changed files with 59 additions and 3 deletions
|
@ -17,9 +17,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#undef OS_REJECT_C_LIB_FUNCTIONS
|
#undef OS_REJECT_C_LIB_FUNCTIONS
|
||||||
#include "os.h"
|
#include "common.h"
|
||||||
|
|
||||||
void os_sleep(os_time_t sec, os_time_t usec)
|
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);
|
cwd_len = os_strlen(cwd);
|
||||||
rel_len = strlen(rel_path);
|
rel_len = os_strlen(rel_path);
|
||||||
ret_len = cwd_len + 1 + rel_len + 1;
|
ret_len = cwd_len + 1 + rel_len + 1;
|
||||||
ret = os_malloc(ret_len);
|
ret = os_malloc(ret_len);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -506,3 +508,57 @@ int os_snprintf(char *str, size_t size, const char *format, ...)
|
||||||
str[size - 1] = '\0';
|
str[size - 1] = '\0';
|
||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue