1#ifndef RUN_COMMAND_H 2#define RUN_COMMAND_H 3 4enum { 5 ERR_RUN_COMMAND_FORK = 10000, 6 ERR_RUN_COMMAND_EXEC, 7 ERR_RUN_COMMAND_PIPE, 8 ERR_RUN_COMMAND_WAITPID, 9 ERR_RUN_COMMAND_WAITPID_WRONG_PID, 10 ERR_RUN_COMMAND_WAITPID_SIGNAL, 11 ERR_RUN_COMMAND_WAITPID_NOEXIT, 12}; 13 14struct child_process { 15 const char **argv; 16 pid_t pid; 17 int in; 18 int out; 19 int err; 20 const char *dir; 21 const char *const *env; 22 unsigned close_in:1; 23 unsigned close_out:1; 24 unsigned no_stdin:1; 25 unsigned no_stdout:1; 26 unsigned no_stderr:1; 27 unsigned git_cmd:1; /* if this is to be git sub-command */ 28 unsigned stdout_to_stderr:1; 29}; 30 31int start_command(struct child_process *); 32int finish_command(struct child_process *); 33int run_command(struct child_process *); 34 35#define RUN_COMMAND_NO_STDIN 1 36#define RUN_GIT_CMD 2 /*If this is to be git sub-command */ 37#define RUN_COMMAND_STDOUT_TO_STDERR 4 38int run_command_v_opt(const char **argv, int opt); 39int run_command_v_opt_cd(const char **argv, int opt, const char *dir); 40 41/* 42 * env (the environment) is to be formatted like environ: "VAR=VALUE". 43 * To unset an environment variable use just "VAR". 44 */ 45int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env); 46 47/* 48 * The purpose of the following functions is to feed a pipe by running 49 * a function asynchronously and providing output that the caller reads. 50 * 51 * It is expected that no synchronization and mutual exclusion between 52 * the caller and the feed function is necessary so that the function 53 * can run in a thread without interfering with the caller. 54 */ 55struct async { 56 /* 57 * proc writes to fd and closes it; 58 * returns 0 on success, non-zero on failure 59 */ 60 int (*proc)(int fd, void *data); 61 void *data; 62 int out; /* caller reads from here and closes it */ 63 pid_t pid; 64}; 65 66int start_async(struct async *async); 67int finish_async(struct async *async); 68 69#endif