interpret some ctl messages to make managmenet easier; exit on kill or exit message. Reference: /n/atom/patch/applied2013/snapfsctl Date: Wed Jun 19 01:18:46 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/snap/snapfs.c Wed Jun 19 01:18:43 2013 +++ /sys/src/cmd/snap/snapfs.c Wed Jun 19 01:18:43 2013 @@ -7,12 +7,23 @@ #include <9p.h> #include "snap.h" +static char *textfile; +static void *rend; + +enum{ + Xproc, + Xdata, + Xfd, + Xctl, +}; + typedef struct PD PD; struct PD { - int isproc; + uchar type; union { - Proc *p; - Data *d; + Proc *p; + Data *d; + int fd; }; }; @@ -21,8 +32,8 @@ { PD *pd; - pd = emalloc(sizeof(*pd)); - pd->isproc = 1; + pd = emalloc(sizeof *pd); + pd->type = Xproc; pd->p = p; return pd; } @@ -32,16 +43,37 @@ { PD *pd; - pd = emalloc(sizeof(*pd)); - pd->isproc = 0; + pd = emalloc(sizeof *pd); + pd->type = Xdata; pd->d = d; return pd; } +PD* +PDFd(int fd) +{ + PD *pd; + + pd = emalloc(sizeof *pd); + pd->type = Xfd; + pd->fd = fd; + return pd; +}; + +PD* +PDctl(void) +{ + PD *pd; + + pd = emalloc(sizeof *pd); + pd->type = Xctl; + return pd; +}; + void usage(void) { - fprint(2, "usage: snapfs [-a] [-m mtpt] file\n"); + fprint(2, "usage: snapfs [-a] [-t dbg text] [-m mtpt] file\n"); exits("usage"); } @@ -57,7 +89,6 @@ if(*count > Pagesize-po) *count = Pagesize-po; - memmove(buf, pg->data+po, *count); return nil; } @@ -82,7 +113,7 @@ void fsread(Req *r) { - char *e; + char *e, buf[ERRMAX]; PD *pd; Fid *fid; void *data; @@ -95,18 +126,60 @@ count = r->ifcall.count; pd = fid->file->aux; - if(pd->isproc) + e = nil; + switch(pd->type){ + case Xproc: e = memread(pd->p, fid->file, data, &count, offset); - else + break; + case Xdata: e = dataread(pd->d, data, &count, offset); - + break; + case Xfd: + count = pread(pd->fd, data, count, offset); + if(count == -1){ + errstr(buf, sizeof buf); + e = buf; + }else + e = nil; + break; + case Xctl: + e = "not implemented"; + break; + } if(e == nil) r->ofcall.count = count; respond(r, e); } +void +fswrite(Req *r) +{ + char *e; + PD *pd; + + e = "permission denied"; + pd = r->fid->file->aux; + switch(pd->type){ + default: + break; + case Xctl: + if(!strncmp(r->ifcall.data, "debug", 5)){ + e = nil; + debug ^= 1; + }else if(strncmp(r->ifcall.data, "kill", 4) == 0 + || strncmp(r->ifcall.data, "exit", 4) == 0){ + respond(r, nil); + rendezvous(&rend, 0); + return; + } + break; + } + respond(r, e); +} + Srv fs = { .read = fsread, + .write = fswrite, }; File* @@ -121,7 +194,15 @@ } void -main(int argc, char **argv) +cleanup(void*) +{ + rendezvous(&rend, 0); + bind("#p", "/proc", MREPL); + threadexitsall(""); +} + +void +threadmain(int argc, char **argv) { Biobuf *b; Data *d; @@ -129,7 +210,7 @@ Proc *p, *plist; Tree *tree; char *mtpt, buf[32]; - int i, mflag; + int i, mflag, fd; mtpt = "/proc"; mflag = MBEFORE; @@ -145,7 +226,10 @@ mflag = MAFTER; break; case 'm': - mtpt = ARGF(); + mtpt = EARGF(usage()); + break; + case 't': + textfile = EARGF(usage()); break; default: usage(); @@ -173,11 +257,16 @@ snprint(buf, sizeof buf, "%ld", p->pid); fdir = ecreatefile(tree->root, buf, nil, DMDIR|0555, nil); - ecreatefile(fdir, "ctl", nil, 0777, nil); - if(p->text) - ecreatefile(fdir, "text", nil, 0777, PDProc(p)); - + ecreatefile(fdir, "ctl", nil, 0666, PDctl()); ecreatefile(fdir, "mem", nil, 0666, PDProc(p)); + if(textfile){ + fd = open(textfile, OREAD); + if(fd == -1) + sysfatal("open: %r"); + f = ecreatefile(fdir, "text", nil, 0444, PDFd(fd)); + f->length = seek(fd, 0, 2); + }else if(p->text) + ecreatefile(fdir, "text", nil, 0777, PDProc(p)); for(i=0; id[i]) { f = ecreatefile(fdir, pfile[i], nil, 0666, PDData(d)); @@ -186,6 +275,7 @@ } } - postmountsrv(&fs, nil, mtpt, mflag); - exits(0); + proccreate(cleanup, nil, 8192); + threadpostmountsrv(&fs, nil, mtpt, mflag); + exits(""); }