run-command.c 17.8 KB
Newer Older
1 2
#include "cache.h"
#include "run-command.h"
3
#include "exec_cmd.h"
4
#include "sigchain.h"
J
Jeff King 已提交
5
#include "argv-array.h"
6

7 8 9 10
#ifndef SHELL_PATH
# define SHELL_PATH "/bin/sh"
#endif

11 12 13 14
void child_process_init(struct child_process *child)
{
	memset(child, 0, sizeof(*child));
	argv_array_init(&child->args);
15
	argv_array_init(&child->env_array);
16 17
}

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
struct child_to_clean {
	pid_t pid;
	struct child_to_clean *next;
};
static struct child_to_clean *children_to_clean;
static int installed_child_cleanup_handler;

static void cleanup_children(int sig)
{
	while (children_to_clean) {
		struct child_to_clean *p = children_to_clean;
		children_to_clean = p->next;
		kill(p->pid, sig);
		free(p);
	}
}

static void cleanup_children_on_signal(int sig)
{
	cleanup_children(sig);
	sigchain_pop(sig);
	raise(sig);
}

static void cleanup_children_on_exit(void)
{
	cleanup_children(SIGTERM);
}

static void mark_child_for_cleanup(pid_t pid)
{
	struct child_to_clean *p = xmalloc(sizeof(*p));
	p->pid = pid;
	p->next = children_to_clean;
	children_to_clean = p;

	if (!installed_child_cleanup_handler) {
		atexit(cleanup_children_on_exit);
		sigchain_push_common(cleanup_children_on_signal);
		installed_child_cleanup_handler = 1;
	}
}

static void clear_child_for_cleanup(pid_t pid)
{
63
	struct child_to_clean **pp;
64

65 66 67 68 69 70
	for (pp = &children_to_clean; *pp; pp = &(*pp)->next) {
		struct child_to_clean *clean_me = *pp;

		if (clean_me->pid == pid) {
			*pp = clean_me->next;
			free(clean_me);
71 72 73 74 75
			return;
		}
	}
}

76 77 78 79 80 81
static inline void close_pair(int fd[2])
{
	close(fd[0]);
	close(fd[1]);
}

82
#ifndef GIT_WINDOWS_NATIVE
83 84 85
static inline void dup_devnull(int to)
{
	int fd = open("/dev/null", O_RDWR);
86 87 88 89
	if (fd < 0)
		die_errno(_("open /dev/null failed"));
	if (dup2(fd, to) < 0)
		die_errno(_("dup2(%d,%d) failed"), fd, to);
90 91
	close(fd);
}
92
#endif
93

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
static char *locate_in_PATH(const char *file)
{
	const char *p = getenv("PATH");
	struct strbuf buf = STRBUF_INIT;

	if (!p || !*p)
		return NULL;

	while (1) {
		const char *end = strchrnul(p, ':');

		strbuf_reset(&buf);

		/* POSIX specifies an empty entry as the current directory. */
		if (end != p) {
			strbuf_add(&buf, p, end - p);
			strbuf_addch(&buf, '/');
		}
		strbuf_addstr(&buf, file);

		if (!access(buf.buf, F_OK))
			return strbuf_detach(&buf, NULL);

		if (!*end)
			break;
		p = end + 1;
	}

	strbuf_release(&buf);
	return NULL;
}

static int exists_in_PATH(const char *file)
{
	char *r = locate_in_PATH(file);
	free(r);
	return r != NULL;
}

int sane_execvp(const char *file, char * const argv[])
{
	if (!execvp(file, argv))
		return 0; /* cannot happen ;-) */

	/*
	 * When a command can't be found because one of the directories
	 * listed in $PATH is unsearchable, execvp reports EACCES, but
	 * careful usability testing (read: analysis of occasional bug
	 * reports) reveals that "No such file or directory" is more
	 * intuitive.
	 *
	 * We avoid commands with "/", because execvp will not do $PATH
	 * lookups in that case.
	 *
	 * The reassignment of EACCES to errno looks like a no-op below,
	 * but we need to protect against exists_in_PATH overwriting errno.
	 */
	if (errno == EACCES && !strchr(file, '/'))
		errno = exists_in_PATH(file) ? EACCES : ENOENT;
153 154
	else if (errno == ENOTDIR && !strchr(file, '/'))
		errno = ENOENT;
155 156 157
	return -1;
}

