different approach, try signal compatibility package
[unix-history] / usr / src / bin / csh / proc.c
index 8a64ea1..3ad725f 100644 (file)
@@ -1,4 +1,4 @@
-static char *sccsid = "@(#)proc.c      4.9 (Berkeley) 83/06/10";
+static char *sccsid = "@(#)proc.c      4.10 (Berkeley) 83/06/11";
 
 #include "sh.h"
 #include "sh.dir.h"
 
 #include "sh.h"
 #include "sh.dir.h"
@@ -144,12 +144,12 @@ pnote()
        neednote = 0;
        for (pp = proclist.p_next; pp != PNULL; pp = pp->p_next) {
                if (pp->p_flags & PNEEDNOTE) {
        neednote = 0;
        for (pp = proclist.p_next; pp != PNULL; pp = pp->p_next) {
                if (pp->p_flags & PNEEDNOTE) {
-                       (void) sigblock(mask(SIGCHLD));
+                       sighold(SIGCHLD);
                        pp->p_flags &= ~PNEEDNOTE;
                        flags = pprint(pp, NUMBER|NAME|REASON);
                        if ((flags&(PRUNNING|PSTOPPED)) == 0)
                                pflush(pp);
                        pp->p_flags &= ~PNEEDNOTE;
                        flags = pprint(pp, NUMBER|NAME|REASON);
                        if ((flags&(PRUNNING|PSTOPPED)) == 0)
                                pflush(pp);
-                       (void) sigrelse(mask(SIGCHLD));
+                       sigrelse(SIGCHLD);
                }
        }
 }
                }
        }
 }
@@ -165,7 +165,7 @@ pwait()
        /*
         * Here's where dead procs get flushed.
         */
        /*
         * Here's where dead procs get flushed.
         */
-       (void) sigblock(mask(SIGCHLD));
+       sighold(SIGCHLD);
        for (pp = (fp = &proclist)->p_next; pp != PNULL; pp = (fp = pp)->p_next)
                if (pp->p_pid == 0) {
                        fp->p_next = pp->p_next;
        for (pp = (fp = &proclist)->p_next; pp != PNULL; pp = (fp = pp)->p_next)
                if (pp->p_pid == 0) {
                        fp->p_next = pp->p_next;
@@ -176,11 +176,9 @@ pwait()
                        xfree((char *)pp);
                        pp = fp;
                }
                        xfree((char *)pp);
                        pp = fp;
                }
-       (void) sigrelse(mask(SIGCHLD));
-#ifdef notdef
+       sigrelse(SIGCHLD);
        if (setintr)
        if (setintr)
-               signal(SIGINT, SIG_IGN);
-#endif
+               sigignore(SIGINT);
        pjwait(pcurrjob);
 }
 
        pjwait(pcurrjob);
 }
 
@@ -192,7 +190,7 @@ pjwait(pp)
        register struct process *pp;
 {
        register struct process *fp;
        register struct process *pp;
 {
        register struct process *fp;
-       int jobflags, reason, omask;
+       int jobflags, reason;
 
        fp = pp;
        do {
 
        fp = pp;
        do {
@@ -204,17 +202,17 @@ pjwait(pp)
         * and the target process, or any of its friends, are running
         */
        fp = pp;
         * and the target process, or any of its friends, are running
         */
        fp = pp;
-       omask = sigblock(mask(SIGCHLD));
        for (;;) {
        for (;;) {
+               sighold(SIGCHLD);
                jobflags = 0;
                do
                        jobflags |= fp->p_flags;
                while((fp = (fp->p_friends)) != pp);
                if ((jobflags & PRUNNING) == 0)
                        break;
                jobflags = 0;
                do
                        jobflags |= fp->p_flags;
                while((fp = (fp->p_friends)) != pp);
                if ((jobflags & PRUNNING) == 0)
                        break;
-               sigpause(omask &~ mask(SIGCHLD));
+               sigpause(sigblock(0) &~ mask(SIGCHLD));
        }
        }
-       sigsetmask(omask);
+       sigrelse(SIGCHLD);
        if (tpgrp > 0)
                ioctl(FSHTTY, TIOCSPGRP, &tpgrp);       /* get tty back */
        if ((jobflags&(PSIGNALED|PSTOPPED|PTIME)) ||
        if (tpgrp > 0)
                ioctl(FSHTTY, TIOCSPGRP, &tpgrp);       /* get tty back */
        if ((jobflags&(PSIGNALED|PSTOPPED|PTIME)) ||
@@ -249,20 +247,19 @@ pjwait(pp)
 dowait()
 {
        register struct process *pp;
 dowait()
 {
        register struct process *pp;
-       int omask;
 
        pjobs++;
        if (setintr)
 
        pjobs++;
        if (setintr)
-               (void) sigrelse(mask(SIGINT));
-       omask = sigblock(mask(SIGCHLD));
+               sigrelse(SIGINT);
 loop:
 loop:
+       sighold(SIGCHLD);
        for (pp = proclist.p_next; pp; pp = pp->p_next)
                if (pp->p_pid && pp->p_pid == pp->p_jobid &&
                    pp->p_flags&PRUNNING) {
        for (pp = proclist.p_next; pp; pp = pp->p_next)
                if (pp->p_pid && pp->p_pid == pp->p_jobid &&
                    pp->p_flags&PRUNNING) {
-                       sigpause(omask &~ mask(SIGCHLD));
+                       sigpause(sigblock(0) &~ mask(SIGCHLD));
                        goto loop;
                }
                        goto loop;
                }
-       sigsetmask(omask);
+       sigrelse(SIGCHLD);
        pjobs = 0;
 }
 
        pjobs = 0;
 }
 
@@ -707,7 +704,7 @@ dofg(v)
                pp = pfind(*v);
                pstart(pp, 1);
                if (setintr)
                pp = pfind(*v);
                pstart(pp, 1);
                if (setintr)
-                       signal(SIGINT, SIG_IGN);
+                       sigignore(SIGINT);
                pjwait(pp);
        } while (*v && *++v);
 }
                pjwait(pp);
        } while (*v && *++v);
 }
@@ -724,7 +721,7 @@ dofg1(v)
        pp = pfind(v[0]);
        pstart(pp, 1);
        if (setintr)
        pp = pfind(v[0]);
        pstart(pp, 1);
        if (setintr)
-               signal(SIGINT, SIG_IGN);
+               sigignore(SIGINT);
        pjwait(pp);
 }
 
        pjwait(pp);
 }
 
