run-command.con commit [PATCH] Fix sparse warnings (4d8fa91)
   1#include "cache.h"
   2#include "run-command.h"
   3#include <sys/wait.h>
   4
   5static int run_external_command(int argc, const char **argv)
   6{
   7        pid_t pid = fork();
   8
   9        if (pid < 0)
  10                return -ERR_RUN_COMMAND_FORK;
  11        if (!pid) {
  12                execvp(argv[0], (char *const*) argv);
  13                return -ERR_RUN_COMMAND_EXEC;
  14        }
  15        for (;;) {
  16                int status, code;
  17                int retval = waitpid(pid, &status, 0);
  18
  19                if (retval < 0) {
  20                        if (errno == EINTR)
  21                                continue;
  22                        error("waitpid failed (%s)", strerror(retval));
  23                        return -ERR_RUN_COMMAND_WAITPID;
  24                }
  25                if (retval != pid)
  26                        return -ERR_RUN_COMMAND_WAITPID_WRONG_PID;
  27                if (WIFSIGNALED(status))
  28                        return -ERR_RUN_COMMAND_WAITPID_SIGNAL;
  29
  30                if (!WIFEXITED(status))
  31                        return -ERR_RUN_COMMAND_WAITPID_NOEXIT;
  32                code = WEXITSTATUS(status);
  33                if (code)
  34                        return -code;
  35                return 0;
  36        }
  37}
  38
  39int run_command(const char *cmd, ...)
  40{
  41        int argc;
  42        const char *argv[MAX_RUN_COMMAND_ARGS];
  43        const char *arg;
  44        va_list param;
  45
  46        fprintf(stderr, "run-command %s (%d)\n", cmd, ERR_RUN_COMMAND_EXEC);
  47
  48        va_start(param, cmd);
  49        argv[0] = cmd;
  50        argc = 1;
  51        while (argc < MAX_RUN_COMMAND_ARGS) {
  52                arg = argv[argc++] = va_arg(param, char *);
  53                if (!arg)
  54                        break;
  55        }
  56        va_end(param);
  57        if (MAX_RUN_COMMAND_ARGS <= argc)
  58                return error("too many args to run %s", cmd);
  59        return run_external_command(argc, argv);
  60}