SCCS-vsn: sys/kern/kern_sig.c 6.11
SCCS-vsn: sys/kern/sys_generic.c 6.8
SCCS-vsn: sys/kern/kern_exit.c 6.6
SCCS-vsn: sys/kern/kern_xxx.c 6.3
-/* kern_exit.c 6.5 84/12/20 */
+/* kern_exit.c 6.6 85/03/12 */
#include "../machine/reg.h"
#include "../machine/psl.h"
#include "../machine/reg.h"
#include "../machine/psl.h"
u.u_r.r_val1 = 0;
return (0);
}
u.u_r.r_val1 = 0;
return (0);
}
- if ((u.u_procp->p_flag&SOUSIG) == 0 && setjmp(&u.u_qsave)) {
+ if (setjmp(&u.u_qsave)) {
+ p = u.u_procp;
+ if ((u.u_sigintr & sigmask(p->p_cursig)) != 0 ||
+ (p->p_flag & SOUSIG) != 0)
+ return(EINTR);
u.u_eosys = RESTARTSYS;
return (0);
}
u.u_eosys = RESTARTSYS;
return (0);
}
-/* kern_sig.c 6.10 85/03/12 */
+/* kern_sig.c 6.11 85/03/12 */
#include "../machine/reg.h"
#include "../machine/pte.h"
#include "../machine/reg.h"
#include "../machine/pte.h"
struct sigvec vec;
register struct sigvec *sv;
register int sig;
struct sigvec vec;
register struct sigvec *sv;
register int sig;
sig = uap->signo;
if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
sig = uap->signo;
if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
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 & sigmask(sig)) != 0;
+ bit = sigmask(sig);
+ sv->sv_flags = 0;
+ if ((u.u_sigonstack & bit) != 0)
+ sv->sv_flags |= SV_ONSTACK;
+ if ((u.u_sigintr & bit) != 0)
+ sv->sv_flags |= SV_INTERRUPT;
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)
(void) splhigh();
u.u_signal[sig] = sv->sv_handler;
u.u_sigmask[sig] = sv->sv_mask &~ cantmask;
(void) splhigh();
u.u_signal[sig] = sv->sv_handler;
u.u_sigmask[sig] = sv->sv_mask &~ cantmask;
+ if (sv->sv_flags & SV_INTERRUPT)
+ u.u_sigintr |= bit;
+ else
+ u.u_sigintr &= ~bit;
+ if (sv->sv_flags & SV_ONSTACK)
u.u_sigonstack |= bit;
else
u.u_sigonstack &= ~bit;
u.u_sigonstack |= bit;
else
u.u_sigonstack &= ~bit;
-/* kern_xxx.c 6.2 84/08/29 */
+/* kern_xxx.c 6.3 85/03/12 */
#include "param.h"
#include "systm.h"
#include "param.h"
#include "systm.h"
return;
}
sv->sv_mask = 0;
return;
}
sv->sv_mask = 0;
+ sv->sv_flags = SV_INTERRUPT;
u.u_r.r_val1 = (int)u.u_signal[a];
setsigvec(a, sv);
p->p_flag |= SOUSIG; /* mark as simulating old stuff */
u.u_r.r_val1 = (int)u.u_signal[a];
setsigvec(a, sv);
p->p_flag |= SOUSIG; /* mark as simulating old stuff */
-/* sys_generic.c 6.7 85/02/08 */
+/* sys_generic.c 6.8 85/03/12 */
#include "param.h"
#include "systm.h"
#include "param.h"
#include "systm.h"
}
count = uio->uio_resid;
uio->uio_offset = fp->f_offset;
}
count = uio->uio_resid;
uio->uio_offset = fp->f_offset;
- if ((u.u_procp->p_flag&SOUSIG) == 0 && setjmp(&u.u_qsave)) {
- if (uio->uio_resid == count)
- u.u_eosys = RESTARTSYS;
+ if (setjmp(&u.u_qsave)) {
+ if (uio->uio_resid == count) {
+ if ((u.u_sigintr & sigmask(u.u_procp->p_cursig)) != 0 ||
+ (u.u_procp->p_flag & SOUSIG) != 0)
+ u.u_error = EINTR;
+ else
+ u.u_eosys = RESTARTSYS;
+ }
} else
u.u_error = (*fp->f_ops->fo_rw)(fp, rw, uio);
u.u_r.r_val1 = count - uio->uio_resid;
} else
u.u_error = (*fp->f_ops->fo_rw)(fp, rw, uio);
u.u_r.r_val1 = count - uio->uio_resid;