2 #include "run-command.h"
5 int run_command_v_opt(const char **argv
, int flags
)
10 return -ERR_RUN_COMMAND_FORK
;
12 if (flags
& RUN_COMMAND_NO_STDIN
) {
13 int fd
= open("/dev/null", O_RDWR
);
17 if (flags
& RUN_COMMAND_STDOUT_TO_STDERR
)
19 if (flags
& RUN_GIT_CMD
) {
22 execvp(argv
[0], (char *const*) argv
);
24 die("exec %s failed.", argv
[0]);
28 pid_t waiting
= waitpid(pid
, &status
, 0);
33 error("waitpid failed (%s)", strerror(errno
));
34 return -ERR_RUN_COMMAND_WAITPID
;
37 return -ERR_RUN_COMMAND_WAITPID_WRONG_PID
;
38 if (WIFSIGNALED(status
))
39 return -ERR_RUN_COMMAND_WAITPID_SIGNAL
;
41 if (!WIFEXITED(status
))
42 return -ERR_RUN_COMMAND_WAITPID_NOEXIT
;
43 code
= WEXITSTATUS(status
);
50 int run_command_v(const char **argv
)
52 return run_command_v_opt(argv
, 0);
55 static int run_command_va_opt(int opt
, const char *cmd
, va_list param
)
58 const char *argv
[MAX_RUN_COMMAND_ARGS
];
61 argv
[0] = (char*) cmd
;
63 while (argc
< MAX_RUN_COMMAND_ARGS
) {
64 arg
= argv
[argc
++] = va_arg(param
, char *);
68 if (MAX_RUN_COMMAND_ARGS
<= argc
)
69 return error("too many args to run %s", cmd
);
70 return run_command_v_opt(argv
, opt
);
73 int run_command_opt(int opt
, const char *cmd
, ...)
78 va_start(params
, cmd
);
79 r
= run_command_va_opt(opt
, cmd
, params
);
84 int run_command(const char *cmd
, ...)
89 va_start(params
, cmd
);
90 r
= run_command_va_opt(0, cmd
, params
);