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.8 (Berkeley) 02/04/91"; 15 #endif not lint 16 17 #include "systat.h" 18 #include <varargs.h> 19 #include <paths.h> 20 21 static struct nlist nlst[] = { 22 #define X_CCPU 0 23 { "_ccpu" }, 24 #define X_FSCALE 1 25 { "_fscale" }, 26 #define X_HZ 2 27 { "_hz" }, 28 #define X_PHZ 3 29 { "_phz" }, 30 { "" } 31 }; 32 33 int kmem = -1; 34 int mem = -1; 35 int swap = -1; 36 int naptime = 5; 37 38 int die(); 39 int display(); 40 int suspend(); 41 sig_t sigtstpdfl; 42 43 int dellave; 44 45 static WINDOW *wload; /* one line window for load average */ 46 47 main(argc, argv) 48 int argc; 49 char **argv; 50 { 51 fixpt_t ccpu; 52 53 argc--, argv++; 54 while (argc > 0) { 55 if (argv[0][0] == '-') { 56 struct cmdtab *p; 57 58 p = lookup(&argv[0][1]); 59 if (p == (struct cmdtab *)-1) { 60 fprintf(stderr, "%s: unknown request\n", 61 &argv[0][1]); 62 exit(1); 63 } 64 curcmd = p; 65 } else { 66 naptime = atoi(argv[0]); 67 if (naptime <= 0) 68 naptime = 5; 69 } 70 argc--, argv++; 71 } 72 nlist(_PATH_UNIX, nlst); 73 if (nlst[X_CCPU].n_type == 0) { 74 fprintf(stderr, "Couldn't namelist %s.\n", _PATH_UNIX); 75 exit(1); 76 } 77 kmemf = _PATH_KMEM; 78 kmem = open(kmemf, O_RDONLY); 79 if (kmem < 0) { 80 perror(kmemf); 81 exit(1); 82 } 83 memf = _PATH_MEM; 84 mem = open(memf, O_RDONLY); 85 if (mem < 0) { 86 perror(memf); 87 exit(1); 88 } 89 swapf = _PATH_DRUM; 90 swap = open(swapf, O_RDONLY); 91 if (swap < 0) { 92 perror(swapf); 93 exit(1); 94 } 95 signal(SIGINT, die); 96 signal(SIGQUIT, die); 97 signal(SIGTERM, die); 98 99 /* 100 * Initialize display. Load average appears in a one line 101 * window of its own. Current command's display appears in 102 * an overlapping sub-window of stdscr configured by the display 103 * routines to minimize update work by curses. 104 */ 105 initscr(); 106 CMDLINE = LINES - 1; 107 wnd = (*curcmd->c_open)(); 108 if (wnd == NULL) { 109 fprintf(stderr, "Couldn't initialize display.\n"); 110 die(); 111 } 112 wload = newwin(1, 0, 3, 20); 113 if (wload == NULL) { 114 fprintf(stderr, "Couldn't set up load average window.\n"); 115 die(); 116 } 117 118 gethostname(hostname, sizeof (hostname)); 119 ccpu = getword(nlst[X_CCPU].n_value); 120 fscale = getword(nlst[X_FSCALE].n_value); 121 lccpu = log((double) ccpu / fscale); 122 hz = getword(nlst[X_HZ].n_value); 123 phz = getword(nlst[X_PHZ].n_value); 124 (*curcmd->c_init)(); 125 curcmd->c_flags |= CF_INIT; 126 labels(); 127 128 known[0].k_uid = -1; 129 known[0].k_name[0] = '\0'; 130 numknown = 1; 131 procs[0].pid = -1; 132 strcpy(procs[0].cmd, "<idle>"); 133 numprocs = 1; 134 dellave = 0.0; 135 136 signal(SIGALRM, display); 137 sigtstpdfl = signal(SIGTSTP, suspend); 138 display(); 139 noecho(); 140 crmode(); 141 keyboard(); 142 /*NOTREACHED*/ 143 } 144 145 labels() 146 { 147 if (curcmd->c_flags & CF_LOADAV) { 148 mvaddstr(2, 20, 149 "/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10"); 150 mvaddstr(3, 5, "Load Average"); 151 } 152 (*curcmd->c_label)(); 153 #ifdef notdef 154 mvprintw(21, 25, "CPU usage on %s", hostname); 155 #endif 156 refresh(); 157 } 158 159 display() 160 { 161 register int i, j; 162 163 /* Get the load average over the last minute. */ 164 (void) getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])); 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 (void) getloadavg(avenrun, sizeof(avenrun)/sizeof(avenrun[0])); 198 mvprintw(CMDLINE, 0, "%4.1f %4.1f %4.1f", 199 avenrun[0], avenrun[1], avenrun[2]); 200 clrtoeol(); 201 } 202 203 die() 204 { 205 move(CMDLINE, 0); 206 clrtoeol(); 207 refresh(); 208 endwin(); 209 exit(0); 210 } 211 212 error(va_alist) 213 va_dcl 214 { 215 va_list ap; 216 char *fmt, msg[200]; 217 218 va_start(ap); 219 fmt = va_arg(ap, char *); 220 (void) vsnprintf(msg, sizeof msg, fmt, ap); 221 va_end(ap); 222 mvaddstr(CMDLINE, 0, msg); 223 clrtoeol(); 224 refresh(); 225 } 226