J
Jeff King 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170
static const char **prepare_shell_cmd(const char **argv)
{
	int argc, nargc = 0;
	const char **nargv;

	for (argc = 0; argv[argc]; argc++)
		; /* just counting */
	/* +1 for NULL, +3 for "sh -c" plus extra $0 */
	nargv = xmalloc(sizeof(*nargv) * (argc + 1 + 3));

	if (argc < 1)
		die("BUG: shell command is empty");

171
	if (strcspn(argv[0], "|&;<>()$`\\\"' \t\n*?[#~=%") != strlen(argv[0])) {
172
#ifndef GIT_WINDOWS_NATIVE
173
		nargv[nargc++] = SHELL_PATH;
174 175 176
#else
		nargv[nargc++] = "sh";
#endif
177
		nargv[nargc++] = "-c";
J
Jeff King 已提交
178

179 180 181 182 183 184 185
		if (argc < 2)
			nargv[nargc++] = argv[0];
		else {
			struct strbuf arg0 = STRBUF_INIT;
			strbuf_addf(&arg0, "%s \"$@\"", argv[0]);
			nargv[nargc++] = strbuf_detach(&arg0, NULL);
		}
J
Jeff King 已提交
186 187 188 189 190 191 192 193 194
	}

	for (argc = 0; argv[argc]; argc++)
		nargv[nargc++] = argv[argc];
	nargv[nargc] = NULL;

	return nargv;
}

195
#ifndef GIT_WINDOWS_NATIVE
J
Jeff King 已提交
196 197 198 199
static int execv_shell_cmd(const char **argv)
{
	const char **nargv = prepare_shell_cmd(argv);
	trace_argv_printf(nargv, "trace: exec:");
200
	sane_execvp(nargv[0], (char **)nargv);
J
Jeff King 已提交
201 202 203 204 205
	free(nargv);
	return -1;
}
#endif

206
#ifndef GIT_WINDOWS_NATIVE
207
static int child_err = 2;
208 209 210 211
static int child_notifier = -1;

static void notify_parent(void)
{
212 213 214 215 216 217
	/*
	 * execvp failed.  If possible, we'd like to let start_command
	 * know, so failures like ENOENT can be handled right away; but
	 * otherwise, finish_command will still report the error.
	 */
	xwrite(child_notifier, "", 1);
218
}
219 220 221

static NORETURN void die_child(const char *err, va_list params)
{
222
	vwritef(child_err, "fatal: ", err, params);
223 224
	exit(128);
}
225 226 227 228 229

static void error_child(const char *err, va_list params)
{
	vwritef(child_err, "error: ", err, params);
}
230
#endif
231 232 233 234 235 236 237 238

static inline void set_cloexec(int fd)
{
	int flags = fcntl(fd, F_GETFD);
	if (flags >= 0)
		fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
}

239
static int wait_or_whine(pid_t pid, const char *argv0)
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
{
	int status, code = -1;
	pid_t waiting;
	int failed_errno = 0;

	while ((waiting = waitpid(pid, &status, 0)) < 0 && errno == EINTR)
		;	/* nothing */

	if (waiting < 0) {
		failed_errno = errno;
		error("waitpid for %s failed: %s", argv0, strerror(errno));
	} else if (waiting != pid) {
		error("waitpid is confused (%s)", argv0);
	} else if (WIFSIGNALED(status)) {
		code = WTERMSIG(status);
255 256
		if (code != SIGINT && code != SIGQUIT)
			error("%s died of signal %d", argv0, code);
257 258 259 260 261
		/*
		 * This return value is chosen so that code & 0xff
		 * mimics the exit code that a POSIX shell would report for
		 * a program that died from this signal.
		 */
262
		code += 128;
263 264 265 266 267 268 269 270 271 272 273 274
	} else if (WIFEXITED(status)) {
		code = WEXITSTATUS(status);
		/*
		 * Convert special exit code when execvp failed.
		 */
		if (code == 127) {
			code = -1;
			failed_errno = ENOENT;
		}
	} else {
		error("waitpid is confused (%s)", argv0);
	}
275 276 277

	clear_child_for_cleanup(pid);

278 279 280 281
	errno = failed_errno;
	return code;
}

