On Tue, Oct 19, 2010 at 09:32:36AM -0400, Jeff King wrote: > How does this interact with the sigchain code? If I do: > > start_command(...); > sigchain_push(...); > finish_command(...); > > we will overwrite the function pushed in the sigchain_push with a stale > handler. I think you could just replace your signal() calls with: > > sigchain_push(SIGINT, SIG_IGN); > ... > sigchain_pop(SIGINT); Which, FWIW, would look like this: diff --git a/run-command.c b/run-command.c index 2a1041e..24e0f46 100644 --- a/run-command.c +++ b/run-command.c @@ -1,6 +1,7 @@ #include "cache.h" #include "run-command.h" #include "exec_cmd.h" +#include "sigchain.h" static inline void close_pair(int fd[2]) { @@ -102,6 +103,9 @@ 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 */ + sigchain_pop(SIGINT); + sigchain_pop(SIGQUIT); + if (waiting < 0) { failed_errno = errno; error("waitpid for %s failed: %s", argv0, strerror(errno)); @@ -202,8 +206,12 @@ fail_pipe: notify_pipe[0] = notify_pipe[1] = -1; fflush(NULL); + sigchain_push(SIGINT, SIG_IGN); + sigchain_push(SIGQUIT, SIG_IGN); cmd->pid = fork(); if (!cmd->pid) { + sigchain_pop(SIGINT); + sigchain_pop(SIGQUIT); /* * Redirect the channel to write syscall error messages to * before redirecting the process's stderr so that all die() -- 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