Must distinguish between "ambiguous" and "unknown" commands.
[unix-history] / usr / src / usr.bin / window / lcmd2.c
CommitLineData
0a4ab290 1#ifndef lint
60de5df9 2static char sccsid[] = "@(#)lcmd2.c 3.11 %G%";
0a4ab290
EW
3#endif
4
60de5df9
EW
5/*
6 * Copyright (c) 1983 Regents of the University of California,
7 * All rights reserved. Redistribution permitted subject to
8 * the terms of the Berkeley Software License Agreement.
9 */
10
0a4ab290
EW
11#include "defs.h"
12#include "string.h"
13#include "value.h"
e404c17a 14#include "var.h"
0a4ab290
EW
15#include "lcmd.h"
16#include <sys/resource.h>
bb4a0c0b 17#include "alias.h"
0a4ab290 18
e404c17a 19/*ARGSUSED*/
0a4ab290
EW
20l_iostat(v, a)
21struct value *v, *a;
22{
23 register struct ww *w;
24
25 if ((w = openiwin(14, "IO Statistics")) == 0) {
26 error("Can't open statistics window: %s.", wwerror());
27 return;
28 }
29 wwprintf(w, "ttflush\twrite\terror\tzero\tchar\n");
30 wwprintf(w, "%d\t%d\t%d\t%d\t%d\n",
31 wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc);
7f3640e9 32 wwprintf(w, "wwwrite\tattempt\tchar\n");
0a4ab290
EW
33 wwprintf(w, "%d\t%d\t%d\n",
34 wwnwwr, wwnwwra, wwnwwrc);
35 wwprintf(w, "wwupdat\tline\tmiss\tmajor\tmiss\n");
36 wwprintf(w, "%d\t%d\t%d\t%d\t%d\n",
37 wwnupdate, wwnupdline, wwnupdmiss, wwnmajline, wwnmajmiss);
38 wwprintf(w, "select\terror\tzero\n");
39 wwprintf(w, "%d\t%d\t%d\n",
40 wwnselect, wwnselecte, wwnselectz);
41 wwprintf(w, "read\terror\tzero\tchar\n");
42 wwprintf(w, "%d\t%d\t%d\t%d\n",
43 wwnread, wwnreade, wwnreadz, wwnreadc);
44 wwprintf(w, "ptyread\terror\tzero\tcontrol\tdata\tchar\n");
45 wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\n",
46 wwnwread, wwnwreade, wwnwreadz,
47 wwnwreadp, wwnwreadd, wwnwreadc);
48 waitnl(w);
49 closeiwin(w);
50}
51
52struct lcmd_arg arg_time[] = {
7ecf4dca 53 { "who", 1, ARG_STR },
0a4ab290
EW
54 0
55};
56
e404c17a 57/*ARGSUSED*/
0a4ab290
EW
58l_time(v, a)
59struct value *v;
60register struct value *a;
61{
62 register struct ww *w;
63 struct rusage rusage;
64 struct timeval timeval;
0a4ab290
EW
65 char *strtime();
66
67 if ((w = openiwin(6, "Timing and Resource Usage")) == 0) {
68 error("Can't open time window: %s.", wwerror());
69 return;
70 }
71
72 (void) gettimeofday(&timeval, (struct timezone *)0);
73 timeval.tv_sec -= starttime.tv_sec;
74 if ((timeval.tv_usec -= starttime.tv_usec) < 0) {
75 timeval.tv_sec--;
76 timeval.tv_usec += 1000000;
77 }
78 (void) getrusage(a->v_type == V_STR
79 && str_match(a->v_str, "children", 1)
80 ? RUSAGE_CHILDREN : RUSAGE_SELF, &rusage);
81
82 wwprintf(w, "time\t\tutime\t\tstime\t\tmaxrss\tixrss\tidrss\tisrss\n");
83 wwprintf(w, "%-16s", strtime(&timeval));
84 wwprintf(w, "%-16s", strtime(&rusage.ru_utime));
85 wwprintf(w, "%-16s", strtime(&rusage.ru_stime));
86 wwprintf(w, "%D\t%D\t%D\t%D\n",
87 rusage.ru_maxrss, rusage.ru_ixrss,
88 rusage.ru_idrss, rusage.ru_isrss);
89 wwprintf(w, "minflt\tmajflt\tnswap\tinblk\toublk\tmsgsnd\tmsgrcv\tnsigs\tnvcsw\tnivcsw\n");
90 wwprintf(w, "%D\t%D\t%D\t%D\t%D\t%D\t%D\t%D\t%D\t%D\n",
91 rusage.ru_minflt, rusage.ru_majflt, rusage.ru_nswap,
92 rusage.ru_inblock, rusage.ru_oublock,
93 rusage.ru_msgsnd, rusage.ru_msgrcv, rusage.ru_nsignals,
94 rusage.ru_nvcsw, rusage.ru_nivcsw);
95
96 waitnl(w);
97 closeiwin(w);
98}
99
100char *
101strtime(t)
102register struct timeval *t;
103{
104 char fill = 0;
105 static char buf[20];
106 register char *p = buf;
107
108 if (t->tv_sec > 60*60) {
109 (void) sprintf(p, "%D:", t->tv_sec / (60*60));
110 while (*p++)
111 ;
112 p--;
113 t->tv_sec %= 60*60;
114 fill++;
115 }
116 if (t->tv_sec > 60) {
117 (void) sprintf(p, fill ? "%02D:" : "%D:", t->tv_sec / 60);
118 while (*p++)
119 ;
120 p--;
121 t->tv_sec %= 60;
122 fill++;
123 }
124 (void) sprintf(p, fill ? "%02D.%02d" : "%D.%02D",
125 t->tv_sec, t->tv_usec / 10000);
126 return buf;
127}
e404c17a
EW
128
129/*ARGSUSED*/
130l_list(v, a)
131struct value *v, *a;
132{
133 register struct ww *w, *wp;
134 register i;
135 int n;
136
137 for (n = 0, i = 0; i < NWINDOW; i++)
138 if (window[i] != 0)
139 n++;
140 if (n == 0) {
141 error("No windows.");
142 return;
143 }
144 if ((w = openiwin(n + 2, "Windows")) == 0) {
145 error("Can't open listing window: %s.", wwerror());
146 return;
147 }
148 for (i = 0; i < NWINDOW; i++) {
149 if ((wp = window[i]) == 0)
150 continue;
151 wwprintf(w, "%c %c %-13s %-.*s\n",
152 wp == selwin ? '*' : ' ',
153 i + '1',
154 wp->ww_state == WWS_HASPROC ? "" : "(No process)",
155 wwncol - 20,
156 wp->ww_label ? wp->ww_label : "(No label)");
157 }
158 waitnl(w);
159 closeiwin(w);
160}
161
162/*ARGSUSED*/
163l_variable(v, a)
164struct value *v, *a;
165{
166 register struct ww *w;
167 int printvar();
168
169 if ((w = openiwin(wwnrow - 3, "Variables")) == 0) {
170 error("Can't open variable window: %s.", wwerror());
171 return;
172 }
173 if (var_walk(printvar, (int)w) >= 0)
174 waitnl(w);
175 closeiwin(w);
176}
177
178printvar(w, r)
179register struct ww *w;
180register struct var *r;
181{
182 if (more(w, 0) == 2)
183 return -1;
bb4a0c0b 184 wwprintf(w, "%16s ", r->r_name);
e404c17a
EW
185 switch (r->r_val.v_type) {
186 case V_STR:
187 wwprintf(w, "%s\n", r->r_val.v_str);
188 break;
189 case V_NUM:
190 wwprintf(w, "%d\n", r->r_val.v_num);
191 break;
192 case V_ERR:
193 wwprintf(w, "ERROR\n");
194 break;
195 }
196 return 0;
197}
7ecf4dca
EW
198
199struct lcmd_arg arg_shell[] = {
855d0f8f 200 { "", 0, ARG_ANY|ARG_LIST },
7ecf4dca
EW
201 0
202};
203
204l_shell(v, a)
855d0f8f 205 struct value *v, *a;
7ecf4dca 206{
9bb07f4c 207 register char **pp;
855d0f8f 208 register struct value *vp;
7ecf4dca
EW
209
210 if (a->v_type == V_ERR) {
211 if ((v->v_str = str_cpy(shellfile)) != 0)
212 v->v_type = V_STR;
213 return;
214 }
215 if (v->v_str = shellfile) {
216 v->v_type = V_STR;
855d0f8f 217 for (pp = shell + 1; *pp; pp++) {
7ecf4dca 218 str_free(*pp);
855d0f8f
EW
219 *pp = 0;
220 }
7ecf4dca 221 }
855d0f8f
EW
222 for (pp = shell, vp = a;
223 vp->v_type != V_ERR && pp < &shell[sizeof shell/sizeof *shell-1];
224 pp++, vp++)
225 if ((*pp = vp->v_type == V_STR ?
226 str_cpy(vp->v_str) : str_itoa(vp->v_num)) == 0) {
7ecf4dca
EW
227 /* just leave shell[] the way it is */
228 p_memerror();
855d0f8f 229 break;
7ecf4dca
EW
230 }
231 if (shellfile = *shell)
232 if (*shell = rindex(shellfile, '/'))
233 (*shell)++;
234 else
235 *shell = shellfile;
236}
bb4a0c0b
EW
237
238struct lcmd_arg arg_alias[] = {
855d0f8f
EW
239 { "", 0, ARG_STR },
240 { "", 0, ARG_STR|ARG_LIST },
bb4a0c0b
EW
241 0
242};
243
244l_alias(v, a)
855d0f8f 245 struct value *v, *a;
bb4a0c0b
EW
246{
247 if (a->v_type == V_ERR) {
248 register struct ww *w;
249 int printalias();
250
251 if ((w = openiwin(wwnrow - 3, "Aliases")) == 0) {
252 error("Can't open alias window: %s.", wwerror());
253 return;
254 }
255 if (alias_walk(printalias, (int)w) >= 0)
256 waitnl(w);
257 closeiwin(w);
258 } else {
259 register struct alias *ap = 0;
260
261 if (ap = alias_lookup(a->v_str)) {
262 if ((v->v_str = str_cpy(ap->a_buf)) == 0) {
263 p_memerror();
264 return;
265 }
266 v->v_type = V_STR;
267 }
855d0f8f
EW
268 if (a[1].v_type == V_STR) {
269 register struct value *vp;
270 register char *p, *q;
271 char *str;
272 register n;
273
274 for (n = 0, vp = a + 1; vp->v_type != V_ERR; vp++, n++)
275 for (p = vp->v_str; *p; p++, n++)
276 ;
277 if ((str = str_alloc(n)) == 0) {
278 p_memerror();
279 return;
280 }
281 for (q = str, vp = a + 1; vp->v_type != V_ERR;
282 vp++, q[-1] = ' ')
283 for (p = vp->v_str; *q++ = *p++;)
284 ;
285 q[-1] = 0;
9bb07f4c 286 if ((ap = alias_set(a[0].v_str, (char *)0)) == 0) {
855d0f8f 287 p_memerror();
9bb07f4c 288 str_free(str);
855d0f8f
EW
289 return;
290 }
291 ap->a_buf = str;
bb4a0c0b
EW
292 }
293 }
294}
295
296printalias(w, a)
297register struct ww *w;
298register struct alias *a;
299{
300 if (more(w, 0) == 2)
301 return -1;
302 wwprintf(w, "%16s %s\n", a->a_name, a->a_buf);
303 return 0;
304}
305
306struct lcmd_arg arg_unalias[] = {
f0e3c264 307 { "alias", 1, ARG_STR },
bb4a0c0b
EW
308 0
309};
310
311l_unalias(v, a)
312struct value *v, *a;
313{
314 if (a->v_type == ARG_STR)
315 v->v_num = alias_unset(a->v_str);
316 v->v_type = V_NUM;
317}
1b736021
EW
318
319struct lcmd_arg arg_echo[] = {
320 { "window", 1, ARG_NUM },
321 { "", 0, ARG_ANY|ARG_LIST },
322 0
323};
324
325/*ARGSUSED*/
326l_echo(v, a)
327struct value *v;
328register struct value *a;
329{
330 char buf[20];
331 struct ww *w;
332
f0e3c264 333 if ((w = vtowin(a++, selwin)) == 0)
1b736021
EW
334 return;
335 while (a->v_type != V_ERR) {
336 if (a->v_type == V_NUM) {
337 (void) sprintf(buf, "%d", a->v_num);
338 (void) wwwrite(w, buf, strlen(buf));
339 } else
340 (void) wwwrite(w, a->v_str, strlen(a->v_str));
341 if ((++a)->v_type != V_ERR)
342 (void) wwwrite(w, " ", 1);
343 }
344 (void) wwwrite(w, "\r\n", 2);
345}