xref: /plan9/sys/src/cmd/cwfs/con.c (revision 01a344a29f2ff35133953eaef092a50fc8c3163b)
1*01a344a2SDavid du Colombier #include "all.h"
2*01a344a2SDavid du Colombier 
3*01a344a2SDavid du Colombier static	Command	command[100];
4*01a344a2SDavid du Colombier static	Flag	flag[35];
5*01a344a2SDavid du Colombier static	char	statsdef[20];	/* default stats list */
6*01a344a2SDavid du Colombier static	int	whoflag;
7*01a344a2SDavid du Colombier 
8*01a344a2SDavid du Colombier static	void	consserve1(void *);
9*01a344a2SDavid du Colombier static	void	installcmds(void);
10*01a344a2SDavid du Colombier 
11*01a344a2SDavid du Colombier void
consserve(void)12*01a344a2SDavid du Colombier consserve(void)
13*01a344a2SDavid du Colombier {
14*01a344a2SDavid du Colombier 	int i;
15*01a344a2SDavid du Colombier 
16*01a344a2SDavid du Colombier 	strncpy(cons.chan->whochan, "console", sizeof(cons.chan->whochan));
17*01a344a2SDavid du Colombier 	installcmds();
18*01a344a2SDavid du Colombier 	con_session();
19*01a344a2SDavid du Colombier 	cmd_exec("cfs");
20*01a344a2SDavid du Colombier 	cmd_exec("users");
21*01a344a2SDavid du Colombier 	cmd_exec("version");
22*01a344a2SDavid du Colombier 
23*01a344a2SDavid du Colombier 	for(i = 0; command[i].arg0; i++)
24*01a344a2SDavid du Colombier 		if(strcmp("cwcmd", command[i].arg0) == 0){
25*01a344a2SDavid du Colombier 			cmd_exec("cwcmd touchsb");
26*01a344a2SDavid du Colombier 			break;
27*01a344a2SDavid du Colombier 		}
28*01a344a2SDavid du Colombier 
29*01a344a2SDavid du Colombier 	newproc(consserve1, 0, "con");
30*01a344a2SDavid du Colombier }
31*01a344a2SDavid du Colombier 
32*01a344a2SDavid du Colombier /* console commands process */
33*01a344a2SDavid du Colombier static void
consserve1(void *)34*01a344a2SDavid du Colombier consserve1(void *)
35*01a344a2SDavid du Colombier {
36*01a344a2SDavid du Colombier 	char *conline;
37*01a344a2SDavid du Colombier 
38*01a344a2SDavid du Colombier 	for (;;) {
39*01a344a2SDavid du Colombier 		/* conslock(); */
40*01a344a2SDavid du Colombier 		do {
41*01a344a2SDavid du Colombier 			print("%s: ", service);
42*01a344a2SDavid du Colombier 			if ((conline = Brdline(&bin, '\n')) == nil)
43*01a344a2SDavid du Colombier 				print("\n");
44*01a344a2SDavid du Colombier 			else {
45*01a344a2SDavid du Colombier 				conline[Blinelen(&bin)-1] = '\0';
46*01a344a2SDavid du Colombier 				cmd_exec(conline);
47*01a344a2SDavid du Colombier 			}
48*01a344a2SDavid du Colombier 		} while (conline != nil);
49*01a344a2SDavid du Colombier 	}
50*01a344a2SDavid du Colombier }
51*01a344a2SDavid du Colombier 
52*01a344a2SDavid du Colombier static int
cmdcmp(void * va,void * vb)53*01a344a2SDavid du Colombier cmdcmp(void *va, void *vb)
54*01a344a2SDavid du Colombier {
55*01a344a2SDavid du Colombier 	Command *a, *b;
56*01a344a2SDavid du Colombier 
57*01a344a2SDavid du Colombier 	a = va;
58*01a344a2SDavid du Colombier 	b = vb;
59*01a344a2SDavid du Colombier 	return strcmp(a->arg0, b->arg0);
60*01a344a2SDavid du Colombier }
61*01a344a2SDavid du Colombier 
62*01a344a2SDavid du Colombier void
cmd_install(char * arg0,char * help,void (* func)(int,char * []))63*01a344a2SDavid du Colombier cmd_install(char *arg0, char *help, void (*func)(int, char*[]))
64*01a344a2SDavid du Colombier {
65*01a344a2SDavid du Colombier 	int i;
66*01a344a2SDavid du Colombier 
67*01a344a2SDavid du Colombier 	qlock(&cons);
68*01a344a2SDavid du Colombier 	for(i=0; command[i].arg0; i++)
69*01a344a2SDavid du Colombier 		;
70*01a344a2SDavid du Colombier 	if(i >= nelem(command)-2) {
71*01a344a2SDavid du Colombier 		qunlock(&cons);
72*01a344a2SDavid du Colombier 		print("cmd_install: too many commands\n");
73*01a344a2SDavid du Colombier 		return;
74*01a344a2SDavid du Colombier 	}
75*01a344a2SDavid du Colombier 	command[i+1].arg0 = 0;
76*01a344a2SDavid du Colombier 	command[i].help = help;
77*01a344a2SDavid du Colombier 	command[i].func = func;
78*01a344a2SDavid du Colombier 	command[i].arg0 = arg0;
79*01a344a2SDavid du Colombier 	qsort(command, i+1, sizeof(Command), cmdcmp);
80*01a344a2SDavid du Colombier 	qunlock(&cons);
81*01a344a2SDavid du Colombier }
82*01a344a2SDavid du Colombier 
83*01a344a2SDavid du Colombier void
cmd_exec(char * arg)84*01a344a2SDavid du Colombier cmd_exec(char *arg)
85*01a344a2SDavid du Colombier {
86*01a344a2SDavid du Colombier 	char line[2*Maxword], *s;
87*01a344a2SDavid du Colombier 	char *argv[10];
88*01a344a2SDavid du Colombier 	int argc, i, c;
89*01a344a2SDavid du Colombier 
90*01a344a2SDavid du Colombier 	if(strlen(arg) >= nelem(line)-2) {
91*01a344a2SDavid du Colombier 		print("cmd_exec: line too long\n");
92*01a344a2SDavid du Colombier 		return;
93*01a344a2SDavid du Colombier 	}
94*01a344a2SDavid du Colombier 	strcpy(line, arg);
95*01a344a2SDavid du Colombier 
96*01a344a2SDavid du Colombier 	argc = 0;
97*01a344a2SDavid du Colombier 	s = line;
98*01a344a2SDavid du Colombier 	c = *s++;
99*01a344a2SDavid du Colombier 	for(;;) {
100*01a344a2SDavid du Colombier 		while(isascii(c) && isspace(c))
101*01a344a2SDavid du Colombier 			c = *s++;
102*01a344a2SDavid du Colombier 		if(c == 0)
103*01a344a2SDavid du Colombier 			break;
104*01a344a2SDavid du Colombier 		if(argc >= nelem(argv)-2) {
105*01a344a2SDavid du Colombier 			print("cmd_exec: too many args\n");
106*01a344a2SDavid du Colombier 			return;
107*01a344a2SDavid du Colombier 		}
108*01a344a2SDavid du Colombier 		argv[argc++] = s-1;
109*01a344a2SDavid du Colombier 		while((!isascii(c) || !isspace(c)) && c != '\0')
110*01a344a2SDavid du Colombier 			c = *s++;
111*01a344a2SDavid du Colombier 		s[-1] = 0;
112*01a344a2SDavid du Colombier 	}
113*01a344a2SDavid du Colombier 	if(argc <= 0)
114*01a344a2SDavid du Colombier 		return;
115*01a344a2SDavid du Colombier 	for(i=0; s=command[i].arg0; i++)
116*01a344a2SDavid du Colombier 		if(strcmp(argv[0], s) == 0) {
117*01a344a2SDavid du Colombier 			(*command[i].func)(argc, argv);
118*01a344a2SDavid du Colombier 			prflush();
119*01a344a2SDavid du Colombier 			return;
120*01a344a2SDavid du Colombier 		}
121*01a344a2SDavid du Colombier 	print("cmd_exec: unknown command: %s\n", argv[0]);
122*01a344a2SDavid du Colombier }
123*01a344a2SDavid du Colombier 
124*01a344a2SDavid du Colombier static void
cmd_halt(int,char * [])125*01a344a2SDavid du Colombier cmd_halt(int, char *[])
126*01a344a2SDavid du Colombier {
127*01a344a2SDavid du Colombier 	wlock(&mainlock);	/* halt */
128*01a344a2SDavid du Colombier 	sync("halt");
129*01a344a2SDavid du Colombier 	exit();
130*01a344a2SDavid du Colombier }
131*01a344a2SDavid du Colombier 
132*01a344a2SDavid du Colombier static void
cmd_duallow(int argc,char * argv[])133*01a344a2SDavid du Colombier cmd_duallow(int argc, char *argv[])
134*01a344a2SDavid du Colombier {
135*01a344a2SDavid du Colombier 	int uid;
136*01a344a2SDavid du Colombier 
137*01a344a2SDavid du Colombier 	if(argc <= 1) {
138*01a344a2SDavid du Colombier 		duallow = 0;
139*01a344a2SDavid du Colombier 		return;
140*01a344a2SDavid du Colombier 	}
141*01a344a2SDavid du Colombier 
142*01a344a2SDavid du Colombier 	uid = strtouid(argv[1]);
143*01a344a2SDavid du Colombier 	if(uid < 0)
144*01a344a2SDavid du Colombier 		uid = number(argv[1], -2, 10);
145*01a344a2SDavid du Colombier 	if(uid < 0) {
146*01a344a2SDavid du Colombier 		print("bad uid %s\n", argv[1]);
147*01a344a2SDavid du Colombier 		return;
148*01a344a2SDavid du Colombier 	}
149*01a344a2SDavid du Colombier 	duallow = uid;
150*01a344a2SDavid du Colombier }
151*01a344a2SDavid du Colombier 
152*01a344a2SDavid du Colombier static void
cmd_stats(int argc,char * argv[])153*01a344a2SDavid du Colombier cmd_stats(int argc, char *argv[])
154*01a344a2SDavid du Colombier {
155*01a344a2SDavid du Colombier 	int i, c;
156*01a344a2SDavid du Colombier 	char buf[30], *s, *p, *q;
157*01a344a2SDavid du Colombier 
158*01a344a2SDavid du Colombier 	if(argc <= 1) {
159*01a344a2SDavid du Colombier 		if(statsdef[0] == 0)
160*01a344a2SDavid du Colombier 			strcpy(statsdef, "a");
161*01a344a2SDavid du Colombier 		sprint(buf, "stats s%s", statsdef);
162*01a344a2SDavid du Colombier 		cmd_exec(buf);
163*01a344a2SDavid du Colombier 		return;
164*01a344a2SDavid du Colombier 	}
165*01a344a2SDavid du Colombier 
166*01a344a2SDavid du Colombier 	strcpy(buf, "stat");
167*01a344a2SDavid du Colombier 	p = strchr(buf, 0);
168*01a344a2SDavid du Colombier 	p[1] = 0;
169*01a344a2SDavid du Colombier 
170*01a344a2SDavid du Colombier 	q = 0;
171*01a344a2SDavid du Colombier 	for(i = 1; i < argc; i++)
172*01a344a2SDavid du Colombier 		for(s = argv[i]; c = *s; s++) {
173*01a344a2SDavid du Colombier 			if(c == 's')
174*01a344a2SDavid du Colombier 				continue;
175*01a344a2SDavid du Colombier 			if(c == '-') {
176*01a344a2SDavid du Colombier 				q = statsdef;
177*01a344a2SDavid du Colombier 				continue;
178*01a344a2SDavid du Colombier 			}
179*01a344a2SDavid du Colombier 			if(q) {
180*01a344a2SDavid du Colombier 				*q++ = c;
181*01a344a2SDavid du Colombier 				*q = 0;
182*01a344a2SDavid du Colombier 			}
183*01a344a2SDavid du Colombier 			*p = c;
184*01a344a2SDavid du Colombier 			cmd_exec(buf);
185*01a344a2SDavid du Colombier 		}
186*01a344a2SDavid du Colombier }
187*01a344a2SDavid du Colombier 
188*01a344a2SDavid du Colombier static void
cmd_stata(int,char * [])189*01a344a2SDavid du Colombier cmd_stata(int, char *[])
190*01a344a2SDavid du Colombier {
191*01a344a2SDavid du Colombier 	int i;
192*01a344a2SDavid du Colombier 
193*01a344a2SDavid du Colombier 	print("cons stats\n");
194*01a344a2SDavid du Colombier //	print("\twork =%7W%7W%7W rps\n", cons.work+0, cons.work+1, cons.work+2);
195*01a344a2SDavid du Colombier //	print("\trate =%7W%7W%7W tBps\n", cons.rate+0, cons.rate+1, cons.rate+2);
196*01a344a2SDavid du Colombier //	print("\thits =%7W%7W%7W iops\n", cons.bhit+0, cons.bhit+1, cons.bhit+2);
197*01a344a2SDavid du Colombier //	print("\tread =%7W%7W%7W iops\n", cons.bread+0, cons.bread+1, cons.bread+2);
198*01a344a2SDavid du Colombier //	print("\trah  =%7W%7W%7W iops\n", cons.brahead+0, cons.brahead+1, cons.brahead+2);
199*01a344a2SDavid du Colombier //	print("\tinit =%7W%7W%7W iops\n", cons.binit+0, cons.binit+1, cons.binit+2);
200*01a344a2SDavid du Colombier 	print("\tbufs =    %3ld sm %3ld lg %ld res\n",
201*01a344a2SDavid du Colombier 		cons.nsmall, cons.nlarge, cons.nreseq);
202*01a344a2SDavid du Colombier 
203*01a344a2SDavid du Colombier 	for(i=0; i<nelem(mballocs); i++)
204*01a344a2SDavid du Colombier 		if(mballocs[i])
205*01a344a2SDavid du Colombier 			print("\t[%d]=%d\n", i, mballocs[i]);
206*01a344a2SDavid du Colombier 
207*01a344a2SDavid du Colombier 	print("\tioerr=    %3ld wr %3ld ww %3ld dr %3ld dw\n",
208*01a344a2SDavid du Colombier 		cons.nwormre, cons.nwormwe, cons.nwrenre, cons.nwrenwe);
209*01a344a2SDavid du Colombier 	print("\tcache=     %9ld hit %9ld miss\n",
210*01a344a2SDavid du Colombier 		cons.nwormhit, cons.nwormmiss);
211*01a344a2SDavid du Colombier }
212*01a344a2SDavid du Colombier 
213*01a344a2SDavid du Colombier static int
flagcmp(void * va,void * vb)214*01a344a2SDavid du Colombier flagcmp(void *va, void *vb)
215*01a344a2SDavid du Colombier {
216*01a344a2SDavid du Colombier 	Flag *a, *b;
217*01a344a2SDavid du Colombier 
218*01a344a2SDavid du Colombier 	a = va;
219*01a344a2SDavid du Colombier 	b = vb;
220*01a344a2SDavid du Colombier 	return strcmp(a->arg0, b->arg0);
221*01a344a2SDavid du Colombier }
222*01a344a2SDavid du Colombier 
223*01a344a2SDavid du Colombier ulong
flag_install(char * arg,char * help)224*01a344a2SDavid du Colombier flag_install(char *arg, char *help)
225*01a344a2SDavid du Colombier {
226*01a344a2SDavid du Colombier 	int i;
227*01a344a2SDavid du Colombier 
228*01a344a2SDavid du Colombier 	qlock(&cons);
229*01a344a2SDavid du Colombier 	for(i=0; flag[i].arg0; i++)
230*01a344a2SDavid du Colombier 		;
231*01a344a2SDavid du Colombier 	if(i >= 32) {
232*01a344a2SDavid du Colombier 		qunlock(&cons);
233*01a344a2SDavid du Colombier 		print("flag_install: too many flags\n");
234*01a344a2SDavid du Colombier 		return 0;
235*01a344a2SDavid du Colombier 	}
236*01a344a2SDavid du Colombier 	flag[i+1].arg0 = 0;
237*01a344a2SDavid du Colombier 	flag[i].arg0 = arg;
238*01a344a2SDavid du Colombier 	flag[i].help = help;
239*01a344a2SDavid du Colombier 	flag[i].flag = 1<<i;
240*01a344a2SDavid du Colombier 	qsort(flag, i+1, sizeof(Flag), flagcmp);
241*01a344a2SDavid du Colombier 	qunlock(&cons);
242*01a344a2SDavid du Colombier 	return 1<<i;
243*01a344a2SDavid du Colombier }
244*01a344a2SDavid du Colombier 
245*01a344a2SDavid du Colombier void
cmd_flag(int argc,char * argv[])246*01a344a2SDavid du Colombier cmd_flag(int argc, char *argv[])
247*01a344a2SDavid du Colombier {
248*01a344a2SDavid du Colombier 	int f, n, i, j;
249*01a344a2SDavid du Colombier 	char *s;
250*01a344a2SDavid du Colombier 	Chan *cp;
251*01a344a2SDavid du Colombier 
252*01a344a2SDavid du Colombier 	if(argc <= 1) {
253*01a344a2SDavid du Colombier 		for(i=0; flag[i].arg0; i++)
254*01a344a2SDavid du Colombier 			print("%.4lux %s %s\n",
255*01a344a2SDavid du Colombier 				flag[i].flag, flag[i].arg0, flag[i].help);
256*01a344a2SDavid du Colombier 		if(cons.flags)
257*01a344a2SDavid du Colombier 			print("flag[*]   = %.4lux\n", cons.flags);
258*01a344a2SDavid du Colombier 		for(cp = chans; cp; cp = cp->next)
259*01a344a2SDavid du Colombier 			if(cp->flags)
260*01a344a2SDavid du Colombier 				print("flag[%3d] = %.4lux\n", cp->chan, cp->flags);
261*01a344a2SDavid du Colombier 		return;
262*01a344a2SDavid du Colombier 	}
263*01a344a2SDavid du Colombier 
264*01a344a2SDavid du Colombier 	f = 0;
265*01a344a2SDavid du Colombier 	n = -1;
266*01a344a2SDavid du Colombier 	for(i=1; i<argc; i++) {
267*01a344a2SDavid du Colombier 		for(j=0; s=flag[j].arg0; j++)
268*01a344a2SDavid du Colombier 			if(strcmp(s, argv[i]) == 0)
269*01a344a2SDavid du Colombier 				goto found;
270*01a344a2SDavid du Colombier 		j = number(argv[i], -1, 10);
271*01a344a2SDavid du Colombier 		if(j < 0) {
272*01a344a2SDavid du Colombier 			print("bad flag argument: %s\n", argv[i]);
273*01a344a2SDavid du Colombier 			continue;
274*01a344a2SDavid du Colombier 		}
275*01a344a2SDavid du Colombier 		n = j;
276*01a344a2SDavid du Colombier 		continue;
277*01a344a2SDavid du Colombier 	found:
278*01a344a2SDavid du Colombier 		f |= flag[j].flag;
279*01a344a2SDavid du Colombier 	}
280*01a344a2SDavid du Colombier 
281*01a344a2SDavid du Colombier 	if(n < 0) {
282*01a344a2SDavid du Colombier 		cons.flags ^= f;
283*01a344a2SDavid du Colombier 		if(f == 0)
284*01a344a2SDavid du Colombier 			cons.flags = 0;
285*01a344a2SDavid du Colombier 		print("flag      = %.8lux\n", cons.flags);
286*01a344a2SDavid du Colombier 		return;
287*01a344a2SDavid du Colombier 	}
288*01a344a2SDavid du Colombier 	for(cp = chans; cp; cp = cp->next)
289*01a344a2SDavid du Colombier 		if(cp->chan == n) {
290*01a344a2SDavid du Colombier 			cp->flags ^= f;
291*01a344a2SDavid du Colombier 			if(f == 0)
292*01a344a2SDavid du Colombier 				cp->flags = 0;
293*01a344a2SDavid du Colombier 			print("flag[%3d] = %.8lux\n", cp->chan, cp->flags);
294*01a344a2SDavid du Colombier 			return;
295*01a344a2SDavid du Colombier 		}
296*01a344a2SDavid du Colombier 	print("no such channel\n");
297*01a344a2SDavid du Colombier }
298*01a344a2SDavid du Colombier 
299*01a344a2SDavid du Colombier static void
cmd_who(int argc,char * argv[])300*01a344a2SDavid du Colombier cmd_who(int argc, char *argv[])
301*01a344a2SDavid du Colombier {
302*01a344a2SDavid du Colombier 	Chan *cp;
303*01a344a2SDavid du Colombier 	int i, c;
304*01a344a2SDavid du Colombier 
305*01a344a2SDavid du Colombier 	c = 0;
306*01a344a2SDavid du Colombier 	for(cp = chans; cp; cp = cp->next) {
307*01a344a2SDavid du Colombier 		if(cp->whotime == 0 && !(cons.flags & whoflag)) {
308*01a344a2SDavid du Colombier 			c++;
309*01a344a2SDavid du Colombier 			continue;
310*01a344a2SDavid du Colombier 		}
311*01a344a2SDavid du Colombier 		if(argc > 1) {
312*01a344a2SDavid du Colombier 			for(i=1; i<argc; i++)
313*01a344a2SDavid du Colombier 				if(strcmp(argv[i], cp->whoname) == 0)
314*01a344a2SDavid du Colombier 					break;
315*01a344a2SDavid du Colombier 			if(i >= argc) {
316*01a344a2SDavid du Colombier 				c++;
317*01a344a2SDavid du Colombier 				continue;
318*01a344a2SDavid du Colombier 			}
319*01a344a2SDavid du Colombier 		}
320*01a344a2SDavid du Colombier 		print("%3d: %10s %24s", cp->chan,
321*01a344a2SDavid du Colombier 			cp->whoname? cp->whoname: "<nowhoname>", cp->whochan);
322*01a344a2SDavid du Colombier 		if(cp->whoprint)
323*01a344a2SDavid du Colombier 			cp->whoprint(cp);
324*01a344a2SDavid du Colombier 		print("\n");
325*01a344a2SDavid du Colombier 		prflush();
326*01a344a2SDavid du Colombier 	}
327*01a344a2SDavid du Colombier 	if(c > 0)
328*01a344a2SDavid du Colombier 		print("%d chans not listed\n", c);
329*01a344a2SDavid du Colombier }
330*01a344a2SDavid du Colombier 
331*01a344a2SDavid du Colombier static void
cmd_hangup(int argc,char * argv[])332*01a344a2SDavid du Colombier cmd_hangup(int argc, char *argv[])
333*01a344a2SDavid du Colombier {
334*01a344a2SDavid du Colombier 	Chan *cp;
335*01a344a2SDavid du Colombier 	int n;
336*01a344a2SDavid du Colombier 
337*01a344a2SDavid du Colombier 	if(argc < 2) {
338*01a344a2SDavid du Colombier 		print("usage: hangup chan-number\n");
339*01a344a2SDavid du Colombier 		return;
340*01a344a2SDavid du Colombier 	}
341*01a344a2SDavid du Colombier 	n = number(argv[1], -1, 10);
342*01a344a2SDavid du Colombier 	for(cp = chans; cp; cp = cp->next) {
343*01a344a2SDavid du Colombier 		if(cp->whotime == 0) {
344*01a344a2SDavid du Colombier 			if(cp->chan == n)
345*01a344a2SDavid du Colombier 				print("that chan is hung up\n");
346*01a344a2SDavid du Colombier 			continue;
347*01a344a2SDavid du Colombier 		}
348*01a344a2SDavid du Colombier 		if(cp->chan == n) {
349*01a344a2SDavid du Colombier 			/* need more than just fileinit with tcp */
350*01a344a2SDavid du Colombier 			chanhangup(cp, "console command", 1);
351*01a344a2SDavid du Colombier 			fileinit(cp);
352*01a344a2SDavid du Colombier 		}
353*01a344a2SDavid du Colombier 	}
354*01a344a2SDavid du Colombier }
355*01a344a2SDavid du Colombier 
356*01a344a2SDavid du Colombier static void
cmd_sync(int,char * [])357*01a344a2SDavid du Colombier cmd_sync(int, char *[])
358*01a344a2SDavid du Colombier {
359*01a344a2SDavid du Colombier 	wlock(&mainlock);	/* sync */
360*01a344a2SDavid du Colombier 	sync("command");
361*01a344a2SDavid du Colombier 	wunlock(&mainlock);
362*01a344a2SDavid du Colombier 	print("\n");
363*01a344a2SDavid du Colombier }
364*01a344a2SDavid du Colombier 
365*01a344a2SDavid du Colombier static void
cmd_help(int argc,char * argv[])366*01a344a2SDavid du Colombier cmd_help(int argc, char *argv[])
367*01a344a2SDavid du Colombier {
368*01a344a2SDavid du Colombier 	char *arg;
369*01a344a2SDavid du Colombier 	int i, j;
370*01a344a2SDavid du Colombier 
371*01a344a2SDavid du Colombier 	for(i=0; arg=command[i].arg0; i++) {
372*01a344a2SDavid du Colombier 		if(argc > 1) {
373*01a344a2SDavid du Colombier 			for(j=1; j<argc; j++)
374*01a344a2SDavid du Colombier 				if(strcmp(argv[j], arg) == 0)
375*01a344a2SDavid du Colombier 					goto found;
376*01a344a2SDavid du Colombier 			continue;
377*01a344a2SDavid du Colombier 		}
378*01a344a2SDavid du Colombier 	found:
379*01a344a2SDavid du Colombier 		print("\t%s %s\n", arg, command[i].help);
380*01a344a2SDavid du Colombier 		prflush();
381*01a344a2SDavid du Colombier 	}
382*01a344a2SDavid du Colombier }
383*01a344a2SDavid du Colombier 
384*01a344a2SDavid du Colombier void
cmd_fstat(int argc,char * argv[])385*01a344a2SDavid du Colombier cmd_fstat(int argc, char *argv[])
386*01a344a2SDavid du Colombier {
387*01a344a2SDavid du Colombier 	int i;
388*01a344a2SDavid du Colombier 
389*01a344a2SDavid du Colombier 	for(i=1; i<argc; i++) {
390*01a344a2SDavid du Colombier 		if(walkto(argv[i])) {
391*01a344a2SDavid du Colombier 			print("cant stat %s\n", argv[i]);
392*01a344a2SDavid du Colombier 			continue;
393*01a344a2SDavid du Colombier 		}
394*01a344a2SDavid du Colombier 		con_fstat(FID2);
395*01a344a2SDavid du Colombier 	}
396*01a344a2SDavid du Colombier }
397*01a344a2SDavid du Colombier 
398*01a344a2SDavid du Colombier void
cmd_create(int argc,char * argv[])399*01a344a2SDavid du Colombier cmd_create(int argc, char *argv[])
400*01a344a2SDavid du Colombier {
401*01a344a2SDavid du Colombier 	int uid, gid;
402*01a344a2SDavid du Colombier 	long perm;
403*01a344a2SDavid du Colombier 	char elem[NAMELEN], *p;
404*01a344a2SDavid du Colombier 
405*01a344a2SDavid du Colombier 	if(argc < 5) {
406*01a344a2SDavid du Colombier 		print("usage: create path uid gid mode [lad]\n");
407*01a344a2SDavid du Colombier 		return;
408*01a344a2SDavid du Colombier 	}
409*01a344a2SDavid du Colombier 
410*01a344a2SDavid du Colombier 	p = utfrrune(argv[1], '/');
411*01a344a2SDavid du Colombier 	if(p) {
412*01a344a2SDavid du Colombier 		*p++ = 0;
413*01a344a2SDavid du Colombier 		if(walkto(argv[1])) {
414*01a344a2SDavid du Colombier 			print("create failed in walkto: %s\n", p);
415*01a344a2SDavid du Colombier 			return;
416*01a344a2SDavid du Colombier 		}
417*01a344a2SDavid du Colombier 	} else {
418*01a344a2SDavid du Colombier 		if(walkto("/"))
419*01a344a2SDavid du Colombier 			return;
420*01a344a2SDavid du Colombier 		p = argv[1];
421*01a344a2SDavid du Colombier 	}
422*01a344a2SDavid du Colombier 	if(strlen(p) >= NAMELEN) {
423*01a344a2SDavid du Colombier 		print("name too long %s\n", p);
424*01a344a2SDavid du Colombier 		return;
425*01a344a2SDavid du Colombier 	}
426*01a344a2SDavid du Colombier 
427*01a344a2SDavid du Colombier 	memset(elem, 0, sizeof(elem));
428*01a344a2SDavid du Colombier 	strcpy(elem, p);
429*01a344a2SDavid du Colombier 
430*01a344a2SDavid du Colombier 	uid = strtouid(argv[2]);
431*01a344a2SDavid du Colombier 	if(uid < -1)
432*01a344a2SDavid du Colombier 		uid = number(argv[2], -2, 10);
433*01a344a2SDavid du Colombier 	if(uid < -1) {
434*01a344a2SDavid du Colombier 		print("bad uid %s\n", argv[2]);
435*01a344a2SDavid du Colombier 		return;
436*01a344a2SDavid du Colombier 	}
437*01a344a2SDavid du Colombier 
438*01a344a2SDavid du Colombier 	gid = strtouid(argv[3]);
439*01a344a2SDavid du Colombier 	if(gid < -1)
440*01a344a2SDavid du Colombier 		gid = number(argv[3], -2, 10);
441*01a344a2SDavid du Colombier 	if(gid < -1) {
442*01a344a2SDavid du Colombier 		print("bad gid %s\n", argv[3]);
443*01a344a2SDavid du Colombier 		return;
444*01a344a2SDavid du Colombier 	}
445*01a344a2SDavid du Colombier 
446*01a344a2SDavid du Colombier 	perm = number(argv[4], 0777, 8) & 0777;
447*01a344a2SDavid du Colombier 
448*01a344a2SDavid du Colombier 	if(argc > 5) {
449*01a344a2SDavid du Colombier 		if(strchr(argv[5], 'l'))
450*01a344a2SDavid du Colombier 			perm |= PLOCK;
451*01a344a2SDavid du Colombier 		if(strchr(argv[5], 'a'))
452*01a344a2SDavid du Colombier 			perm |= PAPND;
453*01a344a2SDavid du Colombier 		if(strchr(argv[5], 'd'))
454*01a344a2SDavid du Colombier 			perm |= PDIR;
455*01a344a2SDavid du Colombier 	}
456*01a344a2SDavid du Colombier 
457*01a344a2SDavid du Colombier 	if(con_create(FID2, elem, uid, gid, perm, 0))
458*01a344a2SDavid du Colombier 		print("create failed: %s/%s\n", argv[1], p);
459*01a344a2SDavid du Colombier }
460*01a344a2SDavid du Colombier 
461*01a344a2SDavid du Colombier static void
cmd_clri(int argc,char * argv[])462*01a344a2SDavid du Colombier cmd_clri(int argc, char *argv[])
463*01a344a2SDavid du Colombier {
464*01a344a2SDavid du Colombier 	int i;
465*01a344a2SDavid du Colombier 
466*01a344a2SDavid du Colombier 	for(i=1; i<argc; i++) {
467*01a344a2SDavid du Colombier 		if(walkto(argv[i])) {
468*01a344a2SDavid du Colombier 			print("cant remove %s\n", argv[i]);
469*01a344a2SDavid du Colombier 			continue;
470*01a344a2SDavid du Colombier 		}
471*01a344a2SDavid du Colombier 		con_clri(FID2);
472*01a344a2SDavid du Colombier 	}
473*01a344a2SDavid du Colombier }
474*01a344a2SDavid du Colombier 
475*01a344a2SDavid du Colombier static void
cmd_allow(int,char **)476*01a344a2SDavid du Colombier cmd_allow(int, char**)
477*01a344a2SDavid du Colombier {
478*01a344a2SDavid du Colombier 	wstatallow = writeallow = 1;
479*01a344a2SDavid du Colombier }
480*01a344a2SDavid du Colombier 
481*01a344a2SDavid du Colombier static void
cmd_disallow(int,char **)482*01a344a2SDavid du Colombier cmd_disallow(int, char**)
483*01a344a2SDavid du Colombier {
484*01a344a2SDavid du Colombier 	wstatallow = writeallow = 0;
485*01a344a2SDavid du Colombier }
486*01a344a2SDavid du Colombier 
487*01a344a2SDavid du Colombier void
ckblock(Device * d,Off a,int typ,Off qpath)488*01a344a2SDavid du Colombier ckblock(Device *d, Off a, int typ, Off qpath)
489*01a344a2SDavid du Colombier {
490*01a344a2SDavid du Colombier 	Iobuf *p;
491*01a344a2SDavid du Colombier 
492*01a344a2SDavid du Colombier 	if(a) {
493*01a344a2SDavid du Colombier 		p = getbuf(d, a, Brd);
494*01a344a2SDavid du Colombier 		if(p) {
495*01a344a2SDavid du Colombier 			checktag(p, typ, qpath);
496*01a344a2SDavid du Colombier 			putbuf(p);
497*01a344a2SDavid du Colombier 		}
498*01a344a2SDavid du Colombier 	}
499*01a344a2SDavid du Colombier }
500*01a344a2SDavid du Colombier 
501*01a344a2SDavid du Colombier void
doclean(Iobuf * p,Dentry * d,int n,Off a)502*01a344a2SDavid du Colombier doclean(Iobuf *p, Dentry *d, int n, Off a)
503*01a344a2SDavid du Colombier {
504*01a344a2SDavid du Colombier 	int i, mod, typ;
505*01a344a2SDavid du Colombier 	Off qpath;
506*01a344a2SDavid du Colombier 
507*01a344a2SDavid du Colombier 	mod = 0;
508*01a344a2SDavid du Colombier 	qpath = d->qid.path;
509*01a344a2SDavid du Colombier 	typ = Tfile;
510*01a344a2SDavid du Colombier 	if(d->mode & DDIR)
511*01a344a2SDavid du Colombier 		typ = Tdir;
512*01a344a2SDavid du Colombier 	for(i=0; i<NDBLOCK; i++) {
513*01a344a2SDavid du Colombier 		print("dblock[%d] = %lld\n", i, (Wideoff)d->dblock[i]);
514*01a344a2SDavid du Colombier 		ckblock(p->dev, d->dblock[i], typ, qpath);
515*01a344a2SDavid du Colombier 		if(i == n) {
516*01a344a2SDavid du Colombier 			d->dblock[i] = a;
517*01a344a2SDavid du Colombier 			mod = 1;
518*01a344a2SDavid du Colombier 			print("dblock[%d] modified %lld\n", i, (Wideoff)a);
519*01a344a2SDavid du Colombier 		}
520*01a344a2SDavid du Colombier 	}
521*01a344a2SDavid du Colombier 
522*01a344a2SDavid du Colombier 	/* add NDBLOCK so user can cite block address by index */
523*01a344a2SDavid du Colombier 	for (i = 0; i < NIBLOCK; i++) {
524*01a344a2SDavid du Colombier 		print("iblocks[%d] = %lld\n", NDBLOCK+i, (Wideoff)d->iblocks[i]);
525*01a344a2SDavid du Colombier 		ckblock(p->dev, d->iblocks[i], Tind1+i, qpath);
526*01a344a2SDavid du Colombier 		if(NDBLOCK+i == n) {
527*01a344a2SDavid du Colombier 			d->iblocks[i] = a;
528*01a344a2SDavid du Colombier 			mod = 1;
529*01a344a2SDavid du Colombier 			print("iblocks[%d] modified %lld\n", NDBLOCK+i, (Wideoff)a);
530*01a344a2SDavid du Colombier 		}
531*01a344a2SDavid du Colombier 	}
532*01a344a2SDavid du Colombier 
533*01a344a2SDavid du Colombier 	if(mod)
534*01a344a2SDavid du Colombier 		p->flags |= Bmod|Bimm;
535*01a344a2SDavid du Colombier }
536*01a344a2SDavid du Colombier 
537*01a344a2SDavid du Colombier static void
cmd_clean(int argc,char * argv[])538*01a344a2SDavid du Colombier cmd_clean(int argc, char *argv[])
539*01a344a2SDavid du Colombier {
540*01a344a2SDavid du Colombier 	int n;
541*01a344a2SDavid du Colombier 	Off a;
542*01a344a2SDavid du Colombier 	Iobuf *p;
543*01a344a2SDavid du Colombier 	Dentry *d;
544*01a344a2SDavid du Colombier 	File *f;
545*01a344a2SDavid du Colombier 
546*01a344a2SDavid du Colombier 	p = 0;
547*01a344a2SDavid du Colombier 	f = 0;
548*01a344a2SDavid du Colombier 	while(argc > 1) {
549*01a344a2SDavid du Colombier 		n = -1;
550*01a344a2SDavid du Colombier 		if(argc > 2)
551*01a344a2SDavid du Colombier 			n = number(argv[2], -1, 10);
552*01a344a2SDavid du Colombier 		a = 0;
553*01a344a2SDavid du Colombier 		if(argc > 3)
554*01a344a2SDavid du Colombier 			a = number(argv[3], 0, 10);
555*01a344a2SDavid du Colombier 		if(walkto(argv[1])) {
556*01a344a2SDavid du Colombier 			print("cant remove %s\n", argv[1]);
557*01a344a2SDavid du Colombier 			break;
558*01a344a2SDavid du Colombier 		}
559*01a344a2SDavid du Colombier 		f = filep(cons.chan, FID2, 0);
560*01a344a2SDavid du Colombier 		if(!f)
561*01a344a2SDavid du Colombier 			break;
562*01a344a2SDavid du Colombier 		if(n >= 0 && f->fs->dev->type == Devro) {
563*01a344a2SDavid du Colombier 			print("readonly %s\n", argv[1]);
564*01a344a2SDavid du Colombier 			break;
565*01a344a2SDavid du Colombier 		}
566*01a344a2SDavid du Colombier 		p = getbuf(f->fs->dev, f->addr, Brd);
567*01a344a2SDavid du Colombier 		d = getdir(p, f->slot);
568*01a344a2SDavid du Colombier 		if(!d || !(d->mode & DALLOC)) {
569*01a344a2SDavid du Colombier 			print("not alloc %s\n", argv[1]);
570*01a344a2SDavid du Colombier 			break;
571*01a344a2SDavid du Colombier 		}
572*01a344a2SDavid du Colombier 		doclean(p, d, n, a);
573*01a344a2SDavid du Colombier 		break;
574*01a344a2SDavid du Colombier 	}
575*01a344a2SDavid du Colombier 	if(f)
576*01a344a2SDavid du Colombier 		qunlock(f);
577*01a344a2SDavid du Colombier 	if(p)
578*01a344a2SDavid du Colombier 		putbuf(p);
579*01a344a2SDavid du Colombier }
580*01a344a2SDavid du Colombier 
581*01a344a2SDavid du Colombier static void
cmd_remove(int argc,char * argv[])582*01a344a2SDavid du Colombier cmd_remove(int argc, char *argv[])
583*01a344a2SDavid du Colombier {
584*01a344a2SDavid du Colombier 	int i;
585*01a344a2SDavid du Colombier 
586*01a344a2SDavid du Colombier 	for(i=1; i<argc; i++) {
587*01a344a2SDavid du Colombier 		if(walkto(argv[i])) {
588*01a344a2SDavid du Colombier 			print("cant remove %s\n", argv[i]);
589*01a344a2SDavid du Colombier 			continue;
590*01a344a2SDavid du Colombier 		}
591*01a344a2SDavid du Colombier 		con_remove(FID2);
592*01a344a2SDavid du Colombier 	}
593*01a344a2SDavid du Colombier }
594*01a344a2SDavid du Colombier 
595*01a344a2SDavid du Colombier static void
cmd_version(int,char * [])596*01a344a2SDavid du Colombier cmd_version(int, char *[])
597*01a344a2SDavid du Colombier {
598*01a344a2SDavid du Colombier 	print("%d-bit %s as of %T\n", sizeof(Off)*8 - 1, service, fs_mktime);
599*01a344a2SDavid du Colombier 	print("\tlast boot %T\n", boottime);
600*01a344a2SDavid du Colombier }
601*01a344a2SDavid du Colombier 
602*01a344a2SDavid du Colombier static void
cmd_cfs(int argc,char * argv[])603*01a344a2SDavid du Colombier cmd_cfs(int argc, char *argv[])
604*01a344a2SDavid du Colombier {
605*01a344a2SDavid du Colombier 	Filsys *fs;
606*01a344a2SDavid du Colombier 	char *name;
607*01a344a2SDavid du Colombier 
608*01a344a2SDavid du Colombier 	name = "main";
609*01a344a2SDavid du Colombier 	if(argc > 1)
610*01a344a2SDavid du Colombier 		name = argv[1];
611*01a344a2SDavid du Colombier 	fs = fsstr(name);
612*01a344a2SDavid du Colombier 	if(fs == 0) {
613*01a344a2SDavid du Colombier 		print("%s: unknown file system\n", name);
614*01a344a2SDavid du Colombier 		if(cons.curfs)
615*01a344a2SDavid du Colombier 			return;
616*01a344a2SDavid du Colombier 		fs = &filsys[0];
617*01a344a2SDavid du Colombier 	}
618*01a344a2SDavid du Colombier 	if(con_attach(FID1, "adm", fs->name))
619*01a344a2SDavid du Colombier 		panic("FID1 attach to root");
620*01a344a2SDavid du Colombier 	cons.curfs = fs;
621*01a344a2SDavid du Colombier 	print("current fs is \"%s\"\n", cons.curfs->name);
622*01a344a2SDavid du Colombier }
623*01a344a2SDavid du Colombier 
624*01a344a2SDavid du Colombier static void
cmd_prof(int argc,char * argv[])625*01a344a2SDavid du Colombier cmd_prof(int argc, char *argv[])
626*01a344a2SDavid du Colombier {
627*01a344a2SDavid du Colombier 	int n;
628*01a344a2SDavid du Colombier 	long m, o;
629*01a344a2SDavid du Colombier 	char *p;
630*01a344a2SDavid du Colombier 
631*01a344a2SDavid du Colombier 	if(cons.profbuf == 0) {
632*01a344a2SDavid du Colombier 		print("no buffer\n");
633*01a344a2SDavid du Colombier 		return;
634*01a344a2SDavid du Colombier 	}
635*01a344a2SDavid du Colombier 	n = !cons.profile;
636*01a344a2SDavid du Colombier 	if(argc > 1)
637*01a344a2SDavid du Colombier 		n = number(argv[1], n, 10);
638*01a344a2SDavid du Colombier 	if(n && !cons.profile) {
639*01a344a2SDavid du Colombier 		print("clr and start\n");
640*01a344a2SDavid du Colombier 		memset(cons.profbuf, 0, cons.nprofbuf*sizeof(cons.profbuf[0]));
641*01a344a2SDavid du Colombier 		cons.profile = 1;
642*01a344a2SDavid du Colombier 		return;
643*01a344a2SDavid du Colombier 	}
644*01a344a2SDavid du Colombier 	if(!n && cons.profile) {
645*01a344a2SDavid du Colombier 		cons.profile = 0;
646*01a344a2SDavid du Colombier 		print("stop and write\n");
647*01a344a2SDavid du Colombier 		if(walkto("/adm/kprofdata"))
648*01a344a2SDavid du Colombier 			goto bad;
649*01a344a2SDavid du Colombier 		if(con_open(FID2, OWRITE|OTRUNC)) {
650*01a344a2SDavid du Colombier 		bad:
651*01a344a2SDavid du Colombier 			print("cant open /adm/kprofdata\n");
652*01a344a2SDavid du Colombier 			return;
653*01a344a2SDavid du Colombier 		}
654*01a344a2SDavid du Colombier 		p = (char*)cons.profbuf;
655*01a344a2SDavid du Colombier 		for(m=0; m<cons.nprofbuf; m++) {
656*01a344a2SDavid du Colombier 			n = cons.profbuf[m];
657*01a344a2SDavid du Colombier 			p[0] = n>>24;
658*01a344a2SDavid du Colombier 			p[1] = n>>16;
659*01a344a2SDavid du Colombier 			p[2] = n>>8;
660*01a344a2SDavid du Colombier 			p[3] = n>>0;
661*01a344a2SDavid du Colombier 			p += 4;
662*01a344a2SDavid du Colombier 		}
663*01a344a2SDavid du Colombier 
664*01a344a2SDavid du Colombier 		m = cons.nprofbuf*sizeof(cons.profbuf[0]);
665*01a344a2SDavid du Colombier 		o = 0;
666*01a344a2SDavid du Colombier 		while(m > 0) {
667*01a344a2SDavid du Colombier 			n = 8192;
668*01a344a2SDavid du Colombier 			if(n > m)
669*01a344a2SDavid du Colombier 				n = m;
670*01a344a2SDavid du Colombier 			con_write(FID2, (char*)cons.profbuf+o, o, n);
671*01a344a2SDavid du Colombier 			m -= n;
672*01a344a2SDavid du Colombier 			o += n;
673*01a344a2SDavid du Colombier 		}
674*01a344a2SDavid du Colombier 		return;
675*01a344a2SDavid du Colombier 	}
676*01a344a2SDavid du Colombier }
677*01a344a2SDavid du Colombier 
678*01a344a2SDavid du Colombier static void
cmd_time(int argc,char * argv[])679*01a344a2SDavid du Colombier cmd_time(int argc, char *argv[])
680*01a344a2SDavid du Colombier {
681*01a344a2SDavid du Colombier 	int i, len;
682*01a344a2SDavid du Colombier 	char *cmd;
683*01a344a2SDavid du Colombier 	Timet t1, t2;
684*01a344a2SDavid du Colombier 
685*01a344a2SDavid du Colombier 	t1 = time(nil);
686*01a344a2SDavid du Colombier 	len = 0;
687*01a344a2SDavid du Colombier 	for(i=1; i<argc; i++)
688*01a344a2SDavid du Colombier 		len += 1 + strlen(argv[i]);
689*01a344a2SDavid du Colombier 	cmd = malloc(len + 1);
690*01a344a2SDavid du Colombier 	cmd[0] = 0;
691*01a344a2SDavid du Colombier 	for(i=1; i<argc; i++) {
692*01a344a2SDavid du Colombier 		strcat(cmd, " ");
693*01a344a2SDavid du Colombier 		strcat(cmd, argv[i]);
694*01a344a2SDavid du Colombier 	}
695*01a344a2SDavid du Colombier 	cmd_exec(cmd);
696*01a344a2SDavid du Colombier 	t2 = time(nil);
697*01a344a2SDavid du Colombier 	free(cmd);
698*01a344a2SDavid du Colombier 	print("time = %ld ms\n", TK2MS(t2-t1));
699*01a344a2SDavid du Colombier }
700*01a344a2SDavid du Colombier 
701*01a344a2SDavid du Colombier void
cmd_noattach(int,char * [])702*01a344a2SDavid du Colombier cmd_noattach(int, char *[])
703*01a344a2SDavid du Colombier {
704*01a344a2SDavid du Colombier 	noattach = !noattach;
705*01a344a2SDavid du Colombier 	if(noattach)
706*01a344a2SDavid du Colombier 		print("attaches are DISABLED\n");
707*01a344a2SDavid du Colombier }
708*01a344a2SDavid du Colombier 
709*01a344a2SDavid du Colombier void
cmd_files(int,char * [])710*01a344a2SDavid du Colombier cmd_files(int, char *[])
711*01a344a2SDavid du Colombier {
712*01a344a2SDavid du Colombier 	long i, n;
713*01a344a2SDavid du Colombier 	Chan *cp;
714*01a344a2SDavid du Colombier 
715*01a344a2SDavid du Colombier 	for(cp = chans; cp; cp = cp->next)
716*01a344a2SDavid du Colombier 		cp->nfile = 0;
717*01a344a2SDavid du Colombier 
718*01a344a2SDavid du Colombier 	lock(&flock);
719*01a344a2SDavid du Colombier 	n = 0;
720*01a344a2SDavid du Colombier 	for(i=0; i<conf.nfile; i++)
721*01a344a2SDavid du Colombier 		if(files[i].cp) {
722*01a344a2SDavid du Colombier 			n++;
723*01a344a2SDavid du Colombier 			files[i].cp->nfile++;
724*01a344a2SDavid du Colombier 		}
725*01a344a2SDavid du Colombier 	print("%ld out of %ld files used\n", n, conf.nfile);
726*01a344a2SDavid du Colombier 	unlock(&flock);
727*01a344a2SDavid du Colombier 
728*01a344a2SDavid du Colombier 	n = 0;
729*01a344a2SDavid du Colombier 	for(cp = chans; cp; cp = cp->next)
730*01a344a2SDavid du Colombier 		if(cp->nfile) {
731*01a344a2SDavid du Colombier 			print("%3d: %5d\n", cp->chan, cp->nfile);
732*01a344a2SDavid du Colombier 			prflush();
733*01a344a2SDavid du Colombier 			n += cp->nfile;
734*01a344a2SDavid du Colombier 		}
735*01a344a2SDavid du Colombier 	print("%ld out of %ld files used\n", n, conf.nfile);
736*01a344a2SDavid du Colombier }
737*01a344a2SDavid du Colombier 
738*01a344a2SDavid du Colombier static void
installcmds(void)739*01a344a2SDavid du Colombier installcmds(void)
740*01a344a2SDavid du Colombier {
741*01a344a2SDavid du Colombier 	cmd_install("allow", "-- disable permission checking", cmd_allow);
742*01a344a2SDavid du Colombier 	cmd_install("cfs", "[file] -- set current filesystem", cmd_cfs);
743*01a344a2SDavid du Colombier 	cmd_install("clean", "file [bno [addr]] -- block print/fix", cmd_clean);
744*01a344a2SDavid du Colombier 	cmd_install("check", "[options]", cmd_check);
745*01a344a2SDavid du Colombier 	cmd_install("clri", "[file ...] -- purge files/dirs", cmd_clri);
746*01a344a2SDavid du Colombier 	cmd_install("create", "path uid gid perm [lad] -- make a file/dir", cmd_create);
747*01a344a2SDavid du Colombier 	cmd_install("disallow", "-- enable permission checking", cmd_disallow);
748*01a344a2SDavid du Colombier 	cmd_install("duallow", "uid -- duallow", cmd_duallow);
749*01a344a2SDavid du Colombier 	cmd_install("flag", "-- print set flags", cmd_flag);
750*01a344a2SDavid du Colombier 	cmd_install("fstat", "path -- print info on a file/dir", cmd_fstat);
751*01a344a2SDavid du Colombier 	cmd_install("halt", "-- return to boot rom", cmd_halt);
752*01a344a2SDavid du Colombier 	cmd_install("help", "", cmd_help);
753*01a344a2SDavid du Colombier 	cmd_install("newuser", "username -- add user to /adm/users", cmd_newuser);
754*01a344a2SDavid du Colombier 	cmd_install("profile", "[01] -- fs profile", cmd_prof);
755*01a344a2SDavid du Colombier 	cmd_install("remove", "[file ...] -- remove files/dirs", cmd_remove);
756*01a344a2SDavid du Colombier 	cmd_install("stata", "-- overall stats", cmd_stata);
757*01a344a2SDavid du Colombier 	cmd_install("stats", "[[-]flags ...] -- various stats", cmd_stats);
758*01a344a2SDavid du Colombier 	cmd_install("sync", "", cmd_sync);
759*01a344a2SDavid du Colombier 	cmd_install("time", "command -- time another command", cmd_time);
760*01a344a2SDavid du Colombier 	cmd_install("users", "[file] -- read /adm/users", cmd_users);
761*01a344a2SDavid du Colombier 	cmd_install("version", "-- print time of mk and boot", cmd_version);
762*01a344a2SDavid du Colombier 	cmd_install("who", "[user ...] -- print attaches", cmd_who);
763*01a344a2SDavid du Colombier 	cmd_install("hangup", "chan -- clunk files", cmd_hangup);
764*01a344a2SDavid du Colombier 	cmd_install("printconf", "-- print configuration", cmd_printconf);
765*01a344a2SDavid du Colombier 	cmd_install("noattach", "toggle noattach flag", cmd_noattach);
766*01a344a2SDavid du Colombier 	cmd_install("files", "report on files structure", cmd_files);
767*01a344a2SDavid du Colombier 
768*01a344a2SDavid du Colombier 	attachflag = flag_install("attach", "-- attach calls");
769*01a344a2SDavid du Colombier 	chatflag = flag_install("chat", "-- verbose");
770*01a344a2SDavid du Colombier 	errorflag = flag_install("error", "-- on errors");
771*01a344a2SDavid du Colombier 	whoflag = flag_install("allchans", "-- on who");
772*01a344a2SDavid du Colombier 	authdebugflag = flag_install("authdebug", "-- report authentications");
773*01a344a2SDavid du Colombier 	authdisableflag = flag_install("authdisable", "-- disable authentication");
774*01a344a2SDavid du Colombier }
775*01a344a2SDavid du Colombier 
776*01a344a2SDavid du Colombier int
walkto(char * name)777*01a344a2SDavid du Colombier walkto(char *name)
778*01a344a2SDavid du Colombier {
779*01a344a2SDavid du Colombier 	char elem[NAMELEN], *p;
780*01a344a2SDavid du Colombier 	int n;
781*01a344a2SDavid du Colombier 
782*01a344a2SDavid du Colombier 	if(con_clone(FID1, FID2))
783*01a344a2SDavid du Colombier 		return 1;
784*01a344a2SDavid du Colombier 
785*01a344a2SDavid du Colombier 	for(;;) {
786*01a344a2SDavid du Colombier 		p = utfrune(name, '/');
787*01a344a2SDavid du Colombier 		if(p == nil)
788*01a344a2SDavid du Colombier 			p = strchr(name, '\0');
789*01a344a2SDavid du Colombier 		if(p == name) {
790*01a344a2SDavid du Colombier 			if(*name == '\0')
791*01a344a2SDavid du Colombier 				return 0;
792*01a344a2SDavid du Colombier 			name = p+1;
793*01a344a2SDavid du Colombier 			continue;
794*01a344a2SDavid du Colombier 		}
795*01a344a2SDavid du Colombier 		n = p-name;
796*01a344a2SDavid du Colombier 		if(n > NAMELEN)
797*01a344a2SDavid du Colombier 			return 1;
798*01a344a2SDavid du Colombier 		memset(elem, 0, sizeof(elem));
799*01a344a2SDavid du Colombier 		memmove(elem, name, n);
800*01a344a2SDavid du Colombier 		if(con_walk(FID2, elem))
801*01a344a2SDavid du Colombier 			return 1;
802*01a344a2SDavid du Colombier 		name = p;
803*01a344a2SDavid du Colombier 	}
804*01a344a2SDavid du Colombier }
805*01a344a2SDavid du Colombier 
806*01a344a2SDavid du Colombier /* needs to parse and return vlongs to cope with new larger block numbers */
807*01a344a2SDavid du Colombier vlong
number(char * arg,int def,int base)808*01a344a2SDavid du Colombier number(char *arg, int def, int base)
809*01a344a2SDavid du Colombier {
810*01a344a2SDavid du Colombier 	int c, sign, any;
811*01a344a2SDavid du Colombier 	vlong n;
812*01a344a2SDavid du Colombier 
813*01a344a2SDavid du Colombier 	if(arg == nil)
814*01a344a2SDavid du Colombier 		return def;
815*01a344a2SDavid du Colombier 
816*01a344a2SDavid du Colombier 	sign = 0;
817*01a344a2SDavid du Colombier 	any = 0;
818*01a344a2SDavid du Colombier 	n = 0;
819*01a344a2SDavid du Colombier 
820*01a344a2SDavid du Colombier 	for (c = *arg; isascii(c) && isspace(c) && c != '\n'; c = *arg)
821*01a344a2SDavid du Colombier 		arg++;
822*01a344a2SDavid du Colombier 	if(c == '-') {
823*01a344a2SDavid du Colombier 		sign = 1;
824*01a344a2SDavid du Colombier 		arg++;
825*01a344a2SDavid du Colombier 		c = *arg;
826*01a344a2SDavid du Colombier 	}
827*01a344a2SDavid du Colombier 	while (isascii(c) && (isdigit(c) || base == 16 && isxdigit(c))) {
828*01a344a2SDavid du Colombier 		n *= base;
829*01a344a2SDavid du Colombier 		if(c >= 'a' && c <= 'f')
830*01a344a2SDavid du Colombier 			n += c - 'a' + 10;
831*01a344a2SDavid du Colombier 		else if(c >= 'A' && c <= 'F')
832*01a344a2SDavid du Colombier 			n += c - 'A' + 10;
833*01a344a2SDavid du Colombier 		else
834*01a344a2SDavid du Colombier 			n += c - '0';
835*01a344a2SDavid du Colombier 		arg++;
836*01a344a2SDavid du Colombier 		c = *arg;
837*01a344a2SDavid du Colombier 		any = 1;
838*01a344a2SDavid du Colombier 	}
839*01a344a2SDavid du Colombier 	if(!any)
840*01a344a2SDavid du Colombier 		return def;
841*01a344a2SDavid du Colombier 	if(sign)
842*01a344a2SDavid du Colombier 		n = -n;
843*01a344a2SDavid du Colombier 	return n;
844*01a344a2SDavid du Colombier }
845