Josef Weidendorfer | b1bf95b | 2005-07-31 21:17:43 +0200 | [diff] [blame] | 1 | #ifndef RUN_COMMAND_H |
| 2 | #define RUN_COMMAND_H |
| 3 | |
Nguyễn Thái Ngọc Duy | 10bc232 | 2018-11-03 09:48:38 +0100 | [diff] [blame] | 4 | #include "thread-utils.h" |
Johannes Sixt | 200a76b | 2010-03-06 16:40:42 +0100 | [diff] [blame] | 5 | |
Jeff King | dbbcd44 | 2020-07-28 16:23:39 -0400 | [diff] [blame] | 6 | #include "strvec.h" |
Jeff King | c460c0e | 2014-05-15 04:33:26 -0400 | [diff] [blame] | 7 | |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 8 | /** |
| 9 | * The run-command API offers a versatile tool to run sub-processes with |
| 10 | * redirected input and output as well as with a modified environment |
| 11 | * and an alternate current directory. |
| 12 | * |
| 13 | * A similar API offers the capability to run a function asynchronously, |
| 14 | * which is primarily used to capture the output that the function |
| 15 | * produces in the caller in order to process it. |
| 16 | */ |
| 17 | |
| 18 | |
| 19 | /** |
| 20 | * This describes the arguments, redirections, and environment of a |
| 21 | * command to run in a sub-process. |
| 22 | * |
| 23 | * The caller: |
| 24 | * |
| 25 | * 1. allocates and clears (using child_process_init() or |
| 26 | * CHILD_PROCESS_INIT) a struct child_process variable; |
| 27 | * 2. initializes the members; |
| 28 | * 3. calls start_command(); |
| 29 | * 4. processes the data; |
| 30 | * 5. closes file descriptors (if necessary; see below); |
| 31 | * 6. calls finish_command(). |
| 32 | * |
| 33 | * Special forms of redirection are available by setting these members |
| 34 | * to 1: |
| 35 | * |
| 36 | * .no_stdin, .no_stdout, .no_stderr: The respective channel is |
| 37 | * redirected to /dev/null. |
| 38 | * |
| 39 | * .stdout_to_stderr: stdout of the child is redirected to its |
| 40 | * stderr. This happens after stderr is itself redirected. |
| 41 | * So stdout will follow stderr to wherever it is |
| 42 | * redirected. |
| 43 | */ |
Shawn O. Pearce | f100089 | 2007-03-10 03:28:00 -0500 | [diff] [blame] | 44 | struct child_process { |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 45 | |
| 46 | /** |
| 47 | * The .argv member is set up as an array of string pointers (NULL |
| 48 | * terminated), of which .argv[0] is the program name to run (usually |
| 49 | * without a path). If the command to run is a git command, set argv[0] to |
| 50 | * the command name without the 'git-' prefix and set .git_cmd = 1. |
| 51 | * |
| 52 | * Note that the ownership of the memory pointed to by .argv stays with the |
| 53 | * caller, but it should survive until `finish_command` completes. If the |
| 54 | * .argv member is NULL, `start_command` will point it at the .args |
Jeff King | c972bf4 | 2020-07-28 16:25:12 -0400 | [diff] [blame] | 55 | * `strvec` (so you may use one or the other, but you must use exactly |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 56 | * one). The memory in .args will be cleaned up automatically during |
| 57 | * `finish_command` (or during `start_command` when it is unsuccessful). |
| 58 | * |
| 59 | */ |
Shawn O. Pearce | f100089 | 2007-03-10 03:28:00 -0500 | [diff] [blame] | 60 | const char **argv; |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 61 | |
Jeff King | c972bf4 | 2020-07-28 16:25:12 -0400 | [diff] [blame] | 62 | struct strvec args; |
| 63 | struct strvec env_array; |
Shawn O. Pearce | ebcb5d1 | 2007-03-10 03:28:05 -0500 | [diff] [blame] | 64 | pid_t pid; |
Jeff Hostetler | ee4512e | 2019-02-22 14:25:01 -0800 | [diff] [blame] | 65 | |
| 66 | int trace2_child_id; |
| 67 | uint64_t trace2_child_us_start; |
| 68 | const char *trace2_child_class; |
| 69 | const char *trace2_hook_name; |
| 70 | |
Johannes Sixt | c20181e | 2008-02-21 23:42:56 +0100 | [diff] [blame] | 71 | /* |
| 72 | * Using .in, .out, .err: |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 73 | * - Specify 0 for no redirections. No new file descriptor is allocated. |
| 74 | * (child inherits stdin, stdout, stderr from parent). |
Johannes Sixt | c20181e | 2008-02-21 23:42:56 +0100 | [diff] [blame] | 75 | * - Specify -1 to have a pipe allocated as follows: |
| 76 | * .in: returns the writable pipe end; parent writes to it, |
| 77 | * the readable pipe end becomes child's stdin |
| 78 | * .out, .err: returns the readable pipe end; parent reads from |
| 79 | * it, the writable pipe end becomes child's stdout/stderr |
| 80 | * The caller of start_command() must close the returned FDs |
| 81 | * after it has completed reading from/writing to it! |
| 82 | * - Specify > 0 to set a channel to a particular FD as follows: |
| 83 | * .in: a readable FD, becomes child's stdin |
| 84 | * .out: a writable FD, becomes child's stdout/stderr |
Shawn O. Pearce | 4f41b61 | 2010-02-05 12:57:37 -0800 | [diff] [blame] | 85 | * .err: a writable FD, becomes child's stderr |
Johannes Sixt | c20181e | 2008-02-21 23:42:56 +0100 | [diff] [blame] | 86 | * The specified FD is closed by start_command(), even in case |
| 87 | * of errors! |
| 88 | */ |
Shawn O. Pearce | 4919bf0 | 2007-03-10 03:28:08 -0500 | [diff] [blame] | 89 | int in; |
Shawn O. Pearce | f4bba25 | 2007-03-12 14:37:45 -0400 | [diff] [blame] | 90 | int out; |
Johannes Sixt | f3b33f1 | 2007-10-19 21:47:58 +0200 | [diff] [blame] | 91 | int err; |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 92 | |
| 93 | /** |
| 94 | * To specify a new initial working directory for the sub-process, |
| 95 | * specify it in the .dir member. |
| 96 | */ |
Alex Riesen | 1568fea | 2007-05-22 23:48:23 +0200 | [diff] [blame] | 97 | const char *dir; |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 98 | |
| 99 | /** |
| 100 | * To modify the environment of the sub-process, specify an array of |
| 101 | * string pointers (NULL terminated) in .env: |
| 102 | * |
| 103 | * - If the string is of the form "VAR=value", i.e. it contains '=' |
| 104 | * the variable is added to the child process's environment. |
| 105 | * |
| 106 | * - If the string does not contain '=', it names an environment |
| 107 | * variable that will be removed from the child process's environment. |
| 108 | * |
| 109 | * If the .env member is NULL, `start_command` will point it at the |
Jeff King | c972bf4 | 2020-07-28 16:25:12 -0400 | [diff] [blame] | 110 | * .env_array `strvec` (so you may use one or the other, but not both). |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 111 | * The memory in .env_array will be cleaned up automatically during |
| 112 | * `finish_command` (or during `start_command` when it is unsuccessful). |
| 113 | */ |
Alex Riesen | ee49314 | 2007-05-22 23:48:47 +0200 | [diff] [blame] | 114 | const char *const *env; |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 115 | |
Shawn O. Pearce | f100089 | 2007-03-10 03:28:00 -0500 | [diff] [blame] | 116 | unsigned no_stdin:1; |
Shawn O. Pearce | e4507ae | 2007-03-12 14:37:55 -0400 | [diff] [blame] | 117 | unsigned no_stdout:1; |
Shawn O. Pearce | b73a439 | 2007-11-11 02:29:37 -0500 | [diff] [blame] | 118 | unsigned no_stderr:1; |
Jeff King | 539052f | 2020-02-20 21:56:37 -0500 | [diff] [blame] | 119 | unsigned git_cmd:1; /* if this is to be git sub-command */ |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 120 | |
| 121 | /** |
| 122 | * If the program cannot be found, the functions return -1 and set |
| 123 | * errno to ENOENT. Normally, an error message is printed, but if |
| 124 | * .silent_exec_failure is set to 1, no message is printed for this |
| 125 | * special error condition. |
| 126 | */ |
Johannes Sixt | c024beb | 2009-07-04 21:26:42 +0200 | [diff] [blame] | 127 | unsigned silent_exec_failure:1; |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 128 | |
Jeff King | ee4e225 | 2021-01-22 16:03:33 -0500 | [diff] [blame] | 129 | /** |
| 130 | * Run the command from argv[0] using a shell (but note that we may |
| 131 | * still optimize out the shell call if the command contains no |
| 132 | * metacharacters). Note that further arguments to the command in |
| 133 | * argv[1], etc, do not need to be shell-quoted. |
| 134 | */ |
Jeff King | 8dba1e6 | 2009-12-30 05:53:16 -0500 | [diff] [blame] | 135 | unsigned use_shell:1; |
Jeff King | ee4e225 | 2021-01-22 16:03:33 -0500 | [diff] [blame] | 136 | |
| 137 | unsigned stdout_to_stderr:1; |
Jeff King | afe19ff | 2012-01-07 12:42:43 +0100 | [diff] [blame] | 138 | unsigned clean_on_exit:1; |
Jeff King | 46df690 | 2017-01-06 20:22:23 -0500 | [diff] [blame] | 139 | unsigned wait_after_clean:1; |
Lars Schneider | ac2fbaa | 2016-10-16 16:20:28 -0700 | [diff] [blame] | 140 | void (*clean_on_exit_handler)(struct child_process *process); |
| 141 | void *clean_on_exit_handler_cbdata; |
Shawn O. Pearce | f100089 | 2007-03-10 03:28:00 -0500 | [diff] [blame] | 142 | }; |
| 143 | |
Ævar Arnfjörð Bjarmason | 3d97ea4 | 2021-07-01 12:51:25 +0200 | [diff] [blame] | 144 | #define CHILD_PROCESS_INIT { \ |
| 145 | .args = STRVEC_INIT, \ |
| 146 | .env_array = STRVEC_INIT, \ |
| 147 | } |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 148 | |
| 149 | /** |
| 150 | * The functions: child_process_init, start_command, finish_command, |
| 151 | * run_command, run_command_v_opt, run_command_v_opt_cd_env, child_process_clear |
| 152 | * do the following: |
| 153 | * |
| 154 | * - If a system call failed, errno is set and -1 is returned. A diagnostic |
| 155 | * is printed. |
| 156 | * |
| 157 | * - If the program was not found, then -1 is returned and errno is set to |
| 158 | * ENOENT; a diagnostic is printed only if .silent_exec_failure is 0. |
| 159 | * |
| 160 | * - Otherwise, the program is run. If it terminates regularly, its exit |
| 161 | * code is returned. No diagnostic is printed, even if the exit code is |
| 162 | * non-zero. |
| 163 | * |
| 164 | * - If the program terminated due to a signal, then the return value is the |
| 165 | * signal number + 128, ie. the same value that a POSIX shell's $? would |
| 166 | * report. A diagnostic is printed. |
| 167 | * |
| 168 | */ |
| 169 | |
| 170 | /** |
| 171 | * Initialize a struct child_process variable. |
| 172 | */ |
René Scharfe | 483bbd4 | 2014-08-19 21:10:48 +0200 | [diff] [blame] | 173 | void child_process_init(struct child_process *); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 174 | |
| 175 | /** |
| 176 | * Release the memory associated with the struct child_process. |
| 177 | * Most users of the run-command API don't need to call this |
| 178 | * function explicitly because `start_command` invokes it on |
| 179 | * failure and `finish_command` calls it automatically already. |
| 180 | */ |
René Scharfe | 2d71608 | 2015-10-24 14:11:27 +0200 | [diff] [blame] | 181 | void child_process_clear(struct child_process *); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 182 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 183 | int is_executable(const char *name); |
René Scharfe | d318027 | 2014-08-19 21:09:35 +0200 | [diff] [blame] | 184 | |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 185 | /** |
| 186 | * Start a sub-process. Takes a pointer to a `struct child_process` |
| 187 | * that specifies the details and returns pipe FDs (if requested). |
| 188 | * See below for details. |
| 189 | */ |
Shawn O. Pearce | ebcb5d1 | 2007-03-10 03:28:05 -0500 | [diff] [blame] | 190 | int start_command(struct child_process *); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 191 | |
| 192 | /** |
| 193 | * Wait for the completion of a sub-process that was started with |
| 194 | * start_command(). |
| 195 | */ |
Shawn O. Pearce | ebcb5d1 | 2007-03-10 03:28:05 -0500 | [diff] [blame] | 196 | int finish_command(struct child_process *); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 197 | |
Takashi Iwai | 507d780 | 2015-09-04 11:35:57 +0200 | [diff] [blame] | 198 | int finish_command_in_signal(struct child_process *); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 199 | |
| 200 | /** |
| 201 | * A convenience function that encapsulates a sequence of |
| 202 | * start_command() followed by finish_command(). Takes a pointer |
| 203 | * to a `struct child_process` that specifies the details. |
| 204 | */ |
Shawn O. Pearce | f100089 | 2007-03-10 03:28:00 -0500 | [diff] [blame] | 205 | int run_command(struct child_process *); |
| 206 | |
Jeff King | 03f2c77 | 2015-08-10 05:37:45 -0400 | [diff] [blame] | 207 | /* |
| 208 | * Returns the path to the hook file, or NULL if the hook is missing |
| 209 | * or disabled. Note that this points to static storage that will be |
| 210 | * overwritten by further calls to find_hook and run_hook_*. |
| 211 | */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 212 | const char *find_hook(const char *name); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 213 | |
| 214 | /** |
| 215 | * Run a hook. |
| 216 | * The first argument is a pathname to an index file, or NULL |
| 217 | * if the hook uses the default index file or no index is needed. |
| 218 | * The second argument is the name of the hook. |
| 219 | * The further arguments correspond to the hook arguments. |
| 220 | * The last argument has to be NULL to terminate the arguments list. |
| 221 | * If the hook does not exist or is not executable, the return |
| 222 | * value will be zero. |
| 223 | * If it is executable, the hook will be executed and the exit |
| 224 | * status of the hook is returned. |
| 225 | * On execution, .stdout_to_stderr and .no_stdin will be set. |
| 226 | */ |
Ramsay Jones | 9fe3edc | 2013-07-18 21:02:12 +0100 | [diff] [blame] | 227 | LAST_ARG_MUST_BE_NULL |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 228 | int run_hook_le(const char *const *env, const char *name, ...); |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 229 | int run_hook_ve(const char *const *env, const char *name, va_list args); |
Benoit Pierre | 15048f8 | 2014-03-18 11:00:53 +0100 | [diff] [blame] | 230 | |
Junio C Hamano | 850b6ed | 2020-05-06 13:18:29 -0700 | [diff] [blame] | 231 | /* |
| 232 | * Trigger an auto-gc |
| 233 | */ |
Derrick Stolee | a95ce12 | 2020-09-17 18:11:44 +0000 | [diff] [blame] | 234 | int run_auto_maintenance(int quiet); |
Junio C Hamano | 850b6ed | 2020-05-06 13:18:29 -0700 | [diff] [blame] | 235 | |
Shawn O. Pearce | 95d3c4f | 2006-12-30 21:55:22 -0500 | [diff] [blame] | 236 | #define RUN_COMMAND_NO_STDIN 1 |
Michal Ostrowski | 77cb17e | 2006-01-10 21:12:17 -0500 | [diff] [blame] | 237 | #define RUN_GIT_CMD 2 /*If this is to be git sub-command */ |
Shawn O. Pearce | cd83c74 | 2006-12-30 21:55:19 -0500 | [diff] [blame] | 238 | #define RUN_COMMAND_STDOUT_TO_STDERR 4 |
Johannes Sixt | c024beb | 2009-07-04 21:26:42 +0200 | [diff] [blame] | 239 | #define RUN_SILENT_EXEC_FAILURE 8 |
Jeff King | 8dba1e6 | 2009-12-30 05:53:16 -0500 | [diff] [blame] | 240 | #define RUN_USING_SHELL 16 |
Clemens Buchacher | 10c6cdd | 2012-01-08 21:41:09 +0100 | [diff] [blame] | 241 | #define RUN_CLEAN_ON_EXIT 32 |
Trygve Aaberge | e662df7 | 2020-07-07 14:17:14 +0200 | [diff] [blame] | 242 | #define RUN_WAIT_AFTER_CLEAN 64 |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 243 | |
| 244 | /** |
| 245 | * Convenience functions that encapsulate a sequence of |
| 246 | * start_command() followed by finish_command(). The argument argv |
| 247 | * specifies the program and its arguments. The argument opt is zero |
| 248 | * or more of the flags `RUN_COMMAND_NO_STDIN`, `RUN_GIT_CMD`, |
| 249 | * `RUN_COMMAND_STDOUT_TO_STDERR`, or `RUN_SILENT_EXEC_FAILURE` |
| 250 | * that correspond to the members .no_stdin, .git_cmd, |
| 251 | * .stdout_to_stderr, .silent_exec_failure of `struct child_process`. |
| 252 | * The argument dir corresponds the member .dir. The argument env |
| 253 | * corresponds to the member .env. |
| 254 | */ |
Shawn O. Pearce | 9b0b509 | 2006-12-30 21:55:15 -0500 | [diff] [blame] | 255 | int run_command_v_opt(const char **argv, int opt); |
Jeff Hostetler | ee4512e | 2019-02-22 14:25:01 -0800 | [diff] [blame] | 256 | int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class); |
Alex Riesen | 3427b37 | 2007-05-23 22:21:39 +0200 | [diff] [blame] | 257 | /* |
| 258 | * env (the environment) is to be formatted like environ: "VAR=VALUE". |
| 259 | * To unset an environment variable use just "VAR". |
| 260 | */ |
Alex Riesen | ee49314 | 2007-05-22 23:48:47 +0200 | [diff] [blame] | 261 | int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env); |
Jeff Hostetler | ee4512e | 2019-02-22 14:25:01 -0800 | [diff] [blame] | 262 | int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir, |
| 263 | const char *const *env, const char *tr2_class); |
Josef Weidendorfer | b1bf95b | 2005-07-31 21:17:43 +0200 | [diff] [blame] | 264 | |
Jeff King | 911ec99 | 2015-03-22 23:53:43 -0400 | [diff] [blame] | 265 | /** |
Jeff King | 96335bc | 2016-06-17 19:38:47 -0400 | [diff] [blame] | 266 | * Execute the given command, sending "in" to its stdin, and capturing its |
| 267 | * stdout and stderr in the "out" and "err" strbufs. Any of the three may |
| 268 | * be NULL to skip processing. |
| 269 | * |
Jeff King | 911ec99 | 2015-03-22 23:53:43 -0400 | [diff] [blame] | 270 | * Returns -1 if starting the command fails or reading fails, and otherwise |
Jeff King | 96335bc | 2016-06-17 19:38:47 -0400 | [diff] [blame] | 271 | * returns the exit code of the command. Any output collected in the |
| 272 | * buffers is kept even if the command returns a non-zero exit. The hint fields |
| 273 | * gives starting sizes for the strbuf allocations. |
Jeff King | 911ec99 | 2015-03-22 23:53:43 -0400 | [diff] [blame] | 274 | * |
| 275 | * The fields of "cmd" should be set up as they would for a normal run_command |
Jeff King | 96335bc | 2016-06-17 19:38:47 -0400 | [diff] [blame] | 276 | * invocation. But note that there is no need to set the in, out, or err |
| 277 | * fields; pipe_command handles that automatically. |
Jeff King | 911ec99 | 2015-03-22 23:53:43 -0400 | [diff] [blame] | 278 | */ |
Jeff King | 96335bc | 2016-06-17 19:38:47 -0400 | [diff] [blame] | 279 | int pipe_command(struct child_process *cmd, |
| 280 | const char *in, size_t in_len, |
| 281 | struct strbuf *out, size_t out_hint, |
| 282 | struct strbuf *err, size_t err_hint); |
| 283 | |
| 284 | /** |
| 285 | * Convenience wrapper around pipe_command for the common case |
| 286 | * of capturing only stdout. |
| 287 | */ |
| 288 | static inline int capture_command(struct child_process *cmd, |
| 289 | struct strbuf *out, |
| 290 | size_t hint) |
| 291 | { |
| 292 | return pipe_command(cmd, NULL, 0, out, hint, NULL, 0); |
| 293 | } |
Jeff King | 911ec99 | 2015-03-22 23:53:43 -0400 | [diff] [blame] | 294 | |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 295 | /* |
| 296 | * The purpose of the following functions is to feed a pipe by running |
| 297 | * a function asynchronously and providing output that the caller reads. |
| 298 | * |
| 299 | * It is expected that no synchronization and mutual exclusion between |
| 300 | * the caller and the feed function is necessary so that the function |
| 301 | * can run in a thread without interfering with the caller. |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 302 | * |
| 303 | * The caller: |
| 304 | * |
| 305 | * 1. allocates and clears (memset(&asy, 0, sizeof(asy));) a |
| 306 | * struct async variable; |
| 307 | * 2. initializes .proc and .data; |
| 308 | * 3. calls start_async(); |
| 309 | * 4. processes communicates with proc through .in and .out; |
| 310 | * 5. closes .in and .out; |
| 311 | * 6. calls finish_async(). |
| 312 | * |
| 313 | * There are serious restrictions on what the asynchronous function can do |
| 314 | * because this facility is implemented by a thread in the same address |
| 315 | * space on most platforms (when pthreads is available), but by a pipe to |
| 316 | * a forked process otherwise: |
| 317 | * |
| 318 | * - It cannot change the program's state (global variables, environment, |
| 319 | * etc.) in a way that the caller notices; in other words, .in and .out |
| 320 | * are the only communication channels to the caller. |
| 321 | * |
| 322 | * - It must not change the program's state that the caller of the |
| 323 | * facility also uses. |
| 324 | * |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 325 | */ |
| 326 | struct async { |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 327 | |
| 328 | /** |
| 329 | * The function pointer in .proc has the following signature: |
| 330 | * |
| 331 | * int proc(int in, int out, void *data); |
| 332 | * |
| 333 | * - in, out specifies a set of file descriptors to which the function |
| 334 | * must read/write the data that it needs/produces. The function |
| 335 | * *must* close these descriptors before it returns. A descriptor |
| 336 | * may be -1 if the caller did not configure a descriptor for that |
| 337 | * direction. |
| 338 | * |
| 339 | * - data is the value that the caller has specified in the .data member |
| 340 | * of struct async. |
| 341 | * |
| 342 | * - The return value of the function is 0 on success and non-zero |
| 343 | * on failure. If the function indicates failure, finish_async() will |
| 344 | * report failure as well. |
| 345 | * |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 346 | */ |
Erik Faye-Lund | ae6a560 | 2010-02-05 12:57:38 -0800 | [diff] [blame] | 347 | int (*proc)(int in, int out, void *data); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 348 | |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 349 | void *data; |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 350 | |
| 351 | /** |
| 352 | * The members .in, .out are used to provide a set of fd's for |
| 353 | * communication between the caller and the callee as follows: |
| 354 | * |
| 355 | * - Specify 0 to have no file descriptor passed. The callee will |
| 356 | * receive -1 in the corresponding argument. |
| 357 | * |
| 358 | * - Specify < 0 to have a pipe allocated; start_async() replaces |
| 359 | * with the pipe FD in the following way: |
| 360 | * |
| 361 | * .in: Returns the writable pipe end into which the caller |
| 362 | * writes; the readable end of the pipe becomes the function's |
| 363 | * in argument. |
| 364 | * |
| 365 | * .out: Returns the readable pipe end from which the caller |
| 366 | * reads; the writable end of the pipe becomes the function's |
| 367 | * out argument. |
| 368 | * |
| 369 | * The caller of start_async() must close the returned FDs after it |
| 370 | * has completed reading from/writing from them. |
| 371 | * |
| 372 | * - Specify a file descriptor > 0 to be used by the function: |
| 373 | * |
| 374 | * .in: The FD must be readable; it becomes the function's in. |
| 375 | * .out: The FD must be writable; it becomes the function's out. |
| 376 | * |
| 377 | * The specified FD is closed by start_async(), even if it fails to |
| 378 | * run the function. |
| 379 | */ |
Erik Faye-Lund | ae6a560 | 2010-02-05 12:57:38 -0800 | [diff] [blame] | 380 | int in; /* caller writes here and closes it */ |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 381 | int out; /* caller reads from here and closes it */ |
Johannes Sixt | f6b6098 | 2010-03-09 21:00:36 +0100 | [diff] [blame] | 382 | #ifdef NO_PTHREADS |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 383 | pid_t pid; |
Johannes Sixt | 618ebe9 | 2007-12-08 22:19:14 +0100 | [diff] [blame] | 384 | #else |
Johannes Sixt | 200a76b | 2010-03-06 16:40:42 +0100 | [diff] [blame] | 385 | pthread_t tid; |
Erik Faye-Lund | ae6a560 | 2010-02-05 12:57:38 -0800 | [diff] [blame] | 386 | int proc_in; |
| 387 | int proc_out; |
Johannes Sixt | 618ebe9 | 2007-12-08 22:19:14 +0100 | [diff] [blame] | 388 | #endif |
Jeff King | c792d7b | 2016-04-19 18:49:41 -0400 | [diff] [blame] | 389 | int isolate_sigpipe; |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 390 | }; |
| 391 | |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 392 | /** |
| 393 | * Run a function asynchronously. Takes a pointer to a `struct |
| 394 | * async` that specifies the details and returns a set of pipe FDs |
| 395 | * for communication with the function. See below for details. |
| 396 | */ |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 397 | int start_async(struct async *async); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 398 | |
| 399 | /** |
| 400 | * Wait for the completion of an asynchronous function that was |
| 401 | * started with start_async(). |
| 402 | */ |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 403 | int finish_async(struct async *async); |
Heba Waly | 4c4066d | 2019-11-17 21:04:55 +0000 | [diff] [blame] | 404 | |
Jeff King | 661a8cf | 2015-09-01 16:22:43 -0400 | [diff] [blame] | 405 | int in_async(void); |
Nguyễn Thái Ngọc Duy | c0e40a2 | 2018-11-03 09:48:39 +0100 | [diff] [blame] | 406 | int async_with_fork(void); |
Lars Schneider | b992fe1 | 2016-10-16 16:20:27 -0700 | [diff] [blame] | 407 | void check_pipe(int err); |
Johannes Sixt | 2d22c20 | 2007-10-19 21:48:00 +0200 | [diff] [blame] | 408 | |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 409 | /** |
| 410 | * This callback should initialize the child process and preload the |
| 411 | * error channel if desired. The preloading of is useful if you want to |
| 412 | * have a message printed directly before the output of the child process. |
| 413 | * pp_cb is the callback cookie as passed to run_processes_parallel. |
| 414 | * You can store a child process specific callback cookie in pp_task_cb. |
| 415 | * |
| 416 | * Even after returning 0 to indicate that there are no more processes, |
| 417 | * this function will be called again until there are no more running |
| 418 | * child processes. |
| 419 | * |
| 420 | * Return 1 if the next child is ready to run. |
| 421 | * Return 0 if there are currently no more tasks to be processed. |
| 422 | * To send a signal to other child processes for abortion, |
| 423 | * return the negative signal number. |
| 424 | */ |
| 425 | typedef int (*get_next_task_fn)(struct child_process *cp, |
Stefan Beller | aa71049 | 2016-02-29 18:07:16 -0800 | [diff] [blame] | 426 | struct strbuf *out, |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 427 | void *pp_cb, |
| 428 | void **pp_task_cb); |
| 429 | |
| 430 | /** |
| 431 | * This callback is called whenever there are problems starting |
| 432 | * a new process. |
| 433 | * |
| 434 | * You must not write to stdout or stderr in this function. Add your |
Stefan Beller | aa71049 | 2016-02-29 18:07:16 -0800 | [diff] [blame] | 435 | * message to the strbuf out instead, which will be printed without |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 436 | * messing up the output of the other parallel processes. |
| 437 | * |
| 438 | * pp_cb is the callback cookie as passed into run_processes_parallel, |
| 439 | * pp_task_cb is the callback cookie as passed into get_next_task_fn. |
| 440 | * |
| 441 | * Return 0 to continue the parallel processing. To abort return non zero. |
| 442 | * To send a signal to other child processes for abortion, return |
| 443 | * the negative signal number. |
| 444 | */ |
Stefan Beller | aa71049 | 2016-02-29 18:07:16 -0800 | [diff] [blame] | 445 | typedef int (*start_failure_fn)(struct strbuf *out, |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 446 | void *pp_cb, |
| 447 | void *pp_task_cb); |
| 448 | |
| 449 | /** |
| 450 | * This callback is called on every child process that finished processing. |
| 451 | * |
| 452 | * You must not write to stdout or stderr in this function. Add your |
Stefan Beller | aa71049 | 2016-02-29 18:07:16 -0800 | [diff] [blame] | 453 | * message to the strbuf out instead, which will be printed without |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 454 | * messing up the output of the other parallel processes. |
| 455 | * |
| 456 | * pp_cb is the callback cookie as passed into run_processes_parallel, |
| 457 | * pp_task_cb is the callback cookie as passed into get_next_task_fn. |
| 458 | * |
| 459 | * Return 0 to continue the parallel processing. To abort return non zero. |
| 460 | * To send a signal to other child processes for abortion, return |
| 461 | * the negative signal number. |
| 462 | */ |
| 463 | typedef int (*task_finished_fn)(int result, |
Stefan Beller | aa71049 | 2016-02-29 18:07:16 -0800 | [diff] [blame] | 464 | struct strbuf *out, |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 465 | void *pp_cb, |
| 466 | void *pp_task_cb); |
| 467 | |
| 468 | /** |
| 469 | * Runs up to n processes at the same time. Whenever a process can be |
| 470 | * started, the callback get_next_task_fn is called to obtain the data |
| 471 | * required to start another child process. |
| 472 | * |
| 473 | * The children started via this function run in parallel. Their output |
| 474 | * (both stdout and stderr) is routed to stderr in a manner that output |
| 475 | * from different tasks does not interleave. |
| 476 | * |
Stefan Beller | 2a73b3d | 2016-02-29 13:57:06 -0800 | [diff] [blame] | 477 | * start_failure_fn and task_finished_fn can be NULL to omit any |
| 478 | * special handling. |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 479 | */ |
| 480 | int run_processes_parallel(int n, |
| 481 | get_next_task_fn, |
| 482 | start_failure_fn, |
| 483 | task_finished_fn, |
| 484 | void *pp_cb); |
Jeff Hostetler | ee4512e | 2019-02-22 14:25:01 -0800 | [diff] [blame] | 485 | int run_processes_parallel_tr2(int n, get_next_task_fn, start_failure_fn, |
| 486 | task_finished_fn, void *pp_cb, |
| 487 | const char *tr2_category, const char *tr2_label); |
Stefan Beller | c553c72 | 2015-12-15 16:04:10 -0800 | [diff] [blame] | 488 | |
Jonathan Tan | d1fa943 | 2021-06-17 10:13:25 -0700 | [diff] [blame] | 489 | /** |
| 490 | * Convenience function which prepares env_array for a command to be run in a |
| 491 | * new repo. This adds all GIT_* environment variables to env_array with the |
| 492 | * exception of GIT_CONFIG_PARAMETERS and GIT_CONFIG_COUNT (which cause the |
| 493 | * corresponding environment variables to be unset in the subprocess) and adds |
| 494 | * an environment variable pointing to new_git_dir. See local_repo_env in |
| 495 | * cache.h for more information. |
| 496 | */ |
| 497 | void prepare_other_repo_env(struct strvec *env_array, const char *new_git_dir); |
| 498 | |
Josef Weidendorfer | b1bf95b | 2005-07-31 21:17:43 +0200 | [diff] [blame] | 499 | #endif |