about summary refs log tree commit diff
path: root/Src/signals.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-08-06 18:01:35 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-08-06 18:01:35 +0000
commit784c413690c71212ad9e08bb093414abd1cacc08 (patch)
tree450cc9242047dd50255af3b1ef940dae5bb3ab39 /Src/signals.c
parent61e68d70da5af5afe943f92cd94a8c96e78348d9 (diff)
downloadzsh-784c413690c71212ad9e08bb093414abd1cacc08.tar.gz
zsh-784c413690c71212ad9e08bb093414abd1cacc08.tar.xz
zsh-784c413690c71212ad9e08bb093414abd1cacc08.zip
zsh-3.1.6-pws-1 zsh-3.1.6-pws-1
Diffstat (limited to 'Src/signals.c')
-rw-r--r--Src/signals.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/Src/signals.c b/Src/signals.c
index d29bdd4b0..4e9fed0cb 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -326,14 +326,23 @@ signal_suspend(int sig, int sig2)
  
 #ifdef POSIX_SIGNALS
     sigset_t set;
+#ifdef BROKEN_POSIX_SIGSUSPEND
+    sigset_t oset;
+#endif /* BROKEN_POSIX_SIGSUSPEND */
 
     sigfillset(&set);
     sigdelset(&set, sig);
     sigdelset(&set, SIGHUP);  /* still don't know why we add this? */
     if (sig2)
         sigdelset(&set, sig2);
+#ifdef BROKEN_POSIX_SIGSUSPEND
+    sigprocmask(SIG_SETMASK, &set, &oset);
+    pause();
+    sigprocmask(SIG_SETMASK, &oset, NULL);
+#else /* not BROKEN_POSIX_SIGSUSPEND */
     ret = sigsuspend(&set);
-#else
+#endif /* BROKEN_POSIX_SIGSUSPEND */
+#else /* not POSIX_SIGNALS */
 # ifdef BSD_SIGNALS
     sigset_t set;
 
@@ -601,6 +610,9 @@ killjb(Job jn, int sig)
     }
     for (pn = jn->procs; pn; pn = pn->next)
         if ((err = kill(pn->pid, sig)) == -1 && errno != ESRCH)
+#ifdef BROKEN_KILL_ESRCH
+          if(errno != EINVAL || sig != 0)
+#endif /* BROKEN_KILL_ESRCH */
             return -1;
     return err;
 }
@@ -640,7 +652,11 @@ dosavetrap(int sig, int level)
 	 */
 	char func[20];
 	sprintf(func, "TRAP%s", sigs[sig]);
-	st->list = shfunctab->removenode(shfunctab, func);
+	/* We call removehashnode() directly because otherwise
+	 * removeshfuncnode() would be called which in turn would
+	 * call us again so that we would end up with a NULL pointer
+	 * instead of the list for the trap. */
+	st->list = removehashnode(shfunctab, func);
     } else {
 	st->list = sigfuncs[sig];
 	unsettrap(sig);