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