diff -duNr --exclude=*~ --exclude=*.rej --exclude=*.sigchld pine4.30.orig/pine/osdep/pipe pine4.30/pine/osdep/pipe --- pine4.30.orig/pine/osdep/pipe Tue Aug 22 02:27:05 2000 +++ pine4.30/pine/osdep/pipe Thu Nov 2 23:53:53 2000 @@ -371,7 +371,8 @@ fs_give((void **)syspipe); } - +static void ignoreAlarm(int signum) { +} /*---------------------------------------------------------------------- Close pipe previously allocated and wait for child's death @@ -411,14 +412,22 @@ { SigType (*alarm_sig)(); int old_cue = F_ON(F_SHOW_DELAY_CUE, ps_global); + sigset_t sigchldMask; + sigset_t origMask; + + /* block SIGCHLD and SIGALRM -- we only want them during our + sigsuspend() */ + sigemptyset(&sigchldMask); + sigaddset(&sigchldMask, SIGCHLD); + sigaddset(&sigchldMask, SIGALRM); + sigprocmask(SIG_BLOCK, &sigchldMask, &origMask); + + sigfillset(&sigchldMask); + sigdelset(&sigchldMask, SIGCHLD); + sigdelset(&sigchldMask, SIGALRM); + + alarm_sig = signal(SIGALRM, ignoreAlarm); - /* - * remember the current SIGALRM handler, and make sure it's - * installed when we're finished just in case the longjmp - * out of the SIGCHLD handler caused sleep() to lose it. - * Don't pay any attention to that man behind the curtain. - */ - alarm_sig = signal(SIGALRM, SIG_IGN); F_SET(F_SHOW_DELAY_CUE, ps_global, 0); ps_global->noshow_timeout = 1; while(!child_signalled){ @@ -427,12 +436,8 @@ ? NM_NONE : NM_DEFER_SORT); if(!child_signalled){ - if(setjmp(child_state) == 0){ - child_jump = 1; /* prepare to wake up */ - sleep(600); /* give it 5mins to happend */ - } - else - our_sigunblock(SIGCHLD); + alarm(600); /* timeout in a few minutes */ + sigsuspend(&sigchldMask); } child_jump = 0; @@ -440,7 +445,10 @@ ps_global->noshow_timeout = 0; F_SET(F_SHOW_DELAY_CUE, ps_global, old_cue); + + /* put everything back how we found it */ (void) signal(SIGALRM, alarm_sig); + sigprocmask(SIG_SETMASK, &origMask, NULL); } #endif