@@ -815,12 +812,11 @@ pkill(v, signum)
        register int jobflags = 0;
        int pid;
        extern char *sys_errlist[];
        register int jobflags = 0;
        int pid;
        extern char *sys_errlist[];
-       int err = 0, omask = 0;
+       int err = 0;
 
        if (setintr)
 
        if (setintr)
-               omask |= mask(SIGINT);
-       omask |= mask(SIGCHLD);
-       omask = sigblock(omask);
+               sighold(SIGINT);
+       sighold(SIGCHLD);
        while (*v) {
                if (**v == '%') {
                        np = pp = pfind(*v);
        while (*v) {
                if (**v == '%') {
                        np = pp = pfind(*v);
@@ -858,7 +854,9 @@ pkill(v, signum)
 cont:
                v++;
        }
 cont:
                v++;
        }
-       sigsetmask(omask);
+       sigrelse(SIGCHLD);
+       if (setintr)
+               sigrelse(SIGINT);
        if (err)
                error(NOSTR);
 }
        if (err)
                error(NOSTR);
 }
@@ -873,7 +871,7 @@ pstart(pp, foregnd)
        register struct process *np;
        int jobflags = 0;
 
        register struct process *np;
        int jobflags = 0;
 
-       (void) sigblock(mask(SIGCHLD));
+       sighold(SIGCHLD);
        np = pp;
        do {
                jobflags |= np->p_flags;
        np = pp;
        do {
                jobflags |= np->p_flags;
@@ -893,7 +891,7 @@ pstart(pp, foregnd)
                ioctl(FSHTTY, TIOCSPGRP, &pp->p_jobid);
        if (jobflags&PSTOPPED)
                killpg(pp->p_jobid, SIGCONT);
                ioctl(FSHTTY, TIOCSPGRP, &pp->p_jobid);
        if (jobflags&PSTOPPED)
                killpg(pp->p_jobid, SIGCONT);
-       (void) sigrelse(mask(SIGCHLD));
+       sigrelse(SIGCHLD);
 }
 
 panystop(neednl)
 }
 
 panystop(neednl)
@@ -1005,7 +1003,7 @@ pfork(t, wanttty)
 {
        register int pid;
        bool ignint = 0;
 {
        register int pid;
        bool ignint = 0;
-       int pgrp, omask;
+       int pgrp;
 
        /*
         * A child will be uninterruptible only under very special
 
        /*
         * A child will be uninterruptible only under very special
@@ -1022,12 +1020,13 @@ pfork(t, wanttty)
        /*
         * Hold SIGCHLD until we have the process installed in our table.
         */
        /*
         * Hold SIGCHLD until we have the process installed in our table.
         */
-       (void) sigblock(mask(SIGCHLD));
+       sighold(SIGCHLD);
        while ((pid = fork()) < 0)
                if (setintr == 0)
                        sleep(FORKSLEEP);
                else {
        while ((pid = fork()) < 0)
                if (setintr == 0)
                        sleep(FORKSLEEP);
                else {
-                       (void) sigrelse(mask(SIGINT)|mask(SIGCHLD));
+                       sigrelse(SIGINT);
+                       sigrelse(SIGCHLD);
                        error("No more processes");
                }
        if (pid == 0) {
                        error("No more processes");
                }
        if (pid == 0) {
@@ -1039,7 +1038,7 @@ pfork(t, wanttty)
                child++;
                if (setintr) {
                        setintr = 0;            /* until I think otherwise */
                child++;
                if (setintr) {
                        setintr = 0;            /* until I think otherwise */
-                       (void) sigrelse(mask(SIGCHLD));
+                       sigrelse(SIGCHLD);
                        /*
                         * Children just get blown away on SIGINT, SIGQUIT
                         * unless "onintr -" seen.
                        /*
                         * Children just get blown away on SIGINT, SIGQUIT
                         * unless "onintr -" seen.
@@ -1077,11 +1076,10 @@ pfork(t, wanttty)
 */
                        nice(t->t_nice);
                }
 */
                        nice(t->t_nice);
                }
-               sigrelse(mask(SIGINT));
 
        } else {
                palloc(pid, t);
 
        } else {
                palloc(pid, t);
-               (void) sigrelse(mask(SIGCHLD));
+               sigrelse(SIGCHLD);
        }
 
        return (pid);
        }
 
        return (pid);
@@ -1095,12 +1093,3 @@ okpcntl()
        if (tpgrp == 0)
                error("No job control in subshells");
 }
        if (tpgrp == 0)
                error("No job control in subshells");
 }
-
-/*
- * For "compatibility".
- */
-sigrelse(m)
-{
-
-       return (sigsetmask(sigblock(0) &~ m));
-}