Annotation of 40BSD/cmd/oldcsh/sh.wait.c, revision 1.1.1.1

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(&times0);
                     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(&timeszer);
                     42:                lshift(v, 1);
                     43:                if (func(kp) == 0) {
                     44:                        timflg = 1;
                     45:                        return (0);
                     46:                }
                     47:                tzp = &timeszer;
                     48:        } else
                     49:                timezer = time0, tzp = &times0;
                     50:        time(&timedol);
                     51:        times(&timesdol);
                     52:        ptimes(timedol - timezer, tzp, &timesdol);
                     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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.