282
int start_command(struct child_process *cmd)
283
{
284 285
	int need_in, need_out, need_err;
	int fdin[2], fdout[2], fderr[2];
286
	int failed_errno;
287
	char *str;
288

289 290
	if (!cmd->argv)
		cmd->argv = cmd->args.argv;
291 292
	if (!cmd->env)
		cmd->env = cmd->env_array.argv;
293

294 295 296 297 298
	/*
	 * In case of errors we must keep the promise to close FDs
	 * that have been passed in via ->in and ->out.
	 */

299
	need_in = !cmd->no_stdin && cmd->in < 0;
300
	if (need_in) {
301
		if (pipe(fdin) < 0) {
302
			failed_errno = errno;
303 304
			if (cmd->out > 0)
				close(cmd->out);
305
			str = "standard input";
306
			goto fail_pipe;
307
		}
308 309 310
		cmd->in = fdin[1];
	}

311 312 313
	need_out = !cmd->no_stdout
		&& !cmd->stdout_to_stderr
		&& cmd->out < 0;
314 315
	if (need_out) {
		if (pipe(fdout) < 0) {
316
			failed_errno = errno;
317 318
			if (need_in)
				close_pair(fdin);
319 320
			else if (cmd->in)
				close(cmd->in);
321
			str = "standard output";
322
			goto fail_pipe;
323 324 325 326
		}
		cmd->out = fdout[0];
	}

327
	need_err = !cmd->no_stderr && cmd->err < 0;
328 329
	if (need_err) {
		if (pipe(fderr) < 0) {
330
			failed_errno = errno;
331 332
			if (need_in)
				close_pair(fdin);
333 334
			else if (cmd->in)
				close(cmd->in);
335 336
			if (need_out)
				close_pair(fdout);
337 338
			else if (cmd->out)
				close(cmd->out);
339
			str = "standard error";
340
fail_pipe:
341 342
			error("cannot create %s pipe for %s: %s",
				str, cmd->argv[0], strerror(failed_errno));
343
			argv_array_clear(&cmd->args);
344
			argv_array_clear(&cmd->env_array);
345 346
			errno = failed_errno;
			return -1;
347 348 349 350
		}
		cmd->err = fderr[0];
	}

351
	trace_argv_printf(cmd->argv, "trace: run_command:");
352
	fflush(NULL);
353

354
#ifndef GIT_WINDOWS_NATIVE
355 356 357 358 359
{
	int notify_pipe[2];
	if (pipe(notify_pipe))
		notify_pipe[0] = notify_pipe[1] = -1;

360
	cmd->pid = fork();
361
	failed_errno = errno;
362
	if (!cmd->pid) {
363 364 365 366 367 368 369 370 371 372
		/*
		 * Redirect the channel to write syscall error messages to
		 * before redirecting the process's stderr so that all die()
		 * in subsequent call paths use the parent's stderr.
		 */
		if (cmd->no_stderr || need_err) {
			child_err = dup(2);
			set_cloexec(child_err);
		}
		set_die_routine(die_child);
373
		set_error_routine(error_child);
374

375 376 377 378 379
		close(notify_pipe[0]);
		set_cloexec(notify_pipe[1]);
		child_notifier = notify_pipe[1];
		atexit(notify_parent);

380 381 382
		if (cmd->no_stdin)
			dup_devnull(0);
		else if (need_in) {
383
			dup2(fdin[0], 0);
384
			close_pair(fdin);
385 386 387
		} else if (cmd->in) {
			dup2(cmd->in, 0);
			close(cmd->in);
388
		}
389

390 391 392 393 394
		if (cmd->no_stderr)
			dup_devnull(2);
		else if (need_err) {
			dup2(fderr[1], 2);
			close_pair(fderr);
395 396 397
		} else if (cmd->err > 1) {
			dup2(cmd->err, 2);
			close(cmd->err);
398 399
		}

400 401 402
		if (cmd->no_stdout)
			dup_devnull(1);
		else if (cmd->stdout_to_stderr)
403
			dup2(2, 1);
404 405 406 407 408 409 410 411
		else if (need_out) {
			dup2(fdout[1], 1);
			close_pair(fdout);
		} else if (cmd->out > 1) {
			dup2(cmd->out, 1);
			close(cmd->out);
		}

412
		if (cmd->dir && chdir(cmd->dir))
413 414
			die_errno("exec '%s': cd to '%s' failed", cmd->argv[0],
			    cmd->dir);
415
		if (cmd->env) {
416 417
			for (; *cmd->env; cmd->env++) {
				if (strchr(*cmd->env, '='))
418
					putenv((char *)*cmd->env);
419 420 421
				else
					unsetenv(*cmd->env);
			}
422
		}
423
		if (cmd->git_cmd)
424
			execv_git_cmd(cmd->argv);
425
		else if (cmd->use_shell)
J
Jeff King 已提交
426
			execv_shell_cmd(cmd->argv);
427
		else
428
			sane_execvp(cmd->argv[0], (char *const*) cmd->argv);
C
Clemens Buchacher 已提交
429 430 431 432
		if (errno == ENOENT) {
			if (!cmd->silent_exec_failure)
				error("cannot run %s: %s", cmd->argv[0],
					strerror(ENOENT));
433
			exit(127);
C
Clemens Buchacher 已提交
434
		} else {
435
			die_errno("cannot exec '%s'", cmd->argv[0]);
C
Clemens Buchacher 已提交
436
		}
437
	}
438 439
	if (cmd->pid < 0)
		error("cannot fork() for %s: %s", cmd->argv[0],
440
			strerror(errno));
441 442
	else if (cmd->clean_on_exit)
		mark_child_for_cleanup(cmd->pid);
443 444 445 446 447 448 449 450 451 452 453 454 455 456

	/*
	 * Wait for child's execvp. If the execvp succeeds (or if fork()
	 * failed), EOF is seen immediately by the parent. Otherwise, the
	 * child process sends a single byte.
	 * Note that use of this infrastructure is completely advisory,
	 * therefore, we keep error checks minimal.
	 */
	close(notify_pipe[1]);
	if (read(notify_pipe[0], &notify_pipe[1], 1) == 1) {
		/*
		 * At this point we know that fork() succeeded, but execvp()
		 * failed. Errors have been reported to our stderr.
		 */
457
		wait_or_whine(cmd->pid, cmd->argv[0]);
458 459 460 461 462
		failed_errno = errno;
		cmd->pid = -1;
	}
	close(notify_pipe[0]);
}
463
#else
F
Frank Li 已提交
464
{
465
	int fhin = 0, fhout = 1, fherr = 2;
466
	const char **sargv = cmd->argv;
467

468 469 470 471 472 473 474 475 476 477 478
	if (cmd->no_stdin)
		fhin = open("/dev/null", O_RDWR);
	else if (need_in)
		fhin = dup(fdin[0]);
	else if (cmd->in)
		fhin = dup(cmd->in);

	if (cmd->no_stderr)
		fherr = open("/dev/null", O_RDWR);
	else if (need_err)
		fherr = dup(fderr[1]);
479 480
	else if (cmd->err > 2)
		fherr = dup(cmd->err);
481 482 483 484 485 486 487 488 489

	if (cmd->no_stdout)
		fhout = open("/dev/null", O_RDWR);
	else if (cmd->stdout_to_stderr)
		fhout = dup(fherr);
	else if (need_out)
		fhout = dup(fdout[1]);
	else if (cmd->out > 1)
		fhout = dup(cmd->out);
490

491
	if (cmd->git_cmd)
492
		cmd->argv = prepare_git_cmd(cmd->argv);
493
	else if (cmd->use_shell)
J
Jeff King 已提交
494
		cmd->argv = prepare_shell_cmd(cmd->argv);
495

496 497
	cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, (char**) cmd->env,
			cmd->dir, fhin, fhout, fherr);
498
	failed_errno = errno;
499
	if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT))
