ref: c25ea72c90893cf97d313178f5e2a38077cd9cd4
dir: /cons.c/
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <avl.h>
#include "dat.h"
#include "fns.h"
typedef struct Cmd Cmd;
struct Cmd {
char *name;
char *sub;
int minarg;
int maxarg;
void (*fn)(int, char**, int);
};
static void
setdbg(int fd, char **ap, int na)
{
debug = (na == 1) ? atoi(ap[0]) : !debug;
fprint(fd, "debug → %d\n", debug);
}
static void
syncfs(int fd, char **, int)
{
fprint(fd, "sync\n");
}
static void
snapfs(int fd, char **, int)
{
fprint(fd, "snap\n");
}
static void
fsckfs(int fd, char**, int)
{
if(checkfs(fd))
fprint(fd, "ok\n");
else
fprint(fd, "broken fs\n");
}
Cmd cmdtab[] = {
{.name="sync", .sub=nil, .minarg=0, .maxarg=0, .fn=syncfs},
{.name="snap", .sub=nil, .minarg=1, .maxarg=1, .fn=snapfs},
{.name="check", .sub=nil, .minarg=1, .maxarg=1, .fn=fsckfs},
/* debugging */
{.name="show", .sub="cache", .minarg=0, .maxarg=0, .fn=showcache},
{.name="show", .sub="fs", .minarg=0, .maxarg=1, .fn=showfs},
{.name="show", .sub="snap", .minarg=0, .maxarg=1, .fn=showsnap},
{.name="show", .sub="fid", .minarg=0, .maxarg=0, .fn=showfid},
{.name="show", .sub="free", .minarg=0, .maxarg=0, .fn=showfree},
{.name="debug", .sub=nil, .minarg=1, .maxarg=1, .fn=setdbg},
{.name=nil, .sub=nil},
};
void
runcons(int, void *pfd)
{
char buf[256], *f[4], **ap;
int i, n, nf, na, fd;
Cmd *c;
fd = (uintptr)pfd;
while(1){
if((n = read(fd, buf, sizeof(buf)-1)) == -1)
break;
buf[n] = 0;
nf = tokenize(buf, f, nelem(f));
if(nf == 0 || strlen(f[0]) == 0)
continue;
for(c = cmdtab; c->name != nil; c++){
ap = f;
na = nf;
if(strcmp(c->name, *ap) != 0)
continue;
ap++; na--;
if(c->sub != nil){
if(strcmp(c->sub, *ap) != 0)
continue;
ap++; na--;
}
if(na < c->minarg || na > c->maxarg)
continue;
c->fn(fd, ap, na);
break;
}
if(c->name == nil){
fprint(fd, "unknown command '");
for(i = 0; i < nf; i++)
fprint(fd, " %s", f[i]);
fprint(fd, "'\n");
}
}
}