#include #include #include #include #include <9p.h> enum { Qdir, Qctl }; void fsattach(Req *r) { char *spec; spec = r->ifcall.aname; if (spec && spec[0]) { respond(r, "No specifier has to be given"); return; } r->fid->qid = (Qid){Qdir, 0, QTDIR}; r->ofcall.qid = r->fid->qid; respond(r, nil); } char * fswalk1(Fid *fid, char *name, Qid *qid) { if (strcmp(name, "..") == 0) { *qid = (Qid){Qdir, 0, QTDIR}; fid->qid = *qid; return nil; } if (strcmp(name, "ctl") == 0) { *qid = (Qid){Qctl, 0, 0}; fid->qid = *qid; return nil; } return "file not found"; } void fsread(Req *r) { readstr(r, "Hello"); respond(r, nil); } void fillstat(ulong qid, Dir *d) { nulldir(d); d->mtime = time(nil); d->uid = d->gid = "pong"; switch(qid) { case Qdir: d->name = "/"; d->qid = (Qid){Qdir, 0, QTDIR}; d->mode = DMDIR|0777; break; case Qctl: d->name = "ctl"; d->qid = (Qid){Qctl, 0, 0}; d->mode = 0666; break; } } void fsstat(Req *r) { Dir *d = &r->d; fillstat(r->fid->qid.path, d); d->name = estrdup9p(d->name); d->uid = estrdup9p(d->uid); d->gid = estrdup9p(d->gid); respond(r, nil); } Srv pongsrv = { .attach = fsattach, .walk1 = fswalk1, .read = fsread, .stat = fsstat, }; void usage(void) { fprint(2, "usage: pongd [-D]\n"); exits("usage"); } void main(int argc, char **argv) { ARGBEGIN { case 'D': chatty9p++; break; default: usage(); } ARGEND postmountsrv(&pongsrv, nil, "/mnt/pong", 0); }