500
		error("cannot spawn %s: %s", cmd->argv[0], strerror(errno));
501 502
	if (cmd->clean_on_exit && cmd->pid >= 0)
		mark_child_for_cleanup(cmd->pid);
503 504

	if (cmd->git_cmd)
505
		free(cmd->argv);
506

507
	cmd->argv = sargv;
508 509 510 511 512 513
	if (fhin != 0)
		close(fhin);
	if (fhout != 1)
		close(fhout);
	if (fherr != 2)
		close(fherr);
F
Frank Li 已提交
514
}
515 516 517 518 519 520 521 522 523 524 525 526 527
#endif

	if (cmd->pid < 0) {
		if (need_in)
			close_pair(fdin);
		else if (cmd->in)
			close(cmd->in);
		if (need_out)
			close_pair(fdout);
		else if (cmd->out)
			close(cmd->out);
		if (need_err)
			close_pair(fderr);
528 529
		else if (cmd->err)
			close(cmd->err);
530
		argv_array_clear(&cmd->args);
531
		argv_array_clear(&cmd->env_array);
532 533
		errno = failed_errno;
		return -1;
534
	}
535 536 537 538 539 540

	if (need_in)
		close(fdin[0]);
	else if (cmd->in)
		close(cmd->in);

541 542
	if (need_out)
		close(fdout[1]);
