date and time created 94/04/13 10:27:13 by eric
[unix-history] / usr / src / usr.bin / systat / main.c
CommitLineData
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
9static 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 15static 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 26static 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 34static int dellave;
0ca7a29c 35
05969a68 36kvm_t *kd;
58cb3b6b 37sig_t sigtstpdfl;
05969a68
KB
38double avenrun[3];
39int col;
40int naptime = 5;
41int verbose = 1; /* to report kvm read errs */
42int hz, stathz;
43char c;
44char *namp;
45char hostname[MAXHOSTNAMELEN];
46WINDOW *wnd;
47int CMDLINE;
855ff304 48
c639d430
SL
49static WINDOW *wload; /* one line window for load average */
50
05969a68 51void
0ca7a29c 52main(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 129void
0ca7a29c
SL
130labels()
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 144void
05969a68
KB
145display(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 180void
d830bff6
SL
181load()
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 190void
05969a68
KB
191die(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__
208void
209error(const char *fmt, ...)
210#else
211void
212error(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
242void
86923762
KB
243nlisterr(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}