|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)cmds.c 5.7 (Berkeley) 3/12/90"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * Command support. ! 13: */ ! 14: ! 15: #include "systat.h" ! 16: #include <ctype.h> ! 17: ! 18: command(cmd) ! 19: char *cmd; ! 20: { ! 21: register char *cp; ! 22: register struct cmdtab *p; ! 23: int interval, omask; ! 24: ! 25: omask = sigblock(sigmask(SIGALRM)); ! 26: for (cp = cmd; *cp && !isspace(*cp); cp++) ! 27: ; ! 28: if (*cp) ! 29: *cp++ = '\0'; ! 30: if (*cmd == '\0') ! 31: return; ! 32: for (; *cp && isspace(*cp); cp++) ! 33: ; ! 34: if (strcmp(cmd, "quit") == 0 || strcmp(cmd, "q") == 0) ! 35: die(); ! 36: if (strcmp(cmd, "load") == 0) { ! 37: load(); ! 38: goto done; ! 39: } ! 40: if (strcmp(cmd, "stop") == 0) { ! 41: alarm(0); ! 42: mvaddstr(CMDLINE, 0, "Refresh disabled."); ! 43: clrtoeol(); ! 44: goto done; ! 45: } ! 46: if (strcmp(cmd, "help") == 0) { ! 47: int col, len; ! 48: ! 49: move(CMDLINE, col = 0); ! 50: for (p = cmdtab; p->c_name; p++) { ! 51: len = strlen(p->c_name); ! 52: if (col + len > COLS) ! 53: break; ! 54: addstr(p->c_name); col += len; ! 55: if (col + 1 < COLS) ! 56: addch(' '); ! 57: } ! 58: clrtoeol(); ! 59: goto done; ! 60: } ! 61: interval = atoi(cmd); ! 62: if (interval <= 0 && ! 63: (strcmp(cmd, "start") == 0 || strcmp(cmd, "interval") == 0)) { ! 64: interval = *cp ? atoi(cp) : naptime; ! 65: if (interval <= 0) { ! 66: error("%d: bad interval.", interval); ! 67: goto done; ! 68: } ! 69: } ! 70: if (interval > 0) { ! 71: alarm(0); ! 72: naptime = interval; ! 73: display(); ! 74: status(); ! 75: goto done; ! 76: } ! 77: p = lookup(cmd); ! 78: if (p == (struct cmdtab *)-1) { ! 79: error("%s: Ambiguous command.", cmd); ! 80: goto done; ! 81: } ! 82: if (p) { ! 83: if (curcmd == p) ! 84: goto done; ! 85: alarm(0); ! 86: (*curcmd->c_close)(wnd); ! 87: wnd = (*p->c_open)(); ! 88: if (wnd == 0) { ! 89: error("Couldn't open new display"); ! 90: wnd = (*curcmd->c_open)(); ! 91: if (wnd == 0) { ! 92: error("Couldn't change back to previous cmd"); ! 93: exit(1); ! 94: } ! 95: p = curcmd; ! 96: } ! 97: if ((p->c_flags & CF_INIT) == 0) { ! 98: if ((*p->c_init)()) ! 99: p->c_flags |= CF_INIT; ! 100: else ! 101: goto done; ! 102: } ! 103: curcmd = p; ! 104: labels(); ! 105: display(); ! 106: status(); ! 107: goto done; ! 108: } ! 109: if (curcmd->c_cmd == 0 || !(*curcmd->c_cmd)(cmd, cp)) ! 110: error("%s: Unknown command.", cmd); ! 111: done: ! 112: sigsetmask(omask); ! 113: } ! 114: ! 115: struct cmdtab * ! 116: lookup(name) ! 117: register char *name; ! 118: { ! 119: register char *p, *q; ! 120: register struct cmdtab *c, *found; ! 121: register int nmatches, longest; ! 122: ! 123: longest = 0; ! 124: nmatches = 0; ! 125: found = (struct cmdtab *) 0; ! 126: for (c = cmdtab; p = c->c_name; c++) { ! 127: for (q = name; *q == *p++; q++) ! 128: if (*q == 0) /* exact match? */ ! 129: return (c); ! 130: if (!*q) { /* the name was a prefix */ ! 131: if (q - name > longest) { ! 132: longest = q - name; ! 133: nmatches = 1; ! 134: found = c; ! 135: } else if (q - name == longest) ! 136: nmatches++; ! 137: } ! 138: } ! 139: if (nmatches > 1) ! 140: return ((struct cmdtab *)-1); ! 141: return (found); ! 142: } ! 143: ! 144: status() ! 145: { ! 146: ! 147: error("Showing %s, refresh every %d seconds.", ! 148: curcmd->c_name, naptime); ! 149: } ! 150: ! 151: suspend() ! 152: { ! 153: int oldmask; ! 154: extern sig_t sigtstpdfl; ! 155: ! 156: alarm(0); ! 157: move(CMDLINE, 0); ! 158: refresh(); ! 159: echo(); ! 160: nocrmode(); ! 161: signal(SIGTSTP, sigtstpdfl); ! 162: oldmask = sigsetmask(0); ! 163: kill(getpid(), SIGTSTP); ! 164: sigsetmask(oldmask); ! 165: signal(SIGTSTP, suspend); ! 166: crmode(); ! 167: noecho(); ! 168: move(CMDLINE, col); ! 169: alarm(naptime); ! 170: } ! 171: ! 172: prefix(s1, s2) ! 173: register char *s1, *s2; ! 174: { ! 175: ! 176: while (*s1 == *s2) { ! 177: if (*s1 == '\0') ! 178: return (1); ! 179: s1++, s2++; ! 180: } ! 181: return (*s1 == '\0'); ! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.