From: Bill Joy Date: Tue, 25 Sep 1979 11:57:02 +0000 (-0800) Subject: BSD 3 development X-Git-Tag: BSD-3~878 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/0a63e3e8c9798ec805e0954784fa5b9cc8167c85 BSD 3 development Work on file usr/src/cmd/csh/sh.wait.c Synthesized-from: 3bsd --- diff --git a/usr/src/cmd/csh/sh.wait.c b/usr/src/cmd/csh/sh.wait.c new file mode 100644 index 0000000000..822bd503f7 --- /dev/null +++ b/usr/src/cmd/csh/sh.wait.c @@ -0,0 +1,228 @@ +/* Copyright (c) 1979 Regents of the University of California */ +#include "sh.h" + +/* + * C Shell + */ + +static struct tbuffer { +#ifdef V6 + int put, pst; +#else + time_t put, pst; +#endif + time_t cut, cst; +} times0; +time_t time0; + +long +secs(bef, aft) + struct tbuffer *bef, *aft; +{ + + return ((aft->cut - bef->cut + aft->cst - bef->cst)); +} + +settimes() +{ + + time(&time0); + times(×0); +} + +dotime(v, kp) + register char **v; + struct command *kp; +{ + struct tbuffer timeszer, timesdol, *tzp; + time_t timezer, timedol; + + if (v[1] != 0) { + time(&timezer), times(×zer); + lshift(v, 1); + if (func(kp) == 0) { + timflg = 1; + return (0); + } + tzp = ×zer; + } else + timezer = time0, tzp = ×0; + time(&timedol); + times(×dol); + ptimes(timedol - timezer, tzp, ×dol); + return (1); +} + +donice(v) + register char **v; +{ + register char *cp; + + v++, cp = *v++; + if (cp == 0) { +#ifndef V6 + nice(20); + nice(-10); +#endif + nice(4); + return (1); + } + if (*v == 0 && any(cp[0], "+-")) { +#ifndef V6 + nice(20); + nice(-10); +#endif + nice(getn(cp)); + return (1); + } + return (0); +} + +struct tbuffer bef, aft; +time_t btim, atim; + +pwait(i) + register int i; +{ + register int p, e; + char *name; + int s; + + if (i == 0) + return; + time(&btim); + do { + times(&bef); + p = wait(&s); + if (p == -1) + return; + times(&aft); + if (p == getn(value("child"))) + unsetv("child"); + time(&atim); + e = s & TRIM; + if (e > 0 && (e > 15 || mesg[e])) { + if (p != i) + printf("%d: ", p); + if (name = cname(p)) + printf("%s: ", name); + if (e <= 15) + printf(mesg[e]); + else + printf("Sig %d", e); + if (s & 0200) + printf(" -- Core dumped"); + printf("\n"); + } + if (e != 0 && i == p) { + cdone(p); + if (e == SIGINT && setintr && (!gointr || !eq(gointr, "-"))) + pintr(); + error(0); + } + if (i == p) { + set("status", putn(e ? e | QUOTE : (s >> 8) & 0377)); + if (exiterr && !eq(value("status"), "0")) { + if (e == 0) { + if (name = cname(p)) + printf("%s: ", name); + printf("Exit status %s\n", value("status")); + } + exitstat(); + } + cdone(p); + break; + } + cdone(p); + } while (i != p); + if (timflg || (!child && adrof("time") && secs(&bef, &aft) / 60 >= getn(value("time")))) { + timflg = 0; + ptimes(atim - btim, &bef, &aft); + } +} + +ptimes(sec, bef, aft) + time_t sec; + register struct tbuffer *bef, *aft; +{ + + p60ths(aft->cut - bef->cut); + printf("u "); + p60ths(aft->cst - bef->cst); + printf("s "); + psecs(sec); + printf(" %d%%\n", (int) ((100 * secs(bef, aft)) / (60 * (sec ? sec : 1)))); +} + +endwait() +{ + + signal(SIGINT, SIG_IGN); + cleft(); + bferr("Interrupted"); +} + +await() +{ + if (setintr) + signal(SIGINT, endwait); + pwait(-1); + if (setintr) + signal(SIGINT, SIG_IGN); +} + +struct achild { + int pid; + char *cname; + struct achild *cnext; +} children; + +char * +cname(pid) + int pid; +{ + register struct achild *cp; + + for (cp = children.cnext; cp; cp = cp->cnext) + if (cp->pid == pid) + return (cp->cname); + return (NOSTR); +} + +cadd(pid, cname) + int pid; + char *cname; +{ + register struct achild *cp = (struct achild *) calloc(1, sizeof (struct achild)); + + cp->pid = pid; + cp->cname = savestr(cname); + cp->cnext = children.cnext; + children.cnext = cp; +} + +cdone(pid) + int pid; +{ + register struct achild *cpp, *cp; + + cpp = &children; + for (cp = cpp->cnext; cp; cp = cp->cnext) { + if (cp->pid == pid) { + xfree(cp->cname); + cpp->cnext = cp->cnext; + xfree(cp); + return; + } + cpp = cp; + } +} + +cleft() +{ + + register struct achild *cp; + + for (cp = children.cnext; cp; cp = cp->cnext) + printf("%6d %s\n", cp->pid, cp->cname); +}