include fixes
[unix-history] / usr / src / bin / csh / proc.c
index fdf3b69..ee9735d 100644 (file)
@@ -1,9 +1,9 @@
-static char *sccsid = "@(#)proc.c      4.6 (Berkeley) 81/05/03";
+static char *sccsid = "@(#)proc.c      4.12 (Berkeley) 83/07/01";
 
 #include "sh.h"
 #include "sh.dir.h"
 #include "sh.proc.h"
 
 #include "sh.h"
 #include "sh.dir.h"
 #include "sh.proc.h"
-#include <wait.h>
+#include <sys/wait.h>
 #include <sys/ioctl.h>
 
 /*
 #include <sys/ioctl.h>
 
 /*
@@ -26,19 +26,13 @@ pchild()
        register int pid;
        union wait w;
        int jobflags;
        register int pid;
        union wait w;
        int jobflags;
-#ifdef VMUNIX
-       struct vtimes vt;
-#endif
+       struct rusage ru;
 
        if (!timesdone)
                timesdone++, times(&shtimes);
 loop:
        pid = wait3(&w.w_status, (setintr ? WNOHANG|WUNTRACED:WNOHANG),
 
        if (!timesdone)
                timesdone++, times(&shtimes);
 loop:
        pid = wait3(&w.w_status, (setintr ? WNOHANG|WUNTRACED:WNOHANG),
-#ifndef VMUNIX
-           0);
-#else
-           &vt);
-#endif
+           &ru);
        if (pid <= 0) {
                if (errno == EINTR) {
                        errno = 0;
        if (pid <= 0) {
                if (errno == EINTR) {
                        errno = 0;
@@ -63,15 +57,13 @@ found:
                        time_t oldcutimes, oldcstimes;
                        oldcutimes = shtimes.tms_cutime;
                        oldcstimes = shtimes.tms_cstime;
                        time_t oldcutimes, oldcstimes;
                        oldcutimes = shtimes.tms_cutime;
                        oldcstimes = shtimes.tms_cstime;
-                       time(&pp->p_etime);
+                       gettimeofday(&pp->p_etime, (struct timezone *)0);
                        times(&shtimes);
                        pp->p_utime = shtimes.tms_cutime - oldcutimes;
                        pp->p_stime = shtimes.tms_cstime - oldcstimes;
                } else
                        times(&shtimes);
                        times(&shtimes);
                        pp->p_utime = shtimes.tms_cutime - oldcutimes;
                        pp->p_stime = shtimes.tms_cstime - oldcstimes;
                } else
                        times(&shtimes);
-#ifdef VMUNIX
-               pp->p_vtimes = vt;
-#endif
+               pp->p_rusage = ru;
                if (WIFSIGNALED(w)) {
                        if (w.w_termsig == SIGINT)
                                pp->p_flags |= PINTERRUPTED;
                if (WIFSIGNALED(w)) {
                        if (w.w_termsig == SIGINT)
                                pp->p_flags |= PINTERRUPTED;
@@ -82,11 +74,7 @@ found:
                        pp->p_reason = w.w_termsig;
                } else {
                        pp->p_reason = w.w_retcode;
                        pp->p_reason = w.w_termsig;
                } else {
                        pp->p_reason = w.w_retcode;
-#ifdef IIASA
-                       if (pp->p_reason >= 3)
-#else
                        if (pp->p_reason != 0)
                        if (pp->p_reason != 0)
-#endif
                                pp->p_flags |= PAEXITED;
                        else
                                pp->p_flags |= PNEXITED;
                                pp->p_flags |= PAEXITED;
                        else
                                pp->p_flags |= PNEXITED;
@@ -204,6 +192,8 @@ pjwait(pp)
        register struct process *fp;
        int jobflags, reason;
 
        register struct process *fp;
        int jobflags, reason;
 
+       while (pp->p_pid != pp->p_jobid)
+               pp = pp->p_friends;
        fp = pp;
        do {
                if ((fp->p_flags&(PFOREGND|PRUNNING)) == PRUNNING)
        fp = pp;
        do {
                if ((fp->p_flags&(PFOREGND|PRUNNING)) == PRUNNING)
@@ -222,7 +212,7 @@ pjwait(pp)
                while((fp = (fp->p_friends)) != pp);
                if ((jobflags & PRUNNING) == 0)
                        break;
                while((fp = (fp->p_friends)) != pp);
                if ((jobflags & PRUNNING) == 0)
                        break;
-               sigpause(SIGCHLD);
+               sigpause(sigblock(0) &~ mask(SIGCHLD));
        }
        sigrelse(SIGCHLD);
        if (tpgrp > 0)
        }
        sigrelse(SIGCHLD);
        if (tpgrp > 0)
@@ -266,9 +256,9 @@ dowait()
 loop:
        sighold(SIGCHLD);
        for (pp = proclist.p_next; pp; pp = pp->p_next)
 loop:
        sighold(SIGCHLD);
        for (pp = proclist.p_next; pp; pp = pp->p_next)
-               if (pp->p_pid && pp->p_pid == pp->p_jobid &&
+               if (pp->p_pid && /* pp->p_pid == pp->p_jobid && */
                    pp->p_flags&PRUNNING) {
                    pp->p_flags&PRUNNING) {
-                       sigpause(SIGCHLD);
+                       sigpause(sigblock(0) &~ mask(SIGCHLD));
                        goto loop;
                }
        sigrelse(SIGCHLD);
                        goto loop;
                }
        sigrelse(SIGCHLD);
