|
|
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: char copyright[] = ! 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)main.c 5.2 (Berkeley) 8/13/85"; ! 15: #endif not lint ! 16: ! 17: #include "systat.h" ! 18: ! 19: static struct nlist nlst[] = { ! 20: #define X_CCPU 0 ! 21: { "_ccpu" }, ! 22: #define X_AVENRUN 1 ! 23: { "_avenrun" }, ! 24: #define X_HZ 2 ! 25: { "_hz" }, ! 26: #define X_PHZ 3 ! 27: { "_phz" }, ! 28: { "" } ! 29: }; ! 30: ! 31: int kmem = -1; ! 32: int mem = -1; ! 33: int swap = -1; ! 34: int naptime = 5; ! 35: ! 36: int die(); ! 37: int display(); ! 38: int suspend(); ! 39: int (*sigtstpdfl)(); ! 40: ! 41: double ccpu; ! 42: int dellave; ! 43: ! 44: static WINDOW *wload; /* one line window for load average */ ! 45: ! 46: main(argc, argv) ! 47: int argc; ! 48: char **argv; ! 49: { ! 50: ! 51: argc--, argv++; ! 52: while (argc > 0) { ! 53: if (argv[0][0] == '-') { ! 54: struct cmdtab *p; ! 55: ! 56: p = lookup(&argv[0][1]); ! 57: if (p == (struct cmdtab *)-1) { ! 58: fprintf(stderr, "%s: unknown request\n", ! 59: &argv[0][1]); ! 60: exit(1); ! 61: } ! 62: curcmd = p; ! 63: } else { ! 64: naptime = atoi(argv[1]); ! 65: if (naptime < 5) ! 66: naptime = 5; ! 67: } ! 68: argc--, argv++; ! 69: } ! 70: nlist("/vmunix", nlst); ! 71: if (nlst[X_CCPU].n_type == 0) { ! 72: fprintf(stderr, "Couldn't namelist /vmunix.\n"); ! 73: exit(1); ! 74: } ! 75: kmemf = "/dev/kmem"; ! 76: kmem = open(kmemf, O_RDONLY); ! 77: if (kmem < 0) { ! 78: perror(kmemf); ! 79: exit(1); ! 80: } ! 81: memf = "/dev/mem"; ! 82: mem = open(memf, O_RDONLY); ! 83: if (mem < 0) { ! 84: perror(memf); ! 85: exit(1); ! 86: } ! 87: swapf = "/dev/drum"; ! 88: swap = open(swapf, O_RDONLY); ! 89: if (swap < 0) { ! 90: perror(swapf); ! 91: exit(1); ! 92: } ! 93: signal(SIGINT, die); ! 94: signal(SIGQUIT, die); ! 95: signal(SIGTERM, die); ! 96: ! 97: /* ! 98: * Initialize display. Load average appears in a one line ! 99: * window of its own. Current command's display appears in ! 100: * an overlapping sub-window of stdscr configured by the display ! 101: * routines to minimize update work by curses. ! 102: */ ! 103: initscr(); ! 104: CMDLINE = LINES - 1; ! 105: wnd = (*curcmd->c_open)(); ! 106: if (wnd == NULL) { ! 107: fprintf(stderr, "Couldn't initialize display.\n"); ! 108: die(); ! 109: } ! 110: wload = newwin(1, 0, 3, 20); ! 111: if (wload == NULL) { ! 112: fprintf(stderr, "Couldn't set up load average window.\n"); ! 113: die(); ! 114: } ! 115: ! 116: gethostname(hostname, sizeof (hostname)); ! 117: lseek(kmem, nlst[X_CCPU].n_value, L_SET); ! 118: read(kmem, &ccpu, sizeof (ccpu)); ! 119: lccpu = log(ccpu); ! 120: hz = getw(nlst[X_HZ].n_value); ! 121: phz = getw(nlst[X_PHZ].n_value); ! 122: (*curcmd->c_init)(); ! 123: curcmd->c_flags |= CF_INIT; ! 124: labels(); ! 125: ! 126: known[0].k_uid = -1; ! 127: known[0].k_name[0] = '\0'; ! 128: numknown = 1; ! 129: procs[0].pid = -1; ! 130: strcpy(procs[0].cmd, "<idle>"); ! 131: numprocs = 1; ! 132: dellave = 0.0; ! 133: ! 134: signal(SIGALRM, display); ! 135: sigtstpdfl = signal(SIGTSTP, suspend); ! 136: display(); ! 137: noecho(); ! 138: crmode(); ! 139: keyboard(); ! 140: /*NOTREACHED*/ ! 141: } ! 142: ! 143: labels() ! 144: { ! 145: ! 146: if (curcmd->c_flags & CF_LOADAV) { ! 147: mvaddstr(2, 20, ! 148: "/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10"); ! 149: mvaddstr(3, 5, "Load Average"); ! 150: } ! 151: (*curcmd->c_label)(); ! 152: #ifdef notdef ! 153: mvprintw(21, 25, "CPU usage on %s", hostname); ! 154: #endif ! 155: refresh(); ! 156: } ! 157: ! 158: display() ! 159: { ! 160: register int i, j; ! 161: ! 162: /* Get the load average over the last minute. */ ! 163: lseek(kmem, nlst[X_AVENRUN].n_value, L_SET); ! 164: read(kmem, avenrun, sizeof (avenrun)); ! 165: (*curcmd->c_fetch)(); ! 166: if (curcmd->c_flags & CF_LOADAV) { ! 167: j = 5.0*avenrun[0] + 0.5; ! 168: dellave -= avenrun[0]; ! 169: if (dellave >= 0.0) ! 170: c = '<'; ! 171: else { ! 172: c = '>'; ! 173: dellave = -dellave; ! 174: } ! 175: if (dellave < 0.1) ! 176: c = '|'; ! 177: dellave = avenrun[0]; ! 178: wmove(wload, 0, 0); wclrtoeol(wload); ! 179: for (i = (j > 50) ? 50 : j; i > 0; i--) ! 180: waddch(wload, c); ! 181: if (j > 50) ! 182: wprintw(wload, " %4.1f", avenrun[0]); ! 183: } ! 184: (*curcmd->c_refresh)(); ! 185: if (curcmd->c_flags & CF_LOADAV) ! 186: wrefresh(wload); ! 187: wrefresh(wnd); ! 188: move(CMDLINE, col); ! 189: refresh(); ! 190: alarm(naptime); ! 191: } ! 192: ! 193: load() ! 194: { ! 195: double avenrun[3]; ! 196: ! 197: lseek(kmem, nlst[X_AVENRUN].n_value, L_SET); ! 198: read(kmem, avenrun, sizeof (avenrun)); ! 199: mvprintw(CMDLINE, 0, "%4.1f %4.1f %4.1f", ! 200: avenrun[0], avenrun[1], avenrun[2]); ! 201: clrtoeol(); ! 202: } ! 203: ! 204: die() ! 205: { ! 206: ! 207: endwin(); ! 208: exit(0); ! 209: } ! 210: ! 211: error(fmt, a1, a2, a3) ! 212: { ! 213: ! 214: mvprintw(CMDLINE, 0, fmt, a1, a2, a3); ! 215: clrtoeol(); ! 216: refresh(); ! 217: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.