add another bit to sigvec() flags to disable system call restart
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Wed, 13 Mar 1985 05:53:29 +0000 (21:53 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Wed, 13 Mar 1985 05:53:29 +0000 (21:53 -0800)
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

usr/src/sys/kern/kern_exit.c
usr/src/sys/kern/kern_sig.c
usr/src/sys/kern/kern_xxx.c
usr/src/sys/kern/sys_generic.c

index 6283bfe..2435042 100644 (file)
@@ -1,4 +1,4 @@
-/*     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"
@@ -250,7 +250,11 @@ loop:
                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);
        }
index 8be5ef4..6055cdf 100644 (file)
@@ -1,4 +1,4 @@
-/*     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"
@@ -37,6 +37,7 @@ sigvec()
        struct sigvec vec;
        register struct sigvec *sv;
        register int sig;
        struct sigvec vec;
        register struct sigvec *sv;
        register int sig;
+       int bit;
 
        sig = uap->signo;
        if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
 
        sig = uap->signo;
        if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
@@ -47,7 +48,12 @@ sigvec()
        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)
@@ -81,7 +87,11 @@ setsigvec(sig, sv)
        (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_onstack)
+       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;
index d39feb3..c20933a 100644 (file)
@@ -1,4 +1,4 @@
-/*     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"
@@ -341,7 +341,7 @@ ossig()
                return;
        }
        sv->sv_mask = 0;
                return;
        }
        sv->sv_mask = 0;
-       sv->sv_onstack = 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 */
index 272d399..46a9f89 100644 (file)
@@ -1,4 +1,4 @@
-/*     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"
@@ -130,9 +130,14 @@ rwuio(uio, rw)
        }
        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;