Commit | Line | Data |
---|---|---|
05969a68 | 1 | /*- |
aff6aeff KB |
2 | * Copyright (c) 1980, 1992, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
05969a68 | 4 | * |
1e3c68be | 5 | * %sccs.include.redist.c% |
07ed1e09 KM |
6 | */ |
7 | ||
8 | #ifndef lint | |
aff6aeff KB |
9 | static char copyright[] = |
10 | "@(#) Copyright (c) 1980, 1992, 1993\n\ | |
11 | The Regents of the University of California. All rights reserved.\n"; | |
05969a68 | 12 | #endif /* not lint */ |
07ed1e09 | 13 | |
0ca7a29c | 14 | #ifndef lint |
aff6aeff | 15 | static char sccsid[] = "@(#)main.c 8.1 (Berkeley) %G%"; |
05969a68 | 16 | #endif /* not lint */ |
0ca7a29c | 17 | |
05969a68 KB |
18 | #include <sys/param.h> |
19 | ||
20 | #include <nlist.h> | |
21 | #include <signal.h> | |
22 | #include <stdio.h> | |
0ca7a29c | 23 | #include "systat.h" |
05969a68 | 24 | #include "extern.h" |
0ca7a29c | 25 | |
86923762 | 26 | static struct nlist namelist[] = { |
142cb8a1 MT |
27 | #define X_FIRST 0 |
28 | #define X_HZ 0 | |
9c0c7319 | 29 | { "_hz" }, |
05969a68 KB |
30 | #define X_STATHZ 1 |
31 | { "_stathz" }, | |
eef33ea7 | 32 | { "" } |
0ca7a29c | 33 | }; |
05969a68 | 34 | static int dellave; |
0ca7a29c | 35 | |
05969a68 | 36 | kvm_t *kd; |
58cb3b6b | 37 | sig_t sigtstpdfl; |
05969a68 KB |
38 | double avenrun[3]; |
39 | int col; | |
40 | int naptime = 5; | |
41 | int verbose = 1; /* to report kvm read errs */ | |
42 | int hz, stathz; | |
43 | char c; | |
44 | char *namp; | |
45 | char hostname[MAXHOSTNAMELEN]; | |
46 | WINDOW *wnd; | |
47 | int CMDLINE; | |
855ff304 | 48 | |
c639d430 SL |
49 | static WINDOW *wload; /* one line window for load average */ |
50 | ||
05969a68 | 51 | void |
0ca7a29c | 52 | main(argc, argv) |
eef33ea7 KB |
53 | int argc; |
54 | char **argv; | |
0ca7a29c | 55 | { |
05969a68 | 56 | char errbuf[80]; |
0ca7a29c | 57 | |
f58d0ba1 SL |
58 | argc--, argv++; |
59 | while (argc > 0) { | |
60 | if (argv[0][0] == '-') { | |
61 | struct cmdtab *p; | |
62 | ||
4fefc2e5 SL |
63 | p = lookup(&argv[0][1]); |
64 | if (p == (struct cmdtab *)-1) { | |
f58d0ba1 SL |
65 | fprintf(stderr, "%s: unknown request\n", |
66 | &argv[0][1]); | |
67 | exit(1); | |
68 | } | |
69 | curcmd = p; | |
70 | } else { | |
e6200bb7 TF |
71 | naptime = atoi(argv[0]); |
72 | if (naptime <= 0) | |
f58d0ba1 SL |
73 | naptime = 5; |
74 | } | |
75 | argc--, argv++; | |
76 | } | |
05969a68 KB |
77 | kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf); |
78 | if (kd == NULL) { | |
79 | error("%s", errbuf); | |
80 | exit(1); | |
81 | } | |
86923762 KB |
82 | if (kvm_nlist(kd, namelist)) { |
83 | nlisterr(namelist); | |
05969a68 KB |
84 | exit(1); |
85 | } | |
86923762 KB |
86 | if (namelist[X_FIRST].n_type == 0) { |
87 | fprintf(stderr, "couldn't read namelist.\n"); | |
d830bff6 SL |
88 | exit(1); |
89 | } | |
eef33ea7 KB |
90 | signal(SIGINT, die); |
91 | signal(SIGQUIT, die); | |
92 | signal(SIGTERM, die); | |
0ca7a29c | 93 | |
eef33ea7 | 94 | /* |
c639d430 SL |
95 | * Initialize display. Load average appears in a one line |
96 | * window of its own. Current command's display appears in | |
97 | * an overlapping sub-window of stdscr configured by the display | |
98 | * routines to minimize update work by curses. | |
d830bff6 | 99 | */ |
eef33ea7 | 100 | initscr(); |
855ff304 | 101 | CMDLINE = LINES - 1; |
d830bff6 SL |
102 | wnd = (*curcmd->c_open)(); |
103 | if (wnd == NULL) { | |
104 | fprintf(stderr, "Couldn't initialize display.\n"); | |
05969a68 | 105 | die(0); |
d830bff6 | 106 | } |
c639d430 SL |
107 | wload = newwin(1, 0, 3, 20); |
108 | if (wload == NULL) { | |
109 | fprintf(stderr, "Couldn't set up load average window.\n"); | |
05969a68 | 110 | die(0); |
c639d430 | 111 | } |
eef33ea7 | 112 | gethostname(hostname, sizeof (hostname)); |
142cb8a1 | 113 | NREAD(X_HZ, &hz, LONG); |
05969a68 | 114 | NREAD(X_STATHZ, &stathz, LONG); |
d830bff6 | 115 | (*curcmd->c_init)(); |
9c0c7319 | 116 | curcmd->c_flags |= CF_INIT; |
eef33ea7 | 117 | labels(); |
0ca7a29c | 118 | |
eef33ea7 | 119 | dellave = 0.0; |
0ca7a29c | 120 | |
eef33ea7 | 121 | signal(SIGALRM, display); |
05969a68 | 122 | display(0); |
eef33ea7 KB |
123 | noecho(); |
124 | crmode(); | |
d830bff6 SL |
125 | keyboard(); |
126 | /*NOTREACHED*/ | |
0ca7a29c SL |
127 | } |
128 | ||
05969a68 | 129 | void |
0ca7a29c SL |
130 | labels() |
131 | { | |
9c0c7319 SL |
132 | if (curcmd->c_flags & CF_LOADAV) { |
133 | mvaddstr(2, 20, | |
134 | "/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10"); | |
135 | mvaddstr(3, 5, "Load Average"); | |
136 | } | |
eef33ea7 | 137 | (*curcmd->c_label)(); |
0ca7a29c | 138 | #ifdef notdef |
eef33ea7 | 139 | mvprintw(21, 25, "CPU usage on %s", hostname); |
0ca7a29c | 140 | #endif |
eef33ea7 | 141 | refresh(); |
0ca7a29c SL |
142 | } |
143 | ||
58cb3b6b | 144 | void |
05969a68 KB |
145 | display(signo) |
146 | int signo; | |
0ca7a29c | 147 | { |
eef33ea7 | 148 | register int i, j; |
0ca7a29c | 149 | |
eef33ea7 | 150 | /* Get the load average over the last minute. */ |
bcc006b0 | 151 | (void) getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])); |
eef33ea7 | 152 | (*curcmd->c_fetch)(); |
9c0c7319 SL |
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 | } | |
eef33ea7 | 171 | (*curcmd->c_refresh)(); |
9c0c7319 SL |
172 | if (curcmd->c_flags & CF_LOADAV) |
173 | wrefresh(wload); | |
eef33ea7 KB |
174 | wrefresh(wnd); |
175 | move(CMDLINE, col); | |
176 | refresh(); | |
177 | alarm(naptime); | |
0ca7a29c SL |
178 | } |
179 | ||
05969a68 | 180 | void |
d830bff6 SL |
181 | load() |
182 | { | |
183 | ||
bcc006b0 | 184 | (void) getloadavg(avenrun, sizeof(avenrun)/sizeof(avenrun[0])); |
855ff304 KM |
185 | mvprintw(CMDLINE, 0, "%4.1f %4.1f %4.1f", |
186 | avenrun[0], avenrun[1], avenrun[2]); | |
d830bff6 SL |
187 | clrtoeol(); |
188 | } | |
189 | ||
58cb3b6b | 190 | void |
05969a68 KB |
191 | die(signo) |
192 | int signo; | |
0ca7a29c | 193 | { |
0a9e36fe MK |
194 | move(CMDLINE, 0); |
195 | clrtoeol(); | |
196 | refresh(); | |
eef33ea7 KB |
197 | endwin(); |
198 | exit(0); | |
0ca7a29c | 199 | } |
852c7064 | 200 | |
05969a68 KB |
201 | #if __STDC__ |
202 | #include <stdarg.h> | |
203 | #else | |
204 | #include <varargs.h> | |
205 | #endif | |
206 | ||
207 | #if __STDC__ | |
208 | void | |
209 | error(const char *fmt, ...) | |
210 | #else | |
211 | void | |
212 | error(fmt, va_alist) | |
213 | char *fmt; | |
2202cfef | 214 | va_dcl |
05969a68 | 215 | #endif |
852c7064 | 216 | { |
2202cfef | 217 | va_list ap; |
3b1ca63b EA |
218 | char buf[255]; |
219 | int oy, ox; | |
05969a68 KB |
220 | #if __STDC__ |
221 | va_start(ap, fmt); | |
222 | #else | |
2202cfef | 223 | va_start(ap); |
05969a68 | 224 | #endif |
3b1ca63b | 225 | |
05969a68 | 226 | if (wnd) { |
3b1ca63b EA |
227 | getyx(stdscr, oy, ox); |
228 | (void) vsprintf(buf, fmt, ap); | |
05969a68 | 229 | clrtoeol(); |
3b1ca63b EA |
230 | standout(); |
231 | mvaddstr(CMDLINE, 0, buf); | |
232 | standend(); | |
233 | move(oy, ox); | |
05969a68 | 234 | refresh(); |
3b1ca63b EA |
235 | } else { |
236 | (void) vfprintf(stderr, fmt, ap); | |
05969a68 | 237 | fprintf(stderr, "\n"); |
3b1ca63b EA |
238 | } |
239 | va_end(ap); | |
05969a68 KB |
240 | } |
241 | ||
242 | void | |
86923762 KB |
243 | nlisterr(namelist) |
244 | struct nlist namelist[]; | |
05969a68 KB |
245 | { |
246 | int i, n; | |
247 | ||
248 | n = 0; | |
249 | clear(); | |
250 | mvprintw(2, 10, "systat: nlist: can't find following symbols:"); | |
86923762 KB |
251 | for (i = 0; |
252 | namelist[i].n_name != NULL && *namelist[i].n_name != '\0'; i++) | |
253 | if (namelist[i].n_value == 0) | |
254 | mvprintw(2 + ++n, 10, "%s", namelist[i].n_name); | |
05969a68 | 255 | move(CMDLINE, 0); |
852c7064 SL |
256 | clrtoeol(); |
257 | refresh(); | |
05969a68 KB |
258 | endwin(); |
259 | exit(1); | |
852c7064 | 260 | } |