543
	else if (cmd->out)
544 545
		close(cmd->out);

546 547
	if (need_err)
		close(fderr[1]);
548 549
	else if (cmd->err)
		close(cmd->err);
550

551 552 553
	return 0;
}

554 555
int finish_command(struct child_process *cmd)
{
556 557
	int ret = wait_or_whine(cmd->pid, cmd->argv[0]);
	argv_array_clear(&cmd->args);
558
	argv_array_clear(&cmd->env_array);
559
	return ret;
560 561
}

562 563 564 565 566 567 568 569
int run_command(struct child_process *cmd)
{
	int code = start_command(cmd);
	if (code)
		return code;
	return finish_command(cmd);
}

570 571
int run_command_v_opt(const char **argv, int opt)
{
572
	return run_command_v_opt_cd_env(argv, opt, NULL, NULL);
573 574
}

575 576
int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env)
{
577 578 579 580 581 582 583 584
	struct child_process cmd = CHILD_PROCESS_INIT;
	cmd.argv = argv;
	cmd.no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
	cmd.git_cmd = opt & RUN_GIT_CMD ? 1 : 0;
	cmd.stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
	cmd.silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0;
	cmd.use_shell = opt & RUN_USING_SHELL ? 1 : 0;
	cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
585 586 587 588
	cmd.dir = dir;
	cmd.env = env;
	return run_command(&cmd);
}
589

590
#ifndef NO_PTHREADS
591 592 593
static pthread_t main_thread;
static int main_thread_set;
static pthread_key_t async_key;
594
static pthread_key_t async_die_counter;
595

596
static void *run_thread(void *data)
597 598
{
	struct async *async = data;
599
	intptr_t ret;
600 601

	pthread_setspecific(async_key, async);
602
	ret = async->proc(async->proc_in, async->proc_out, async->data);
603
	return (void *)ret;
604
}
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619

static NORETURN void die_async(const char *err, va_list params)
{
	vreportf("fatal: ", err, params);

	if (!pthread_equal(main_thread, pthread_self())) {
		struct async *async = pthread_getspecific(async_key);
		if (async->proc_in >= 0)
			close(async->proc_in);
		if (async->proc_out >= 0)
			close(async->proc_out);
		pthread_exit((void *)128);
	}

	exit(128);
620
}
621 622 623 624 625 626 627 628

static int async_die_is_recursing(void)
{
	void *ret = pthread_getspecific(async_die_counter);
	pthread_setspecific(async_die_counter, (void *)1);
	return ret != NULL;
}

629 630 631 632 633 634 635 636 637 638
#else

static struct {
	void (**handlers)(void);
	size_t nr;
	size_t alloc;
} git_atexit_hdlrs;

static int git_atexit_installed;

639
static void git_atexit_dispatch(void)
640 641 642 643 644 645 646
{
	size_t i;

	for (i=git_atexit_hdlrs.nr ; i ; i--)
		git_atexit_hdlrs.handlers[i-1]();
}

647
static void git_atexit_clear(void)
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
{
	free(git_atexit_hdlrs.handlers);
	memset(&git_atexit_hdlrs, 0, sizeof(git_atexit_hdlrs));
	git_atexit_installed = 0;
}

#undef atexit
int git_atexit(void (*handler)(void))
{
	ALLOC_GROW(git_atexit_hdlrs.handlers, git_atexit_hdlrs.nr + 1, git_atexit_hdlrs.alloc);
	git_atexit_hdlrs.handlers[git_atexit_hdlrs.nr++] = handler;
	if (!git_atexit_installed) {
		if (atexit(&git_atexit_dispatch))
			return -1;
		git_atexit_installed = 1;
	}
	return 0;
}
#define atexit git_atexit

668 669
#endif