@@ -410,7 +400,7 @@ palloc(pid, t)
        }
        pp->p_next = proclist.p_next;
        proclist.p_next = pp;
        }
        pp->p_next = proclist.p_next;
        proclist.p_next = pp;
-       time(&pp->p_btime);
+       gettimeofday(&pp->p_btime, (struct timezone *)0);
 }
 
 padd(t)
 }
 
 padd(t)
@@ -632,11 +622,10 @@ prcomd:
                if (pp->p_flags&PPTIME && !(status&(PSTOPPED|PRUNNING))) {
                        if (linp != linbuf)
                                printf("\n\t");
                if (pp->p_flags&PPTIME && !(status&(PSTOPPED|PRUNNING))) {
                        if (linp != linbuf)
                                printf("\n\t");
-#ifndef VMUNIX
-                       ptimes(pp->p_utime, pp->p_stime, pp->p_etime-pp->p_btime);
-#else
-                       pvtimes(&zvms, &pp->p_vtimes, pp->p_etime - pp->p_btime);
-#endif
+                       { static struct rusage zru;
+                         prusage(&zru, &pp->p_rusage, &pp->p_etime,
+                           &pp->p_btime);
+                       }
                }
                if (tp == pp->p_friends) {
                        if (linp != linbuf)
                }
                if (tp == pp->p_friends) {
                        if (linp != linbuf)
@@ -659,30 +648,21 @@ prcomd:
 ptprint(tp)
        register struct process *tp;
 {
 ptprint(tp)
        register struct process *tp;
 {
-       time_t tetime = 0;
-#ifdef VMUNIX
-       struct vtimes vmt;
-#else
-       time_t tutime = 0, tstime = 0;
-#endif
+       struct timeval tetime, diff;
+       static struct timeval ztime;
+       struct rusage ru;
+       static struct rusage zru;
        register struct process *pp = tp;
 
        register struct process *pp = tp;
 
-       vmt = zvms;
+       ru = zru;
+       tetime = ztime;
        do {
        do {
-#ifdef VMUNIX
-               vmsadd(&vmt, &pp->p_vtimes);
-#else
-               tutime += pp->p_utime;
-               tstime += pp->p_stime;
-#endif
-               if (pp->p_etime - pp->p_btime > tetime)
-                       tetime = pp->p_etime - pp->p_btime;
+               ruadd(&ru, &pp->p_rusage);
+               tvsub(&diff, &pp->p_etime, &pp->p_btime);
+               if (timercmp(&diff, &tetime, >))
+                       tetime = diff;
        } while ((pp = pp->p_friends) != tp);
        } while ((pp = pp->p_friends) != tp);
-#ifdef VMUNIX
-       pvtimes(&zvms, &vmt, tetime);
-#else
-       ptimes(tutime, tstime, tetime);
-#endif
+       prusage(&zru, &ru, &tetime, &ztime);
 }
 
 /*
 }
 
 /*
@@ -833,6 +813,7 @@ pkill(v, signum)
        register struct process *pp, *np;
        register int jobflags = 0;
        int pid;
        register struct process *pp, *np;
        register int jobflags = 0;
        int pid;
+       char *cp;
        extern char *sys_errlist[];
        int err = 0;
 
        extern char *sys_errlist[];
        int err = 0;
 
@@ -840,8 +821,9 @@ pkill(v, signum)
                sighold(SIGINT);
        sighold(SIGCHLD);
        while (*v) {
                sighold(SIGINT);
        sighold(SIGCHLD);
        while (*v) {
-               if (**v == '%') {
-                       np = pp = pfind(*v);
+               cp = globone(*v);
+               if (*cp == '%') {
+                       np = pp = pfind(cp);
                        do
                                jobflags |= np->p_flags;
                        while ((np = np->p_friends) != pp);
                        do
                                jobflags |= np->p_flags;
                        while ((np = np->p_friends) != pp);
@@ -852,7 +834,7 @@ pkill(v, signum)
                        case SIGTTIN:
                        case SIGTTOU:
                                if ((jobflags & PRUNNING) == 0) {
                        case SIGTTIN:
                        case SIGTTOU:
                                if ((jobflags & PRUNNING) == 0) {
-                                       printf("%s: Already stopped\n", *v);
+                                       printf("%s: Already stopped\n", cp);
                                        err++;
                                        goto cont;
                                }
                                        err++;
                                        goto cont;
                                }
@@ -860,10 +842,10 @@ pkill(v, signum)
                        killpg(pp->p_jobid, signum);
                        if (signum == SIGTERM || signum == SIGHUP)
                                killpg(pp->p_jobid, SIGCONT);
                        killpg(pp->p_jobid, signum);
                        if (signum == SIGTERM || signum == SIGHUP)
                                killpg(pp->p_jobid, SIGCONT);
-               } else if (!digit(**v))
+               } else if (!digit(*cp))
                        bferr("Arguments should be jobs or process id's");
                else {
                        bferr("Arguments should be jobs or process id's");
                else {
-                       pid = atoi(*v);
+                       pid = atoi(cp);
                        if (kill(pid, signum) < 0) {
                                printf("%d: ", pid);
                                printf("%s\n", sys_errlist[errno]);
                        if (kill(pid, signum) < 0) {
                                printf("%d: ", pid);
                                printf("%s\n", sys_errlist[errno]);
@@ -874,6 +856,7 @@ pkill(v, signum)
                                kill(pid, SIGCONT);
                }
 cont:
                                kill(pid, SIGCONT);
                }
 cont:
+               xfree(cp);
                v++;
        }
        sigrelse(SIGCHLD);
                v++;
        }
        sigrelse(SIGCHLD);