Jeff King wrote: > On Tue, Oct 19, 2010 at 09:32:36AM -0400, Jeff King wrote: >> I think you could just replace your signal() calls with: >> >> sigchain_push(SIGINT, SIG_IGN); >> ... >> sigchain_pop(SIGINT); > > Which, FWIW, would look like this: Something in this direction on top? I think sigchain_push ought to accept a context object. Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- diff --git a/run-command.c b/run-command.c index 24e0f46..efdac84 100644 --- a/run-command.c +++ b/run-command.c @@ -103,6 +103,7 @@ static int wait_or_whine(pid_t pid, const char *argv0, int silent_exec_failure) while ((waiting = waitpid(pid, &status, 0)) < 0 && errno == EINTR) ; /* nothing */ + the_child = NULL; sigchain_pop(SIGINT); sigchain_pop(SIGQUIT); @@ -139,6 +140,19 @@ static int wait_or_whine(pid_t pid, const char *argv0, int silent_exec_failure) return code; } +static struct child_process *the_child; + +static void interrupted_with_child(int sig) +{ + if (the_child && the_child->pid > 0) { + while ((waiting = waitpid(pid, NULL, 0)) < 0 && errno == EINTR) + ; /* nothing */ + the_child = NULL; + } + sigchain_pop(sig); + raise(sig); +} + int start_command(struct child_process *cmd) { int need_in, need_out, need_err; @@ -206,8 +220,11 @@ fail_pipe: notify_pipe[0] = notify_pipe[1] = -1; fflush(NULL); - sigchain_push(SIGINT, SIG_IGN); - sigchain_push(SIGQUIT, SIG_IGN); + if (the_child) + die("What? _Two_ children?"); + the_child = cmd; + sigchain_push(SIGINT, interrupted_with_child); + sigchain_push(SIGQUIT, interrupted_with_child); cmd->pid = fork(); if (!cmd->pid) { sigchain_pop(SIGINT); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html