Line | Count | Source |
1 | | #ifndef RUN_COMMAND_H |
2 | | #define RUN_COMMAND_H |
3 | | |
4 | | #include "thread-utils.h" |
5 | | |
6 | | #include "strvec.h" |
7 | | |
8 | | struct repository; |
9 | | |
10 | | /** |
11 | | * The run-command API offers a versatile tool to run sub-processes with |
12 | | * redirected input and output as well as with a modified environment |
13 | | * and an alternate current directory. |
14 | | * |
15 | | * A similar API offers the capability to run a function asynchronously, |
16 | | * which is primarily used to capture the output that the function |
17 | | * produces in the caller in order to process it. |
18 | | */ |
19 | | |
20 | | |
21 | | /** |
22 | | * This describes the arguments, redirections, and environment of a |
23 | | * command to run in a sub-process. |
24 | | * |
25 | | * The caller: |
26 | | * |
27 | | * 1. allocates and clears (using child_process_init() or |
28 | | * CHILD_PROCESS_INIT) a struct child_process variable; |
29 | | * 2. initializes the members; |
30 | | * 3. calls start_command(); |
31 | | * 4. processes the data; |
32 | | * 5. closes file descriptors (if necessary; see below); |
33 | | * 6. calls finish_command(). |
34 | | * |
35 | | * Special forms of redirection are available by setting these members |
36 | | * to 1: |
37 | | * |
38 | | * .no_stdin, .no_stdout, .no_stderr: The respective channel is |
39 | | * redirected to /dev/null. |
40 | | * |
41 | | * .stdout_to_stderr: stdout of the child is redirected to its |
42 | | * stderr. This happens after stderr is itself redirected. |
43 | | * So stdout will follow stderr to wherever it is |
44 | | * redirected. |
45 | | */ |
46 | | struct child_process { |
47 | | |
48 | | /** |
49 | | * The .args is a `struct strvec', use that API to manipulate |
50 | | * it, e.g. strvec_pushv() to add an existing "const char **" |
51 | | * vector. |
52 | | * |
53 | | * If the command to run is a git command, set the first |
54 | | * element in the strvec to the command name without the |
55 | | * 'git-' prefix and set .git_cmd = 1. |
56 | | * |
57 | | * The memory in .args will be cleaned up automatically during |
58 | | * `finish_command` (or during `start_command` when it is unsuccessful). |
59 | | */ |
60 | | struct strvec args; |
61 | | |
62 | | /** |
63 | | * Like .args the .env is a `struct strvec'. |
64 | | * |
65 | | * To modify the environment of the sub-process, specify an array of |
66 | | * environment settings. Each string in the array manipulates the |
67 | | * environment. |
68 | | * |
69 | | * - If the string is of the form "VAR=value", i.e. it contains '=' |
70 | | * the variable is added to the child process's environment. |
71 | | * |
72 | | * - If the string does not contain '=', it names an environment |
73 | | * variable that will be removed from the child process's environment. |
74 | | * |
75 | | * The memory in .env will be cleaned up automatically during |
76 | | * `finish_command` (or during `start_command` when it is unsuccessful). |
77 | | */ |
78 | | struct strvec env; |
79 | | pid_t pid; |
80 | | |
81 | | int trace2_child_id; |
82 | | uint64_t trace2_child_us_start; |
83 | | const char *trace2_child_class; |
84 | | const char *trace2_hook_name; |
85 | | |
86 | | /* |
87 | | * Using .in, .out, .err: |
88 | | * - Specify 0 for no redirections. No new file descriptor is allocated. |
89 | | * (child inherits stdin, stdout, stderr from parent). |
90 | | * - Specify -1 to have a pipe allocated as follows: |
91 | | * .in: returns the writable pipe end; parent writes to it, |
92 | | * the readable pipe end becomes child's stdin |
93 | | * .out, .err: returns the readable pipe end; parent reads from |
94 | | * it, the writable pipe end becomes child's stdout/stderr |
95 | | * The caller of start_command() must close the returned FDs |
96 | | * after it has completed reading from/writing to it! |
97 | | * - Specify > 0 to set a channel to a particular FD as follows: |
98 | | * .in: a readable FD, becomes child's stdin |
99 | | * .out: a writable FD, becomes child's stdout/stderr |
100 | | * .err: a writable FD, becomes child's stderr |
101 | | * The specified FD is closed by start_command(), even in case |
102 | | * of errors! |
103 | | */ |
104 | | int in; |
105 | | int out; |
106 | | int err; |
107 | | |
108 | | /** |
109 | | * To specify a new initial working directory for the sub-process, |
110 | | * specify it in the .dir member. |
111 | | */ |
112 | | const char *dir; |
113 | | |
114 | | unsigned no_stdin:1; |
115 | | unsigned no_stdout:1; |
116 | | unsigned no_stderr:1; |
117 | | unsigned git_cmd:1; /* if this is to be git sub-command */ |
118 | | |
119 | | /** |
120 | | * If the program cannot be found, the functions return -1 and set |
121 | | * errno to ENOENT. Normally, an error message is printed, but if |
122 | | * .silent_exec_failure is set to 1, no message is printed for this |
123 | | * special error condition. |
124 | | */ |
125 | | unsigned silent_exec_failure:1; |
126 | | |
127 | | /** |
128 | | * Run the command from argv[0] using a shell (but note that we may |
129 | | * still optimize out the shell call if the command contains no |
130 | | * metacharacters). Note that further arguments to the command in |
131 | | * argv[1], etc, do not need to be shell-quoted. |
132 | | */ |
133 | | unsigned use_shell:1; |
134 | | |
135 | | /** |
136 | | * Release any open file handles to the object store before running |
137 | | * the command; This is necessary e.g. when the spawned process may |
138 | | * want to repack because that would delete `.pack` files (and on |
139 | | * Windows, you cannot delete files that are still in use). |
140 | | */ |
141 | | struct object_database *odb_to_close; |
142 | | |
143 | | unsigned stdout_to_stderr:1; |
144 | | unsigned clean_on_exit:1; |
145 | | unsigned wait_after_clean:1; |
146 | | void (*clean_on_exit_handler)(struct child_process *process); |
147 | | }; |
148 | | |
149 | 0 | #define CHILD_PROCESS_INIT { \ |
150 | 0 | .args = STRVEC_INIT, \ |
151 | 0 | .env = STRVEC_INIT, \ |
152 | 0 | } |
153 | | |
154 | | /** |
155 | | * The functions: start_command, finish_command, run_command do the following: |
156 | | * |
157 | | * - If a system call failed, errno is set and -1 is returned. A diagnostic |
158 | | * is printed. |
159 | | * |
160 | | * - If the program was not found, then -1 is returned and errno is set to |
161 | | * ENOENT; a diagnostic is printed only if .silent_exec_failure is 0. |
162 | | * |
163 | | * - Otherwise, the program is run. If it terminates regularly, its exit |
164 | | * code is returned. No diagnostic is printed, even if the exit code is |
165 | | * non-zero. |
166 | | * |
167 | | * - If the program terminated due to a signal, then the return value is the |
168 | | * signal number + 128, ie. the same value that a POSIX shell's $? would |
169 | | * report. A diagnostic is printed. |
170 | | * |
171 | | */ |
172 | | |
173 | | /** |
174 | | * Initialize a struct child_process variable. |
175 | | */ |
176 | | void child_process_init(struct child_process *); |
177 | | |
178 | | /** |
179 | | * Release the memory associated with the struct child_process. |
180 | | * Most users of the run-command API don't need to call this |
181 | | * function explicitly because `start_command` invokes it on |
182 | | * failure and `finish_command` calls it automatically already. |
183 | | */ |
184 | | void child_process_clear(struct child_process *); |
185 | | |
186 | | int is_executable(const char *name); |
187 | | |
188 | | /** |
189 | | * Check if the command exists on $PATH. This emulates the path search that |
190 | | * execvp would perform, without actually executing the command so it |
191 | | * can be used before fork() to prepare to run a command using |
192 | | * execve() or after execvp() to diagnose why it failed. |
193 | | * |
194 | | * The caller should ensure that command contains no directory separators. |
195 | | * |
196 | | * Returns 1 if it is found in $PATH or 0 if the command could not be found. |
197 | | */ |
198 | | int exists_in_PATH(const char *command); |
199 | | |
200 | | /** |
201 | | * Return the path that is used to execute Unix shell command-lines. |
202 | | */ |
203 | | char *git_shell_path(void); |
204 | | |
205 | | /** |
206 | | * Start a sub-process. Takes a pointer to a `struct child_process` |
207 | | * that specifies the details and returns pipe FDs (if requested). |
208 | | * See below for details. |
209 | | */ |
210 | | int start_command(struct child_process *); |
211 | | |
212 | | /** |
213 | | * Wait for the completion of a sub-process that was started with |
214 | | * start_command(). |
215 | | */ |
216 | | int finish_command(struct child_process *); |
217 | | |
218 | | int finish_command_in_signal(struct child_process *); |
219 | | |
220 | | /** |
221 | | * A convenience function that encapsulates a sequence of |
222 | | * start_command() followed by finish_command(). Takes a pointer |
223 | | * to a `struct child_process` that specifies the details. |
224 | | */ |
225 | | int run_command(struct child_process *); |
226 | | |
227 | | /* |
228 | | * Prepare a `struct child_process` to run auto-maintenance. Returns 1 if the |
229 | | * process has been prepared and is ready to run, or 0 in case auto-maintenance |
230 | | * should be skipped. |
231 | | */ |
232 | | int prepare_auto_maintenance(struct repository *r, int quiet, |
233 | | struct child_process *maint); |
234 | | |
235 | | /* |
236 | | * Trigger an auto-gc |
237 | | */ |
238 | | int run_auto_maintenance(struct repository *r, int quiet); |
239 | | |
240 | | /** |
241 | | * Execute the given command, sending "in" to its stdin, and capturing its |
242 | | * stdout and stderr in the "out" and "err" strbufs. Any of the three may |
243 | | * be NULL to skip processing. |
244 | | * |
245 | | * Returns -1 if starting the command fails or reading fails, and otherwise |
246 | | * returns the exit code of the command. Any output collected in the |
247 | | * buffers is kept even if the command returns a non-zero exit. The hint fields |
248 | | * gives starting sizes for the strbuf allocations. |
249 | | * |
250 | | * The fields of "cmd" should be set up as they would for a normal run_command |
251 | | * invocation. But note that there is no need to set the in, out, or err |
252 | | * fields; pipe_command handles that automatically. |
253 | | */ |
254 | | int pipe_command(struct child_process *cmd, |
255 | | const char *in, size_t in_len, |
256 | | struct strbuf *out, size_t out_hint, |
257 | | struct strbuf *err, size_t err_hint); |
258 | | |
259 | | /** |
260 | | * Convenience wrapper around pipe_command for the common case |
261 | | * of capturing only stdout. |
262 | | */ |
263 | | static inline int capture_command(struct child_process *cmd, |
264 | | struct strbuf *out, |
265 | | size_t hint) |
266 | 0 | { |
267 | 0 | return pipe_command(cmd, NULL, 0, out, hint, NULL, 0); |
268 | 0 | } Unexecuted instantiation: exec-cmd.c:capture_command Unexecuted instantiation: fsmonitor.c:capture_command Unexecuted instantiation: fsmonitor-ipc.c:capture_command Unexecuted instantiation: odb.c:capture_command Unexecuted instantiation: pager.c:capture_command Unexecuted instantiation: pretty.c:capture_command Unexecuted instantiation: promisor-remote.c:capture_command Unexecuted instantiation: read-cache.c:capture_command Unexecuted instantiation: refs.c:capture_command Unexecuted instantiation: remote.c:capture_command Unexecuted instantiation: repository.c:capture_command Unexecuted instantiation: run-command.c:capture_command Unexecuted instantiation: submodule.c:capture_command Unexecuted instantiation: trace2.c:capture_command Unexecuted instantiation: tr2_tgt_event.c:capture_command Unexecuted instantiation: tr2_tgt_normal.c:capture_command Unexecuted instantiation: tr2_tgt_perf.c:capture_command Unexecuted instantiation: trailer.c:capture_command Unexecuted instantiation: transport.c:capture_command Unexecuted instantiation: write-or-die.c:capture_command Unexecuted instantiation: wt-status.c:capture_command Unexecuted instantiation: bisect.c:capture_command Unexecuted instantiation: branch.c:capture_command Unexecuted instantiation: bundle-uri.c:capture_command Unexecuted instantiation: bundle.c:capture_command Unexecuted instantiation: column.c:capture_command Unexecuted instantiation: commit.c:capture_command Unexecuted instantiation: connect.c:capture_command Unexecuted instantiation: connected.c:capture_command Unexecuted instantiation: convert.c:capture_command Unexecuted instantiation: diff.c:capture_command Unexecuted instantiation: editor.c:capture_command Unexecuted instantiation: fetch-pack.c:capture_command Unexecuted instantiation: gpg-interface.c:capture_command Unexecuted instantiation: hook.c:capture_command Unexecuted instantiation: merge-ll.c:capture_command Unexecuted instantiation: pkt-line.c:capture_command Unexecuted instantiation: range-diff.c:capture_command Unexecuted instantiation: send-pack.c:capture_command Unexecuted instantiation: sequencer.c:capture_command Unexecuted instantiation: sub-process.c:capture_command Unexecuted instantiation: transport-helper.c:capture_command Unexecuted instantiation: merge.c:capture_command Unexecuted instantiation: parallel-checkout.c:capture_command Unexecuted instantiation: reset.c:capture_command |
269 | | |
270 | | /* |
271 | | * The purpose of the following functions is to feed a pipe by running |
272 | | * a function asynchronously and providing output that the caller reads. |
273 | | * |
274 | | * It is expected that no synchronization and mutual exclusion between |
275 | | * the caller and the feed function is necessary so that the function |
276 | | * can run in a thread without interfering with the caller. |
277 | | * |
278 | | * The caller: |
279 | | * |
280 | | * 1. allocates and clears (memset(&asy, 0, sizeof(asy));) a |
281 | | * struct async variable; |
282 | | * 2. initializes .proc and .data; |
283 | | * 3. calls start_async(); |
284 | | * 4. processes communicates with proc through .in and .out; |
285 | | * 5. closes .in and .out; |
286 | | * 6. calls finish_async(). |
287 | | * |
288 | | * There are serious restrictions on what the asynchronous function can do |
289 | | * because this facility is implemented by a thread in the same address |
290 | | * space on most platforms (when pthreads is available), but by a pipe to |
291 | | * a forked process otherwise: |
292 | | * |
293 | | * - It cannot change the program's state (global variables, environment, |
294 | | * etc.) in a way that the caller notices; in other words, .in and .out |
295 | | * are the only communication channels to the caller. |
296 | | * |
297 | | * - It must not change the program's state that the caller of the |
298 | | * facility also uses. |
299 | | * |
300 | | */ |
301 | | struct async { |
302 | | |
303 | | /** |
304 | | * The function pointer in .proc has the following signature: |
305 | | * |
306 | | * int proc(int in, int out, void *data); |
307 | | * |
308 | | * - in, out specifies a set of file descriptors to which the function |
309 | | * must read/write the data that it needs/produces. The function |
310 | | * *must* close these descriptors before it returns. A descriptor |
311 | | * may be -1 if the caller did not configure a descriptor for that |
312 | | * direction. |
313 | | * |
314 | | * - data is the value that the caller has specified in the .data member |
315 | | * of struct async. |
316 | | * |
317 | | * - The return value of the function is 0 on success and non-zero |
318 | | * on failure. If the function indicates failure, finish_async() will |
319 | | * report failure as well. |
320 | | * |
321 | | */ |
322 | | int (*proc)(int in, int out, void *data); |
323 | | |
324 | | void *data; |
325 | | |
326 | | /** |
327 | | * The members .in, .out are used to provide a set of fd's for |
328 | | * communication between the caller and the callee as follows: |
329 | | * |
330 | | * - Specify 0 to have no file descriptor passed. The callee will |
331 | | * receive -1 in the corresponding argument. |
332 | | * |
333 | | * - Specify < 0 to have a pipe allocated; start_async() replaces |
334 | | * with the pipe FD in the following way: |
335 | | * |
336 | | * .in: Returns the writable pipe end into which the caller |
337 | | * writes; the readable end of the pipe becomes the function's |
338 | | * in argument. |
339 | | * |
340 | | * .out: Returns the readable pipe end from which the caller |
341 | | * reads; the writable end of the pipe becomes the function's |
342 | | * out argument. |
343 | | * |
344 | | * The caller of start_async() must close the returned FDs after it |
345 | | * has completed reading from/writing from them. |
346 | | * |
347 | | * - Specify a file descriptor > 0 to be used by the function: |
348 | | * |
349 | | * .in: The FD must be readable; it becomes the function's in. |
350 | | * .out: The FD must be writable; it becomes the function's out. |
351 | | * |
352 | | * The specified FD is closed by start_async(), even if it fails to |
353 | | * run the function. |
354 | | */ |
355 | | int in; /* caller writes here and closes it */ |
356 | | int out; /* caller reads from here and closes it */ |
357 | | #ifdef NO_PTHREADS |
358 | | pid_t pid; |
359 | | #else |
360 | | pthread_t tid; |
361 | | int proc_in; |
362 | | int proc_out; |
363 | | #endif |
364 | | int isolate_sigpipe; |
365 | | }; |
366 | | |
367 | | /** |
368 | | * Run a function asynchronously. Takes a pointer to a `struct |
369 | | * async` that specifies the details and returns a set of pipe FDs |
370 | | * for communication with the function. See below for details. |
371 | | */ |
372 | | int start_async(struct async *async); |
373 | | |
374 | | /** |
375 | | * Wait for the completion of an asynchronous function that was |
376 | | * started with start_async(). |
377 | | */ |
378 | | int finish_async(struct async *async); |
379 | | |
380 | | int in_async(void); |
381 | | int async_with_fork(void); |
382 | | void check_pipe(int err); |
383 | | |
384 | | /** |
385 | | * This callback should initialize the child process and preload the |
386 | | * error channel if desired. The preloading of is useful if you want to |
387 | | * have a message printed directly before the output of the child process. |
388 | | * pp_cb is the callback cookie as passed to run_processes_parallel. |
389 | | * You can store a child process specific callback cookie in pp_task_cb. |
390 | | * |
391 | | * See run_processes_parallel() below for a discussion of the "struct |
392 | | * strbuf *out" parameter. |
393 | | * |
394 | | * Even after returning 0 to indicate that there are no more processes, |
395 | | * this function will be called again until there are no more running |
396 | | * child processes. |
397 | | * |
398 | | * Return 1 if the next child is ready to run. |
399 | | * Return 0 if there are currently no more tasks to be processed. |
400 | | * To send a signal to other child processes for abortion, |
401 | | * return the negative signal number. |
402 | | */ |
403 | | typedef int (*get_next_task_fn)(struct child_process *cp, |
404 | | struct strbuf *out, |
405 | | void *pp_cb, |
406 | | void **pp_task_cb); |
407 | | |
408 | | /** |
409 | | * This callback is called whenever there are problems starting |
410 | | * a new process. |
411 | | * |
412 | | * See run_processes_parallel() below for a discussion of the "struct |
413 | | * strbuf *out" parameter. |
414 | | * |
415 | | * pp_cb is the callback cookie as passed into run_processes_parallel, |
416 | | * pp_task_cb is the callback cookie as passed into get_next_task_fn. |
417 | | * |
418 | | * Return 0 to continue the parallel processing. To abort return non zero. |
419 | | * To send a signal to other child processes for abortion, return |
420 | | * the negative signal number. |
421 | | */ |
422 | | typedef int (*start_failure_fn)(struct strbuf *out, |
423 | | void *pp_cb, |
424 | | void *pp_task_cb); |
425 | | |
426 | | /** |
427 | | * This callback is repeatedly called on every child process who requests |
428 | | * start_command() to create a pipe by setting child_process.in < 0. |
429 | | * |
430 | | * pp_cb is the callback cookie as passed into run_processes_parallel, and |
431 | | * pp_task_cb is the callback cookie as passed into get_next_task_fn. |
432 | | * |
433 | | * Returns < 0 for error |
434 | | * Returns == 0 when there is more data to be fed (will be called again) |
435 | | * Returns > 0 when finished (child closed fd or no more data to be fed) |
436 | | */ |
437 | | typedef int (*feed_pipe_fn)(int child_in, |
438 | | void *pp_cb, |
439 | | void *pp_task_cb); |
440 | | |
441 | | /** |
442 | | * This callback is called on every child process that finished processing. |
443 | | * |
444 | | * See run_processes_parallel() below for a discussion of the "struct |
445 | | * strbuf *out" parameter. |
446 | | * |
447 | | * pp_cb is the callback cookie as passed into run_processes_parallel, |
448 | | * pp_task_cb is the callback cookie as passed into get_next_task_fn. |
449 | | * |
450 | | * Return 0 to continue the parallel processing. To abort return non zero. |
451 | | * To send a signal to other child processes for abortion, return |
452 | | * the negative signal number. |
453 | | */ |
454 | | typedef int (*task_finished_fn)(int result, |
455 | | struct strbuf *out, |
456 | | void *pp_cb, |
457 | | void *pp_task_cb); |
458 | | |
459 | | /** |
460 | | * Option used by run_processes_parallel(), { 0 }-initialized means no |
461 | | * options. |
462 | | */ |
463 | | struct run_process_parallel_opts |
464 | | { |
465 | | /** |
466 | | * tr2_category & tr2_label: sets the trace2 category and label for |
467 | | * logging. These must either be unset, or both of them must be set. |
468 | | */ |
469 | | const char *tr2_category; |
470 | | const char *tr2_label; |
471 | | |
472 | | /** |
473 | | * processes: see 'processes' in run_processes_parallel() below. |
474 | | */ |
475 | | size_t processes; |
476 | | |
477 | | /** |
478 | | * ungroup: see 'ungroup' in run_processes_parallel() below. |
479 | | */ |
480 | | unsigned int ungroup:1; |
481 | | |
482 | | /** |
483 | | * get_next_task: See get_next_task_fn() above. This must be |
484 | | * specified. |
485 | | */ |
486 | | get_next_task_fn get_next_task; |
487 | | |
488 | | /** |
489 | | * start_failure: See start_failure_fn() above. This can be |
490 | | * NULL to omit any special handling. |
491 | | */ |
492 | | start_failure_fn start_failure; |
493 | | |
494 | | /* |
495 | | * feed_pipe: see feed_pipe_fn() above. This can be NULL to omit any |
496 | | * special handling. |
497 | | */ |
498 | | feed_pipe_fn feed_pipe; |
499 | | |
500 | | /** |
501 | | * task_finished: See task_finished_fn() above. This can be |
502 | | * NULL to omit any special handling. |
503 | | */ |
504 | | task_finished_fn task_finished; |
505 | | |
506 | | /** |
507 | | * data: user data, will be passed as "pp_cb" to the callback |
508 | | * parameters. |
509 | | */ |
510 | | void *data; |
511 | | }; |
512 | | |
513 | | /** |
514 | | * Options are passed via the "struct run_process_parallel_opts" above. |
515 | | * |
516 | | * Runs N 'processes' at the same time. Whenever a process can be |
517 | | * started, the callback opts.get_next_task is called to obtain the data |
518 | | * required to start another child process. |
519 | | * |
520 | | * The children started via this function run in parallel. Their output |
521 | | * (both stdout and stderr) is routed to stderr in a manner that output |
522 | | * from different tasks does not interleave (but see "ungroup" below). |
523 | | * |
524 | | * If the "ungroup" option isn't specified, the API will set the |
525 | | * "stdout_to_stderr" parameter in "struct child_process" and provide |
526 | | * the callbacks with a "struct strbuf *out" parameter to write output |
527 | | * to. In this case the callbacks must not write to stdout or |
528 | | * stderr as such output will mess up the output of the other parallel |
529 | | * processes. If "ungroup" option is specified callbacks will get a |
530 | | * NULL "struct strbuf *out" parameter, and are responsible for |
531 | | * emitting their own output, including dealing with any race |
532 | | * conditions due to writing in parallel to stdout and stderr. |
533 | | */ |
534 | | void run_processes_parallel(const struct run_process_parallel_opts *opts); |
535 | | |
536 | | /** |
537 | | * Unset all local-repo GIT_* variables in env; see local_repo_env in |
538 | | * environment.h. GIT_CONFIG_PARAMETERS and GIT_CONFIG_COUNT are preserved |
539 | | * to pass -c and --config-env options from the parent process. |
540 | | */ |
541 | | void sanitize_repo_env(struct strvec *env); |
542 | | |
543 | | /** |
544 | | * Convenience function which prepares env for a command to be run in a |
545 | | * new repo. This removes variables pointing to the local repository (using |
546 | | * sanitize_repo_env() above), and adds an environment variable pointing to |
547 | | * new_git_dir. |
548 | | */ |
549 | | void prepare_other_repo_env(struct strvec *env, const char *new_git_dir); |
550 | | |
551 | | /** |
552 | | * Possible return values for start_bg_command(). |
553 | | */ |
554 | | enum start_bg_result { |
555 | | /* child process is "ready" */ |
556 | | SBGR_READY = 0, |
557 | | |
558 | | /* child process could not be started */ |
559 | | SBGR_ERROR, |
560 | | |
561 | | /* callback error when testing for "ready" */ |
562 | | SBGR_CB_ERROR, |
563 | | |
564 | | /* timeout expired waiting for child to become "ready" */ |
565 | | SBGR_TIMEOUT, |
566 | | |
567 | | /* child process exited or was signalled before becoming "ready" */ |
568 | | SBGR_DIED, |
569 | | }; |
570 | | |
571 | | /** |
572 | | * Callback used by start_bg_command() to ask whether the |
573 | | * child process is ready or needs more time to become "ready". |
574 | | * |
575 | | * The callback will receive the cmd and cb_data arguments given to |
576 | | * start_bg_command(). |
577 | | * |
578 | | * Returns 1 is child needs more time (subject to the requested timeout). |
579 | | * Returns 0 if child is "ready". |
580 | | * Returns -1 on any error and cause start_bg_command() to also error out. |
581 | | */ |
582 | | typedef int(start_bg_wait_cb)(const struct child_process *cmd, void *cb_data); |
583 | | |
584 | | /** |
585 | | * Start a command in the background. Wait long enough for the child |
586 | | * to become "ready" (as defined by the provided callback). Capture |
587 | | * immediate errors (like failure to start) and any immediate exit |
588 | | * status (such as a shutdown/signal before the child became "ready") |
589 | | * and return this like start_command(). |
590 | | * |
591 | | * We run a custom wait loop using the provided callback to wait for |
592 | | * the child to start and become "ready". This is limited by the given |
593 | | * timeout value. |
594 | | * |
595 | | * If the child does successfully start and become "ready", we orphan |
596 | | * it into the background. |
597 | | * |
598 | | * The caller must not call finish_command(). |
599 | | * |
600 | | * The opaque cb_data argument will be forwarded to the callback for |
601 | | * any instance data that it might require. This may be NULL. |
602 | | */ |
603 | | enum start_bg_result start_bg_command(struct child_process *cmd, |
604 | | start_bg_wait_cb *wait_cb, |
605 | | void *cb_data, |
606 | | unsigned int timeout_sec); |
607 | | |
608 | | int sane_execvp(const char *file, char *const argv[]); |
609 | | |
610 | | #endif |