diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-02-03 00:26:12 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-02-03 00:26:12 -0800 |
commit | 1487eb68f7fd145151caa9a11ee00283629b75ef (patch) | |
tree | f745afc9bab5014851864b9d0046f9e3b9774acd /run-command.c | |
parent | 2ea3c17189bf9ca459879129ca190792b5451f05 (diff) | |
parent | d8e96fd86d415554a9c2e09ffb929a9e22fdad25 (diff) | |
download | git-1487eb68f7fd145151caa9a11ee00283629b75ef.tar.gz |
Merge branch 'jk/maint-cleanup-after-exec-failure'
* jk/maint-cleanup-after-exec-failure:
git: use run_command() to execute dashed externals
run_command(): help callers distinguish errors
run_command(): handle missing command errors more gracefully
git: s/run_command/run_builtin/
Diffstat (limited to 'run-command.c')
-rw-r--r-- | run-command.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/run-command.c b/run-command.c index db9ce59204..b05c734d05 100644 --- a/run-command.c +++ b/run-command.c @@ -118,7 +118,9 @@ int start_command(struct child_process *cmd) } else { execvp(cmd->argv[0], (char *const*) cmd->argv); } - die("exec %s failed.", cmd->argv[0]); + trace_printf("trace: exec '%s' failed: %s\n", cmd->argv[0], + strerror(errno)); + exit(127); } #else int s0 = -1, s1 = -1, s2 = -1; /* backups of stdin, stdout, stderr */ @@ -187,6 +189,7 @@ int start_command(struct child_process *cmd) #endif if (cmd->pid < 0) { + int err = errno; if (need_in) close_pair(fdin); else if (cmd->in) @@ -197,7 +200,9 @@ int start_command(struct child_process *cmd) close(cmd->out); if (need_err) close_pair(fderr); - return -ERR_RUN_COMMAND_FORK; + return err == ENOENT ? + -ERR_RUN_COMMAND_EXEC : + -ERR_RUN_COMMAND_FORK; } if (need_in) @@ -236,9 +241,14 @@ static int wait_or_whine(pid_t pid) if (!WIFEXITED(status)) return -ERR_RUN_COMMAND_WAITPID_NOEXIT; code = WEXITSTATUS(status); - if (code) + switch (code) { + case 127: + return -ERR_RUN_COMMAND_EXEC; + case 0: + return 0; + default: return -code; - return 0; + } } } |