|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: #include "sh.h" ! 3: ! 4: /* ! 5: * C Shell ! 6: */ ! 7: ! 8: static struct tbuffer { ! 9: #ifdef V6 ! 10: int put, pst; ! 11: #else ! 12: time_t put, pst; ! 13: #endif ! 14: time_t cut, cst; ! 15: } times0; ! 16: time_t time0; ! 17: ! 18: long ! 19: secs(bef, aft) ! 20: struct tbuffer *bef, *aft; ! 21: { ! 22: ! 23: return ((aft->cut - bef->cut + aft->cst - bef->cst)); ! 24: } ! 25: ! 26: settimes() ! 27: { ! 28: ! 29: time(&time0); ! 30: times(×0); ! 31: } ! 32: ! 33: dotime(v, kp) ! 34: register char **v; ! 35: struct command *kp; ! 36: { ! 37: struct tbuffer timeszer, timesdol, *tzp; ! 38: time_t timezer, timedol; ! 39: ! 40: if (v[1] != 0) { ! 41: time(&timezer), times(×zer); ! 42: lshift(v, 1); ! 43: if (func(kp) == 0) { ! 44: timflg = 1; ! 45: return (0); ! 46: } ! 47: tzp = ×zer; ! 48: } else ! 49: timezer = time0, tzp = ×0; ! 50: time(&timedol); ! 51: times(×dol); ! 52: ptimes(timedol - timezer, tzp, ×dol); ! 53: return (1); ! 54: } ! 55: ! 56: donice(v) ! 57: register char **v; ! 58: { ! 59: register char *cp; ! 60: ! 61: v++, cp = *v++; ! 62: if (cp == 0) { ! 63: #ifndef V6 ! 64: nice(20); ! 65: nice(-10); ! 66: #endif ! 67: nice(4); ! 68: return (1); ! 69: } ! 70: if (*v == 0 && any(cp[0], "+-")) { ! 71: #ifndef V6 ! 72: nice(20); ! 73: nice(-10); ! 74: #endif ! 75: nice(getn(cp)); ! 76: return (1); ! 77: } ! 78: return (0); ! 79: } ! 80: ! 81: struct tbuffer bef, aft; ! 82: time_t btim, atim; ! 83: ! 84: pwait(i) ! 85: register int i; ! 86: { ! 87: register int p, e; ! 88: char *name; ! 89: int s; ! 90: ! 91: if (i == 0) ! 92: return; ! 93: time(&btim); ! 94: do { ! 95: times(&bef); ! 96: p = wait(&s); ! 97: if (p == -1) ! 98: return; ! 99: times(&aft); ! 100: if (p == getn(value("child"))) ! 101: unsetv("child"); ! 102: time(&atim); ! 103: e = s & TRIM; ! 104: if (e > 0 && (e > 15 || mesg[e])) { ! 105: if (p != i) ! 106: printf("%d: ", p); ! 107: if (name = cname(p)) ! 108: printf("%s: ", name); ! 109: if (e <= 15) ! 110: printf(mesg[e]); ! 111: else ! 112: printf("Sig %d", e); ! 113: if (s & 0200) ! 114: printf(" -- Core dumped"); ! 115: printf("\n"); ! 116: } ! 117: if (e != 0 && i == p) { ! 118: cdone(p); ! 119: if (e == SIGINT && setintr && (!gointr || !eq(gointr, "-"))) ! 120: pintr(); ! 121: error(0); ! 122: } ! 123: if (i == p) { ! 124: set("status", putn(e ? e | QUOTE : (s >> 8) & 0377)); ! 125: if (exiterr && !eq(value("status"), "0")) { ! 126: if (e == 0) { ! 127: if (name = cname(p)) ! 128: printf("%s: ", name); ! 129: printf("Exit status %s\n", value("status")); ! 130: } ! 131: exitstat(); ! 132: } ! 133: cdone(p); ! 134: break; ! 135: } ! 136: cdone(p); ! 137: } while (i != p); ! 138: if (timflg || (!child && adrof("time") && secs(&bef, &aft) / 60 >= getn(value("time")))) { ! 139: timflg = 0; ! 140: ptimes(atim - btim, &bef, &aft); ! 141: } ! 142: } ! 143: ! 144: ptimes(sec, bef, aft) ! 145: time_t sec; ! 146: register struct tbuffer *bef, *aft; ! 147: { ! 148: ! 149: p60ths(aft->cut - bef->cut); ! 150: printf("u "); ! 151: p60ths(aft->cst - bef->cst); ! 152: printf("s "); ! 153: psecs(sec); ! 154: printf(" %d%%\n", (int) ((100 * secs(bef, aft)) / (60 * (sec ? sec : 1)))); ! 155: } ! 156: ! 157: endwait() ! 158: { ! 159: ! 160: signal(SIGINT, SIG_IGN); ! 161: cleft(); ! 162: bferr("Interrupted"); ! 163: } ! 164: ! 165: await() ! 166: { ! 167: if (setintr) ! 168: signal(SIGINT, endwait); ! 169: pwait(-1); ! 170: if (setintr) ! 171: signal(SIGINT, SIG_IGN); ! 172: } ! 173: ! 174: struct achild { ! 175: int pid; ! 176: char *cname; ! 177: struct achild *cnext; ! 178: } children; ! 179: ! 180: char * ! 181: cname(pid) ! 182: int pid; ! 183: { ! 184: register struct achild *cp; ! 185: ! 186: for (cp = children.cnext; cp; cp = cp->cnext) ! 187: if (cp->pid == pid) ! 188: return (cp->cname); ! 189: return (NOSTR); ! 190: } ! 191: ! 192: cadd(pid, cname) ! 193: int pid; ! 194: char *cname; ! 195: { ! 196: register struct achild *cp = (struct achild *) calloc(1, sizeof (struct achild)); ! 197: ! 198: cp->pid = pid; ! 199: cp->cname = savestr(cname); ! 200: cp->cnext = children.cnext; ! 201: children.cnext = cp; ! 202: } ! 203: ! 204: cdone(pid) ! 205: int pid; ! 206: { ! 207: register struct achild *cpp, *cp; ! 208: ! 209: cpp = &children; ! 210: for (cp = cpp->cnext; cp; cp = cp->cnext) { ! 211: if (cp->pid == pid) { ! 212: xfree(cp->cname); ! 213: cpp->cnext = cp->cnext; ! 214: xfree(cp); ! 215: return; ! 216: } ! 217: cpp = cp; ! 218: } ! 219: } ! 220: ! 221: cleft() ! 222: { ! 223: ! 224: register struct achild *cp; ! 225: ! 226: for (cp = children.cnext; cp; cp = cp->cnext) ! 227: printf("%6d %s\n", cp->pid, cp->cname); ! 228: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.