commit f3ecd8ae845e35bc0d5576d4fb3a4ba5ed097a37 from: rsc date: Tue Feb 08 19:08:47 2005 UTC play nicer with others w.r.t. signal masks commit - 76164c00c364039613d03f1f5f1c3e2c29ae5ac2 commit + f3ecd8ae845e35bc0d5576d4fb3a4ba5ed097a37 blob - c4675be10e092c1247691030930bcce12c31dd33 blob + 173883957289031defd1dc01741624ef2aef7801 --- src/lib9/notify.c +++ src/lib9/notify.c @@ -31,48 +31,44 @@ typedef struct Sig Sig; struct Sig { int sig; /* signal number */ - int restart; /* do we restart the system call after this signal is handled? */ - int enabled; /* is this signal enabled (not masked)? */ - int notified; /* do we call the notify function for this signal? */ + int flags; }; -/* - * Bug. It is profoundly anti-social to play with the masks like this. - * For example, even though we don't want to see SIGTSTP, others do. - * Running bash inside a 9term that has disabled SIGTSTP makes ^Z not work. - * Instead we need to leave the signals enabled but notifyoff them. - */ +enum +{ + Restart = 1<<0, + Ignore = 1<<1, +}; -/* initial settings; for current status, ask the kernel */ static Sig sigs[] = { - SIGHUP, 0, 1, 1, - SIGINT, 0, 1, 1, - SIGQUIT, 0, 1, 1, - SIGILL, 0, 1, 1, - SIGTRAP, 0, 1, 1, -/* SIGABRT, 0, 1, 1, */ + SIGHUP, 0, + SIGINT, 0, + SIGQUIT, 0, + SIGILL, 0, + SIGTRAP, 0, +/* SIGABRT, 0, */ #ifdef SIGEMT - SIGEMT, 0, 1, 1, + SIGEMT, 0, #endif - SIGFPE, 0, 1, 1, - SIGBUS, 0, 1, 1, -/* SIGSEGV, 0, 1, 1, */ - SIGCHLD, 1, 0, 1, - SIGSYS, 0, 1, 1, - SIGPIPE, 0, 0, 1, - SIGALRM, 0, 1, 1, - SIGTERM, 0, 1, 1, - SIGTSTP, 1, 0, 1, - SIGTTIN, 1, 0, 1, - SIGTTOU, 1, 0, 1, - SIGXCPU, 0, 1, 1, - SIGXFSZ, 0, 1, 1, - SIGVTALRM, 0, 1, 1, - SIGUSR1, 0, 1, 1, - SIGUSR2, 0, 1, 1, - SIGWINCH, 1, 0, 1, + SIGFPE, 0, + SIGBUS, 0, +/* SIGSEGV, 0, */ + SIGCHLD, Restart|Ignore, + SIGSYS, 0, + SIGPIPE, Ignore, + SIGALRM, 0, + SIGTERM, 0, + SIGTSTP, Restart|Ignore, + SIGTTIN, Restart|Ignore, + SIGTTOU, Restart|Ignore, + SIGXCPU, 0, + SIGXFSZ, 0, + SIGVTALRM, 0, + SIGUSR1, 0, + SIGUSR2, 0, + SIGWINCH, Restart|Ignore, #ifdef SIGINFO - SIGINFO, 1, 1, 1, + SIGINFO, Restart|Ignore, #endif }; @@ -121,6 +117,7 @@ signotify(int sig) { char tmp[64]; Jmp *j; + Sig *s; j = (*_notejmpbuf)(); switch(p9setjmp(j->b)){ @@ -130,6 +127,9 @@ signotify(int sig) /* fall through */ case 1: /* noted(NDFLT) */ if(0)print("DEFAULT %d\n", sig); + s = findsig(sig); + if(s && (s->flags&Ignore)) + return; signal(sig, SIG_DFL); raise(sig); _exit(1); @@ -216,7 +216,7 @@ notifyseton(int s, int on) return -1; memset(&sa, 0, sizeof sa); sa.sa_handler = on ? signotify : signonotify; - if(sig->restart) + if(sig->flags&Restart) sa.sa_flags |= SA_RESTART; /* @@ -264,13 +264,7 @@ noteinit(void) */ if(handler(sig->sig) != SIG_DFL) continue; - /* - * Should we only disable and not enable signals? - * (I.e. if parent has disabled for us, should we still enable?) - * Right now we always initialize to the state we want. - */ - notesetenable(sig->sig, sig->enabled); - notifyseton(sig->sig, sig->notified); + notifyseton(sig->sig, 1); } }