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