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