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 { 15const char**argv; 16 pid_t pid; 17int in; 18int out; 19int err; 20const char*dir; 21const char*const*env; 22unsigned close_in:1; 23unsigned close_out:1; 24unsigned no_stdin:1; 25unsigned no_stdout:1; 26unsigned git_cmd:1;/* if this is to be git sub-command */ 27unsigned stdout_to_stderr:1; 28}; 29 30intstart_command(struct child_process *); 31intfinish_command(struct child_process *); 32intrun_command(struct child_process *); 33 34#define RUN_COMMAND_NO_STDIN 1 35#define RUN_GIT_CMD 2/*If this is to be git sub-command */ 36#define RUN_COMMAND_STDOUT_TO_STDERR 4 37intrun_command_v_opt(const char**argv,int opt); 38intrun_command_v_opt_cd(const char**argv,int opt,const char*dir); 39 40/* 41 * env (the environment) is to be formatted like environ: "VAR=VALUE". 42 * To unset an environment variable use just "VAR". 43 */ 44intrun_command_v_opt_cd_env(const char**argv,int opt,const char*dir,const char*const*env); 45 46/* 47 * The purpose of the following functions is to feed a pipe by running 48 * a function asynchronously and providing output that the caller reads. 49 * 50 * It is expected that no synchronization and mutual exclusion between 51 * the caller and the feed function is necessary so that the function 52 * can run in a thread without interfering with the caller. 53 */ 54struct async { 55/* 56 * proc writes to fd and closes it; 57 * returns 0 on success, non-zero on failure 58 */ 59int(*proc)(int fd,void*data); 60void*data; 61int out;/* caller reads from here and closes it */ 62 pid_t pid; 63}; 64 65intstart_async(struct async *async); 66intfinish_async(struct async *async); 67 68#endif