10 typedef struct Cmd Cmd;
17 int (*f)(int, char **);
21 walkpath(Chan *ch, char *path, char **cr)
23 char buf[NAMELEN], *p, *fp;
28 werrstr("%s: %s", fp, Enoent);
33 p = strchr(path, '/');
37 werrstr("%s: trailing slash", fp);
43 p = path + strlen(path);
51 if(p - path >= NAMELEN)
53 memset(buf, 0, sizeof buf);
54 memcpy(buf, path, p - path);
55 if(chanwalk(ch, buf) <= 0){
56 werrstr("%s: %r", fp);
70 dprint("hjfs: sync\n");
85 dprint("hjfs: dumped\n");
90 cmdallow(int, char **)
92 fsmain->flags |= FSNOPERM | FSCHOWN;
93 dprint("hjfs: allow\n");
98 cmdchatty(int, char **)
102 chatty9p = !chatty9p;
107 cmddisallow(int, char **)
109 fsmain->flags &= ~(FSNOPERM | FSCHOWN);
110 dprint("hjfs: disallow\n");
115 cmdnoauth(int, char **)
117 fsmain->flags ^= FSNOAUTH;
118 if((fsmain->flags & FSNOAUTH) == 0)
119 dprint("hjfs: auth enabled\n");
121 dprint("hjfs: auth disabled\n");
126 cmdcreate(int argc, char **argv)
134 if(argc != 5 && argc != 6)
136 perm = strtol(argv[4], &n, 8) & 0777;
140 for(n = argv[5]; *n != 0; n++)
142 case 'l': perm |= DMEXCL; break;
143 case 'd': perm |= DMDIR; break;
144 case 'a': perm |= DMAPPEND; break;
145 default: return -9001;
147 if(name2uid(fsmain, argv[2], &uid) < 0)
149 if(name2uid(fsmain, argv[3], &gid) < 0)
151 ch = chanattach(fsmain, 0);
155 if(walkpath(ch, argv[1], &n) < 0){
159 if(chancreat(ch, n, perm, OREAD) < 0){
171 cmdecho(int, char **argv)
173 echo = strcmp(argv[1], "on") == 0;
186 sb = getbuf(fsmain->d, SUPERBLK, TSUPERBLOCK, 0);
192 for(i = sb->sb.fstart; i < sb->sb.fend; i++){
193 b = getbuf(fsmain->d, i, TREF, 0);
196 for(j = 0; j < REFPERBLK; j++)
201 dprint("hjfs: (blocks) free %ulld, used %ulld, total %ulld\n", n, sb->sb.size - n, sb->sb.size);
202 dprint("hjfs: (MB) free %ulld, used %ulld, total %ulld\n", n * BLOCK / 1048576, (sb->sb.size - n) * BLOCK / 1048576, sb->sb.size * BLOCK / 1048576);
209 cmddebugdeind(int, char **argv)
215 ch = chanattach(fsmain, 0);
219 if(walkpath(ch, argv[1], nil) < 0)
222 dprint("hjfs: loc %ulld / %uld, offset %ulld\n", ch->loc->blk, ch->loc->deind, BLOCK * ch->loc->blk + (RBLOCK - BLOCK) + DENTRYSIZ * ch->loc->deind);
223 b = getbuf(fsmain->d, ch->loc->blk, TDENTRY, 0);
228 d = &b->de[ch->loc->deind];
229 dprint("hjfs: name %s\n", d->name);
230 dprint("hjfs: uid %d, muid %d, gid %d\n", d->uid, d->muid, d->gid);
231 dprint("hjfs: mode %#o, qid %ulld, type %#x, version %d\n", d->mode, d->path, d->type, d->vers);
232 dprint("hjfs: size %d\n", d->size);
233 dprint("hjfs: atime %ulld, mtime %ulld\n", d->atime, d->mtime);
244 cmddebugchdeind(int, char **argv)
251 loc = strtol(argv[2], nil, 0);
252 new = strtol(argv[3], nil, 0);
255 ch = chanattach(fsmain, 0);
259 if(walkpath(ch, argv[1], nil) < 0)
262 b = getbuf(fsmain->d, ch->loc->blk, TDENTRY, 0);
267 c = (uchar *) &b->de[ch->loc->deind];
268 dprint("hjfs: loc %d, old value %#.2x, new value %#.2x\n", loc, c[loc], new);
281 cmddebuggetblk(int argc, char **argv)
286 uvlong r, start, end, i;
288 if(argc != 3 && argc != 4)
290 start = atoll(argv[2]);
292 end = atoll(argv[3]);
295 ch = chanattach(fsmain, 0);
299 if(walkpath(ch, argv[1], nil) < 0)
302 b = getbuf(fsmain->d, ch->loc->blk, TDENTRY, 0);
307 for(i = start; i <= end; i++){
308 rc = getblk(fsmain, ch->loc, b, i, &r, GBREAD);
310 dprint("hjfs: getblk %ulld = %ulld\n", i, r);
312 dprint("hjfs: getblk %ulld not found\n", i);
314 dprint("hjfs: getblk %ulld: %r\n", i);
325 extern int cmdnewuser(int, char **);
328 {"allow", 1, cmdallow},
329 {"noauth", 1, cmdnoauth},
330 {"chatty", 1, cmdchatty},
331 {"create", 0, cmdcreate},
332 {"disallow", 1, cmddisallow},
333 {"dump", 1, cmddump},
334 {"sync", 1, cmdsync},
335 {"halt", 1, cmdhalt},
336 {"newuser", 0, cmdnewuser},
337 {"echo", 2, cmdecho},
339 {"debug-deind", 2, cmddebugdeind},
340 {"debug-getblk", 0, cmddebuggetblk},
341 {"debug-chdeind", 4, cmddebugchdeind},
356 s = Brdstr(in, '\n', 1);
360 dprint("hjfs: >%s\n", s);
361 rc = tokenize(s, args, MAXARGS);
364 for(c = cmds; c < cmds + nelem(cmds); c++)
365 if(strcmp(c->name, args[0]) == 0){
366 if(c->args != 0 && c->args != rc)
373 dprint("hjfs: %r\n");
378 dprint("hjfs: syntax error\n");
385 initcons(char *service)
391 snprint(buf, sizeof(buf), "/srv/%s.cmd", service);
392 fd = create(buf, OWRITE|ORCLOSE, 0600);
396 fprint(fd, "%d", pfd[1]);
397 Binit(&bio, pfd[0], OREAD);
398 proccreate(consproc, &bio, mainstacksize);