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.1 (Berkeley) 05/30/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 40 double ccpu; 41 int dellave; 42 43 static WINDOW *wload; /* one line window for load average */ 44 45 main(argc, argv) 46 int argc; 47 char **argv; 48 { 49 50 argc--, argv++; 51 while (argc > 0) { 52 if (argv[0][0] == '-') { 53 struct cmdtab *p; 54 55 p = lookup(&argv[0][1]); 56 if (p == (struct cmdtab *)-1) { 57 fprintf(stderr, "%s: unknown request\n", 58 &argv[0][1]); 59 exit(1); 60 } 61 curcmd = p; 62 } else { 63 naptime = atoi(argv[1]); 64 if (naptime < 5) 65 naptime = 5; 66 } 67 argc--, argv++; 68 } 69 nlist("/vmunix", nlst); 70 if (nlst[X_CCPU].n_type == 0) { 71 fprintf(stderr, "Couldn't namelist /vmunix.\n"); 72 exit(1); 73 } 74 kmemf = "/dev/kmem"; 75 kmem = open(kmemf, O_RDONLY); 76 if (kmem < 0) { 77 perror(kmemf); 78 exit(1); 79 } 80 memf = "/dev/mem"; 81 mem = open(memf, O_RDONLY); 82 if (mem < 0) { 83 perror(memf); 84 exit(1); 85 } 86 swapf = "/dev/drum"; 87 swap = open(swapf, O_RDONLY); 88 if (swap < 0) { 89 perror(swapf); 90 exit(1); 91 } 92 signal(SIGINT, die); 93 signal(SIGQUIT, die); 94 signal(SIGTERM, die); 95 96 /* 97 * Initialize display. Load average appears in a one line 98 * window of its own. Current command's display appears in 99 * an overlapping sub-window of stdscr configured by the display 100 * routines to minimize update work by curses. 101 */ 102 initscr(); 103 CMDLINE = LINES - 1; 104 wnd = (*curcmd->c_open)(); 105 if (wnd == NULL) { 106 fprintf(stderr, "Couldn't initialize display.\n"); 107 die(); 108 } 109 wload = newwin(1, 0, 3, 20); 110 if (wload == NULL) { 111 fprintf(stderr, "Couldn't set up load average window.\n"); 112 die(); 113 } 114 115 gethostname(hostname, sizeof (hostname)); 116 lseek(kmem, nlst[X_CCPU].n_value, L_SET); 117 read(kmem, &ccpu, sizeof (ccpu)); 118 lccpu = log(ccpu); 119 hz = getw(nlst[X_HZ].n_value); 120 phz = getw(nlst[X_PHZ].n_value); 121 (*curcmd->c_init)(); 122 curcmd->c_flags |= CF_INIT; 123 labels(); 124 125 known[0].k_uid = -1; 126 known[0].k_name[0] = '\0'; 127 numknown = 1; 128 procs[0].pid = -1; 129 strcpy(procs[0].cmd, "<idle>"); 130 numprocs = 1; 131 dellave = 0.0; 132 133 signal(SIGALRM, display); 134 signal(SIGTSTP, suspend); 135 display(); 136 noecho(); 137 crmode(); 138 keyboard(); 139 /*NOTREACHED*/ 140 } 141 142 labels() 143 { 144 145 if (curcmd->c_flags & CF_LOADAV) { 146 mvaddstr(2, 20, 147 "/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10"); 148 mvaddstr(3, 5, "Load Average"); 149 } 150 (*curcmd->c_label)(); 151 #ifdef notdef 152 mvprintw(21, 25, "CPU usage on %s", hostname); 153 #endif 154 refresh(); 155 } 156 157 display() 158 { 159 register int i, j; 160 161 /* Get the load average over the last minute. */ 162 lseek(kmem, nlst[X_AVENRUN].n_value, L_SET); 163 read(kmem, avenrun, sizeof (avenrun)); 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 lseek(kmem, nlst[X_AVENRUN].n_value, L_SET); 197 read(kmem, avenrun, sizeof (avenrun)); 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 206 endwin(); 207 exit(0); 208 } 209 210 error(fmt, a1, a2, a3) 211 { 212 213 mvprintw(CMDLINE, 0, fmt, a1, a2, a3); 214 clrtoeol(); 215 refresh(); 216 } 217