Commit | Line | Data |
---|---|---|
0ca7a29c | 1 | #ifndef lint |
4fefc2e5 | 2 | static char sccsid[] = "@(#)main.c 1.6 (Lucasfilm) %G%"; |
0ca7a29c SL |
3 | #endif |
4 | ||
5 | #include "systat.h" | |
6 | ||
d830bff6 SL |
7 | static 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 | ||
15 | int kmem = -1; | |
16 | int mem = -1; | |
17 | int swap = -1; | |
f58d0ba1 | 18 | int naptime = 5; |
0ca7a29c SL |
19 | |
20 | int die(); | |
21 | int display(); | |
22 | int suspend(); | |
23 | ||
c639d430 SL |
24 | static WINDOW *wload; /* one line window for load average */ |
25 | ||
0ca7a29c SL |
26 | main(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 | ||
120 | labels() | |
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 | ||
133 | display() | |
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 |
165 | load() |
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 |
174 | die() |
175 | { | |
176 | ||
177 | endwin(); | |
178 | exit(0); | |
179 | } | |
852c7064 SL |
180 | |
181 | error(fmt, a1, a2, a3) | |
182 | { | |
183 | ||
184 | mvprintw(22, 0, fmt, a1, a2, a3); | |
185 | clrtoeol(); | |
186 | refresh(); | |
187 | } |