You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
#include "cache.h" |
|
#include "run-command.h" |
|
#include <sys/wait.h> |
|
|
|
static int run_external_command(int argc, const char **argv) |
|
{ |
|
pid_t pid = fork(); |
|
|
|
if (pid < 0) |
|
return -ERR_RUN_COMMAND_FORK; |
|
if (!pid) { |
|
execvp(argv[0], (char *const*) argv); |
|
return -ERR_RUN_COMMAND_EXEC; |
|
} |
|
for (;;) { |
|
int status, code; |
|
int retval = waitpid(pid, &status, 0); |
|
|
|
if (retval < 0) { |
|
if (errno == EINTR) |
|
continue; |
|
error("waitpid failed (%s)", strerror(retval)); |
|
return -ERR_RUN_COMMAND_WAITPID; |
|
} |
|
if (retval != pid) |
|
return -ERR_RUN_COMMAND_WAITPID_WRONG_PID; |
|
if (WIFSIGNALED(status)) |
|
return -ERR_RUN_COMMAND_WAITPID_SIGNAL; |
|
|
|
if (!WIFEXITED(status)) |
|
return -ERR_RUN_COMMAND_WAITPID_NOEXIT; |
|
code = WEXITSTATUS(status); |
|
if (code) |
|
return -code; |
|
return 0; |
|
} |
|
} |
|
|
|
int run_command(const char *cmd, ...) |
|
{ |
|
int argc; |
|
const char *argv[MAX_RUN_COMMAND_ARGS]; |
|
const char *arg; |
|
va_list param; |
|
|
|
fprintf(stderr, "run-command %s (%d)\n", cmd, ERR_RUN_COMMAND_EXEC); |
|
|
|
va_start(param, cmd); |
|
argv[0] = cmd; |
|
argc = 1; |
|
while (argc < MAX_RUN_COMMAND_ARGS) { |
|
arg = argv[argc++] = va_arg(param, char *); |
|
if (!arg) |
|
break; |
|
} |
|
va_end(param); |
|
if (MAX_RUN_COMMAND_ARGS <= argc) |
|
return error("too many args to run %s", cmd); |
|
return run_external_command(argc, argv); |
|
}
|
|
|