SCCS-vsn: sys/kern/kern_sig.c 6.7
-/* kern_sig.c 6.6 84/08/29 */
+/* kern_sig.c 6.7 84/09/04 */
#include "../machine/reg.h"
#include "../machine/pte.h"
#include "../machine/reg.h"
#include "../machine/pte.h"
#include "uio.h"
#include "kernel.h"
#include "uio.h"
#include "kernel.h"
-#define mask(s) (1 << ((s)-1))
-#define cantmask (mask(SIGKILL)|mask(SIGCONT)|mask(SIGSTOP))
+#define cantmask (sigmask(SIGKILL)|sigmask(SIGCONT)|sigmask(SIGSTOP))
/*
* Quick interface to signal handler.
/*
* Quick interface to signal handler.
if (uap->osv) {
sv->sv_handler = u.u_signal[sig];
sv->sv_mask = u.u_sigmask[sig];
if (uap->osv) {
sv->sv_handler = u.u_signal[sig];
sv->sv_mask = u.u_sigmask[sig];
- sv->sv_onstack = (u.u_sigonstack & mask(sig)) != 0;
+ sv->sv_onstack = (u.u_sigonstack & sigmask(sig)) != 0;
u.u_error =
copyout((caddr_t)sv, (caddr_t)uap->osv, sizeof (vec));
if (u.u_error)
u.u_error =
copyout((caddr_t)sv, (caddr_t)uap->osv, sizeof (vec));
if (u.u_error)
register struct proc *p;
register int bit;
register struct proc *p;
register int bit;
p = u.u_procp;
/*
* Change setting atomically.
*/
p = u.u_procp;
/*
* Change setting atomically.
*/
u.u_signal[sig] = sv->sv_handler;
u.u_sigmask[sig] = sv->sv_mask &~ cantmask;
if (sv->sv_onstack)
u.u_signal[sig] = sv->sv_handler;
u.u_sigmask[sig] = sv->sv_mask &~ cantmask;
if (sv->sv_onstack)
} *uap = (struct a *)u.u_ap;
register struct proc *p = u.u_procp;
} *uap = (struct a *)u.u_ap;
register struct proc *p = u.u_procp;
u.u_r.r_val1 = p->p_sigmask;
u.u_r.r_val1 = p->p_sigmask;
- p->p_sigmask |= uap->sigmask &~ cantmask;
+ p->p_sigmask |= uap->mask &~ cantmask;
(void) spl0();
}
sigsetmask()
{
struct a {
(void) spl0();
}
sigsetmask()
{
struct a {
} *uap = (struct a *)u.u_ap;
register struct proc *p = u.u_procp;
} *uap = (struct a *)u.u_ap;
register struct proc *p = u.u_procp;
u.u_r.r_val1 = p->p_sigmask;
u.u_r.r_val1 = p->p_sigmask;
- p->p_sigmask = uap->sigmask &~ cantmask;
+ p->p_sigmask = uap->mask &~ cantmask;
(void) spl0();
}
sigpause()
{
struct a {
(void) spl0();
}
sigpause()
{
struct a {
} *uap = (struct a *)u.u_ap;
register struct proc *p = u.u_procp;
} *uap = (struct a *)u.u_ap;
register struct proc *p = u.u_procp;
*/
u.u_oldmask = p->p_sigmask;
p->p_flag |= SOMASK;
*/
u.u_oldmask = p->p_sigmask;
p->p_flag |= SOMASK;
- p->p_sigmask = uap->sigmask &~ cantmask;
+ p->p_sigmask = uap->mask &~ cantmask;
for (;;)
sleep((caddr_t)&u, PSLEP);
/*NOTREACHED*/
}
#undef cantmask
for (;;)
sleep((caddr_t)&u, PSLEP);
/*NOTREACHED*/
}
#undef cantmask
{
register int s;
register int (*action)();
{
register int s;
register int (*action)();
if ((unsigned)sig >= NSIG)
return;
if ((unsigned)sig >= NSIG)
return;
- sigmask = 1 << (sig-1);
/*
* If proc is traced, always give parent a chance.
/*
* If proc is traced, always give parent a chance.
* If the signal is being ignored,
* then we forget about it immediately.
*/
* If the signal is being ignored,
* then we forget about it immediately.
*/
- if (p->p_sigignore & sigmask)
+ if (p->p_sigignore & mask)
- if (p->p_sigmask & sigmask)
+ if (p->p_sigmask & mask)
- else if (p->p_sigcatch & sigmask)
+ else if (p->p_sigcatch & mask)
action = SIG_CATCH;
else
action = SIG_DFL;
}
action = SIG_CATCH;
else
action = SIG_DFL;
}
-#define mask(sig) (1<<(sig-1))
-#define stops (mask(SIGSTOP)|mask(SIGTSTP)|mask(SIGTTIN)|mask(SIGTTOU))
+#define stops (sigmask(SIGSTOP)|sigmask(SIGTSTP)| \
+ sigmask(SIGTTIN)|sigmask(SIGTTOU))
switch (sig) {
case SIGTERM:
switch (sig) {
case SIGTERM:
case SIGTSTP:
case SIGTTIN:
case SIGTTOU:
case SIGTSTP:
case SIGTTIN:
case SIGTTOU:
- p->p_sig &= ~mask(SIGCONT);
+ p->p_sig &= ~sigmask(SIGCONT);
#undef stops
/*
* Defer further processing for signals which are held.
*/
if (action == SIG_HOLD)
return;
#undef stops
/*
* Defer further processing for signals which are held.
*/
if (action == SIG_HOLD)
return;
switch (p->p_stat) {
case SSLEEP:
switch (p->p_stat) {
case SSLEEP:
*/
if (sig != SIGSTOP && p->p_pptr == &proc[1]) {
psignal(p, SIGKILL);
*/
if (sig != SIGSTOP && p->p_pptr == &proc[1]) {
psignal(p, SIGKILL);
*/
if (p->p_flag&SVFORK)
goto out;
*/
if (p->p_flag&SVFORK)
goto out;
p->p_cursig = sig;
stop(p);
goto out;
p->p_cursig = sig;
stop(p);
goto out;
*/
if (action != SIG_DFL)
goto run;
*/
if (action != SIG_DFL)
goto run;
- p->p_sig &= ~sigmask; /* take it away */
+ p->p_sig &= ~mask; /* take it away */
* Already stopped, don't need to stop again.
* (If we did the shell could get confused.)
*/
* Already stopped, don't need to stop again.
* (If we did the shell could get confused.)
*/
- p->p_sig &= ~sigmask; /* take it away */
+ p->p_sig &= ~mask; /* take it away */
{
register struct proc *p;
register int sig;
{
register struct proc *p;
register int sig;
p = u.u_procp;
for (;;) {
p = u.u_procp;
for (;;) {
if (sigbits == 0)
break;
sig = ffs(sigbits);
if (sigbits == 0)
break;
sig = ffs(sigbits);
- sigmask = 1 << (sig-1);
- p->p_sig &= ~sigmask; /* take the signal! */
+ mask = sigmask(sig);
+ p->p_sig &= ~mask; /* take the signal! */
p->p_cursig = sig;
if (p->p_flag&STRC && (p->p_flag&SVFORK) == 0) {
/*
p->p_cursig = sig;
if (p->p_flag&STRC && (p->p_flag&SVFORK) == 0) {
/*
* This ensures that p_sig* and u_signal are consistent.
*/
if ((p->p_flag&STRC) == 0) {
* This ensures that p_sig* and u_signal are consistent.
*/
if ((p->p_flag&STRC) == 0) {
* If signal is being masked put it back
* into p_sig and look for other signals.
*/
* If signal is being masked put it back
* into p_sig and look for other signals.
*/
- sigmask = 1 << (sig-1);
- if (p->p_sigmask & sigmask) {
- p->p_sig |= sigmask;
+ mask = sigmask(sig);
+ if (p->p_sigmask & mask) {
+ p->p_sig |= mask;
{
register struct proc *p = u.u_procp;
register int sig = p->p_cursig;
{
register struct proc *p = u.u_procp;
register int sig = p->p_cursig;
- int sigmask = 1 << (sig - 1), returnmask;
+ int mask = sigmask(sig), returnmask;
register int (*action)();
if (sig == 0)
panic("psig");
action = u.u_signal[sig];
if (action != SIG_DFL) {
register int (*action)();
if (sig == 0)
panic("psig");
action = u.u_signal[sig];
if (action != SIG_DFL) {
- if (action == SIG_IGN || (p->p_sigmask & sigmask))
+ if (action == SIG_IGN || (p->p_sigmask & mask))
panic("psig action");
u.u_error = 0;
/*
panic("psig action");
u.u_error = 0;
/*
* mask from before the sigpause is what we want restored
* after the signal processing is completed.
*/
* mask from before the sigpause is what we want restored
* after the signal processing is completed.
*/
if (p->p_flag & SOUSIG) {
if (sig != SIGILL && sig != SIGTRAP) {
u.u_signal[sig] = SIG_DFL;
if (p->p_flag & SOUSIG) {
if (sig != SIGILL && sig != SIGTRAP) {
u.u_signal[sig] = SIG_DFL;
- p->p_sigcatch &= ~sigmask;
+ p->p_sigcatch &= ~mask;
}
if (p->p_flag & SOMASK) {
returnmask = u.u_oldmask;
p->p_flag &= ~SOMASK;
} else
returnmask = p->p_sigmask;
}
if (p->p_flag & SOMASK) {
returnmask = u.u_oldmask;
p->p_flag &= ~SOMASK;
} else
returnmask = p->p_sigmask;
- p->p_sigmask |= u.u_sigmask[sig] | sigmask;
+ p->p_sigmask |= u.u_sigmask[sig] | mask;
(void) spl0();
u.u_ru.ru_nsignals++;
sendsig(action, sig, returnmask);
(void) spl0();
u.u_ru.ru_nsignals++;
sendsig(action, sig, returnmask);