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.7 (Berkeley) 03/12/90"; 15 #endif not lint 16 17 #include "systat.h" 18 #include <paths.h> 19 20 static struct nlist nlst[] = { 21 #define X_CCPU 0 22 { "_ccpu" }, 23 #define X_FSCALE 1 24 { "_fscale" }, 25 #define X_HZ 2 26 { "_hz" }, 27 #define X_PHZ 3 28 { "_phz" }, 29 { "" } 30 }; 31 32 int kmem = -1; 33 int mem = -1; 34 int swap = -1; 35 int naptime = 5; 36 37 int die(); 38 int display(); 39 int suspend(); 40 sig_t sigtstpdfl; 41 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 fixpt_t ccpu; 51 52 argc--, argv++; 53 while (argc > 0) { 54 if (argv[0][0] == '-') { 55 struct cmdtab *p; 56 57 p = lookup(&argv[0][1]); 58 if (p == (struct cmdtab *)-1) { 59 fprintf(stderr, "%s: unknown request\n", 60 &argv[0][1]); 61 exit(1); 62 } 63 curcmd = p; 64 } else { 65 naptime = atoi(argv[0]); 66 if (naptime <= 0) 67 naptime = 5; 68 } 69 argc--, argv++; 70 } 71 nlist(_PATH_UNIX, nlst); 72 if (nlst[X_CCPU].n_type == 0) { 73 fprintf(stderr, "Couldn't namelist %s.\n", _PATH_UNIX); 74 exit(1); 75 } 76 kmemf = _PATH_KMEM; 77 kmem = open(kmemf, O_RDONLY); 78 if (kmem < 0) { 79 perror(kmemf); 80 exit(1); 81 } 82 memf = _PATH_MEM; 83 mem = open(memf, O_RDONLY); 84 if (mem < 0) { 85 perror(memf); 86 exit(1); 87 } 88 swapf = _PATH_DRUM; 89 swap = open(swapf, O_RDONLY); 90 if (swap < 0) { 91 perror(swapf); 92 exit(1); 93 } 94 signal(SIGINT, die); 95 signal(SIGQUIT, die); 96 signal(SIGTERM, die); 97 98 /* 99 * Initialize display. Load average appears in a one line 100 * window of its own. Current command's display appears in 101 * an overlapping sub-window of stdscr configured by the display 102 * routines to minimize update work by curses. 103 */ 104 initscr(); 105 CMDLINE = LINES - 1; 106 wnd = (*curcmd->c_open)(); 107 if (wnd == NULL) { 108 fprintf(stderr, "Couldn't initialize display.\n"); 109 die(); 110 } 111 wload = newwin(1, 0, 3, 20); 112 if (wload == NULL) { 113 fprintf(stderr, "Couldn't set up load average window.\n"); 114 die(); 115 } 116 117 gethostname(hostname, sizeof (hostname)); 118 ccpu = getw(nlst[X_CCPU].n_value); 119 fscale = getw(nlst[X_FSCALE].n_value); 120 lccpu = log((double) ccpu / fscale); 121 hz = getw(nlst[X_HZ].n_value); 122 phz = getw(nlst[X_PHZ].n_value); 123 (*curcmd->c_init)(); 124 curcmd->c_flags |= CF_INIT; 125 labels(); 126 127 known[0].k_uid = -1; 128 known[0].k_name[0] = '\0'; 129 numknown = 1; 130 procs[0].pid = -1; 131 strcpy(procs[0].cmd, "<idle>"); 132 numprocs = 1; 133 dellave = 0.0; 134 135 signal(SIGALRM, display); 136 sigtstpdfl = signal(SIGTSTP, suspend); 137 display(); 138 noecho(); 139 crmode(); 140 keyboard(); 141 /*NOTREACHED*/ 142 } 143 144 labels() 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 (void) getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])); 164 (*curcmd->c_fetch)(); 165 if (curcmd->c_flags & CF_LOADAV) { 166 j = 5.0*avenrun[0] + 0.5; 167 dellave -= avenrun[0]; 168 if (dellave >= 0.0) 169 c = '<'; 170 else { 171 c = '>'; 172 dellave = -dellave; 173 } 174 if (dellave < 0.1) 175 c = '|'; 176 dellave = avenrun[0]; 177 wmove(wload, 0, 0); wclrtoeol(wload); 178 for (i = (j > 50) ? 50 : j; i > 0; i--) 179 waddch(wload, c); 180 if (j > 50) 181 wprintw(wload, " %4.1f", avenrun[0]); 182 } 183 (*curcmd->c_refresh)(); 184 if (curcmd->c_flags & CF_LOADAV) 185 wrefresh(wload); 186 wrefresh(wnd); 187 move(CMDLINE, col); 188 refresh(); 189 alarm(naptime); 190 } 191 192 load() 193 { 194 double avenrun[3]; 195 196 (void) getloadavg(avenrun, sizeof(avenrun)/sizeof(avenrun[0])); 197 mvprintw(CMDLINE, 0, "%4.1f %4.1f %4.1f", 198 avenrun[0], avenrun[1], avenrun[2]); 199 clrtoeol(); 200 } 201 202 die() 203 { 204 move(CMDLINE, 0); 205 clrtoeol(); 206 refresh(); 207 endwin(); 208 exit(0); 209 } 210 211 error(fmt, a1, a2, a3) 212 { 213 mvprintw(CMDLINE, 0, fmt, a1, a2, a3); 214 clrtoeol(); 215 refresh(); 216 } 217