670 671
int start_async(struct async *async)
{
672 673 674
	int need_in, need_out;
	int fdin[2], fdout[2];
	int proc_in, proc_out;
675

676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
	need_in = async->in < 0;
	if (need_in) {
		if (pipe(fdin) < 0) {
			if (async->out > 0)
				close(async->out);
			return error("cannot create pipe: %s", strerror(errno));
		}
		async->in = fdin[1];
	}

	need_out = async->out < 0;
	if (need_out) {
		if (pipe(fdout) < 0) {
			if (need_in)
				close_pair(fdin);
			else if (async->in)
				close(async->in);
			return error("cannot create pipe: %s", strerror(errno));
		}
		async->out = fdout[0];
	}

	if (need_in)
		proc_in = fdin[0];
	else if (async->in)
		proc_in = async->in;
	else
		proc_in = -1;

	if (need_out)
		proc_out = fdout[1];
	else if (async->out)
		proc_out = async->out;
	else
		proc_out = -1;
711

712
#ifdef NO_PTHREADS
A
Anders Melchiorsen 已提交
713 714 715
	/* Flush stdio before fork() to avoid cloning buffers */
	fflush(NULL);

716 717 718
	async->pid = fork();
	if (async->pid < 0) {
		error("fork (async) failed: %s", strerror(errno));
719
		goto error;
720 721
	}
	if (!async->pid) {
722 723 724 725
		if (need_in)
			close(fdin[1]);
		if (need_out)
			close(fdout[0]);
726
		git_atexit_clear();
727
		exit(!!async->proc(proc_in, proc_out, async->data));
728
	}
729

730 731
	mark_child_for_cleanup(async->pid);

732 733 734 735 736 737 738 739 740
	if (need_in)
		close(fdin[0]);
	else if (async->in)
		close(async->in);

	if (need_out)
		close(fdout[1]);
	else if (async->out)
		close(async->out);
741
#else
742 743 744 745 746 747 748 749
	if (!main_thread_set) {
		/*
		 * We assume that the first time that start_async is called
		 * it is from the main thread.
		 */
		main_thread_set = 1;
		main_thread = pthread_self();
		pthread_key_create(&async_key, NULL);
750
		pthread_key_create(&async_die_counter, NULL);
751
		set_die_routine(die_async);
752
		set_die_is_recursing_routine(async_die_is_recursing);
753 754
	}

755 756 757 758
	if (proc_in >= 0)
		set_cloexec(proc_in);
	if (proc_out >= 0)
		set_cloexec(proc_out);
759 760
	async->proc_in = proc_in;
	async->proc_out = proc_out;
761 762 763 764 765 766
	{
		int err = pthread_create(&async->tid, NULL, run_thread, async);
		if (err) {
			error("cannot create thread: %s", strerror(err));
			goto error;
		}
767 768
	}
#endif
769
	return 0;
770 771 772 773 774 775 776 777 778 779 780 781

error:
	if (need_in)
		close_pair(fdin);
	else if (async->in)
		close(async->in);

	if (need_out)
		close_pair(fdout);
	else if (async->out)
		close(async->out);
	return -1;
782 783 784 785
}

int finish_async(struct async *async)
{
786
#ifdef NO_PTHREADS
J
Jeff King 已提交
787
	return wait_or_whine(async->pid, "child process");
788
#else
789 790 791 792 793
	void *ret = (void *)(intptr_t)(-1);

	if (pthread_join(async->tid, &ret))
		error("pthread_join failed");
	return (int)(intptr_t)ret;
794
#endif
795
}
796

797 798 799 800 801 802 803 804 805
char *find_hook(const char *name)
{
	char *path = git_path("hooks/%s", name);
	if (access(path, X_OK) < 0)
		path = NULL;

	return path;
}

806
int run_hook_ve(const char *const *env, const char *name, va_list args)
807
{
808
	struct child_process hook = CHILD_PROCESS_INIT;
809
	const char *p;
810

811 812
	p = find_hook(name);
	if (!p)
813 814
		return 0;

815 816 817
	argv_array_push(&hook.args, p);
	while ((p = va_arg(args, const char *)))
		argv_array_push(&hook.args, p);
818
	hook.env = env;
819 820 821
	hook.no_stdin = 1;
	hook.stdout_to_stderr = 1;

822
	return run_command(&hook);
823
}
824 825 826 827 828 829 830 831 832 833 834 835

int run_hook_le(const char *const *env, const char *name, ...)
{
	va_list args;
	int ret;

	va_start(args, name);
	ret = run_hook_ve(env, name, args);
	va_end(args);

	return ret;
}
836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851

int capture_command(struct child_process *cmd, struct strbuf *buf, size_t hint)
{
	cmd->out = -1;
	if (start_command(cmd) < 0)
		return -1;

	if (strbuf_read(buf, cmd->out, hint) < 0) {
		close(cmd->out);
		finish_command(cmd); /* throw away exit code */
		return -1;
	}

	close(cmd->out);
	return finish_command(cmd);
}