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