#3595: problems suspending mutt when called from shell script ---------------------------+---------------------- Reporter: blmassingill | Owner: mutt-dev Type: defect | Status: new Priority: minor | Milestone: Component: mutt | Version: 1.5.21 Resolution: | Keywords: ---------------------------+----------------------
Comment (by blmassingill): Replying to [comment:1 zsdzsd]: > Are you sure it works in 1.4.2? I tried compiling 1.4.2.3 and I still > get the same problem. Yes -- but what I'm using is a slightly earlier version. First line of output of "mutt -v" is Mutt 1.4.2.1i (2004-02-12) > > The problem, which shows up in programs such as grepm (I add that > mainly for people searching the bug list), may be related to > the following code in signal.c: > {{{ > RETSIGTYPE sighandler (int sig) > { > int save_errno = errno; > struct sigaction act; > > switch (sig) > { > case SIGTSTP: /* user requested a suspend */ > if (!option (OPTSUSPEND)) > break; > IsEndwin = isendwin (); > curs_set (1); > if (!IsEndwin) > endwin (); > kill (0, SIGSTOP); > }}} > This codes assumes that a SIGSTOP is just as good as a SIGTSTP, but > (perhaps) when mutt is running inside a subshell (a la) grepm, the two > signals are not handled analogously. Or perhaps the issue is as I > speculate below (*). > > > I tried making the following change to signal.c in 1.4.2.3: > {{{ > RETSIGTYPE sighandler (int sig) > { > int save_errno = errno; > sigset_t mask; /* NEW */ > struct sigaction act; > > switch (sig) > { > case SIGTSTP: /* user requested a suspend */ > if (!option (OPTSUSPEND)) > break; > IsEndwin = isendwin (); > curs_set (1); > if (!IsEndwin) > endwin (); > /* OLD kill (0, SIGSTOP); */ > /* REST OF THIS TO "HERE" IS NEW: */ > sigemptyset(&mask); > sigaddset(&mask, SIGTSTP); > sigprocmask(SIG_UNBLOCK, &mask, NULL); > signal(SIGTSTP, SIG_DFL); /* reset disposition to default */ > sigemptyset(&act.sa_mask); > sigaddset(&act.sa_mask, SIGTSTP); > act.sa_flags = 0; > act.sa_handler = sighandler; > kill(0, SIGTSTP); > /* wait to be CONTinued... */ > sigprocmask(SIG_BLOCK, &mask, NULL); /* DO I WANT THIS?? */ > sigaction(SIGTSTP, &act, NULL); > /* HERE */ > }}} > > and the situation is much improved, but (annoyingly) there is the > occasional situation in which the problem occurs. (See (*) below.) > > > I tried replacing > {{{ > kill(0, SIGTSTP); > }}} > with > {{{ > kill(getpid(), SIGTSTP); > }}} > and that didn't work any better. (The thought being that the subshell which called mutt has > already received SIGSTSP, so it doesn't need another signal.) > > (*) I speculate that there is some race condition between when mutt > and the subshell process the SIGTSTP. But even if this is true, I'm > not immediately sure how to deal with this. > > Are there any signal handling / process groups / terminal emulator > wizards here who could comment? > -- Ticket URL: <http://dev.mutt.org/trac/ticket/3595#comment:3> Mutt <http://www.mutt.org/> The Mutt mail user agent