--- /sys/src/cmd/aux/randfs.c Thu Feb 26 00:00:00 2015 +++ /sys/src/cmd/aux/randfs.c Thu Feb 26 00:00:00 2015 @@ -0,0 +1,217 @@ +#include +#include +#include +#include +#include +#include <9p.h> + +enum +{ + Qroot, + Qrandom, + Nqid, +}; + +static int +fillstat(ulong qid, Dir *d) +{ + memset(d, 0, sizeof *d); + + d->uid = "sys"; + d->gid = "sys"; + d->muid = ""; + d->qid = (Qid){qid, 0, 0}; + d->atime = time(0); + + switch(qid) { + case Qroot: + d->name = "/"; + d->qid.type = QTDIR; + d->mode = DMDIR|0777; + break; + case Qrandom: + d->name = "random"; + d->mode = 0444; + break; + } + return 1; +} + +static int +readtopdir(Fid*, uchar *buf, long off, int cnt, int blen) +{ + int i, m, n; + long pos; + Dir d; + + n = 0; + pos = 0; + for (i = 1; i < Nqid; i++){ + fillstat(i, &d); + m = convD2M(&d, &buf[n], blen-n); + if(off <= pos){ + if(m <= BIT16SZ || m > cnt) + break; + n += m; + cnt -= m; + } + pos += m; + } + return n; +} + +static ulong +randomread(void *xp, ulong n) +{ + uchar *e, *p; + + p = xp; + + for(e = p + n; p < e; ) + *p++ = rand(); + + return n; +} + +static void +fsattach(Req *r) +{ + char *spec; + + spec = r->ifcall.aname; + if(spec && spec[0]){ + respond(r, "invalid attach specifier"); + return; + } + r->ofcall.qid = (Qid){Qroot, 0, QTDIR}; + r->fid->qid = r->ofcall.qid; + respond(r, nil); +} + +static void +fsstat(Req *r) +{ + fillstat((ulong)r->fid->qid.path, &r->d); + + r->d.name = estrdup9p(r->d.name); + r->d.uid = estrdup9p(r->d.uid); + r->d.gid = estrdup9p(r->d.gid); + r->d.muid = estrdup9p(r->d.muid); + + respond(r, nil); +} + +static char* +fswalk1(Fid *fid, char *name, Qid *qid) +{ + switch((ulong)fid->qid.path) { + case Qroot: + if (strcmp(name, "..") == 0) { + *qid = (Qid){Qroot, 0, QTDIR}; + fid->qid = *qid; + return nil; + } + if (strcmp(name, "random") == 0) { + *qid = (Qid){Qrandom, 0, 0}; + fid->qid = *qid; + return nil; + } + return "file not found"; + + default: + return "walk in non-directory"; + } +} + +void +fsread(Req *r) +{ + vlong offset; + long count; + uchar *b; + + b = (uchar*)r->ofcall.data; + offset = r->ifcall.offset; + count = r->ifcall.count; + + switch((ulong)r->fid->qid.path) { + case Qroot: + r->ofcall.count = readtopdir(r->fid, b, offset, count, count); + respond(r, nil); + return; + + case Qrandom: + r->ofcall.count = randomread(b, count); + respond(r, nil); + return; + } +} + +void +fsopen(Req *r) +{ + switch((ulong)r->fid->qid.path) { + case Qroot: + respond(r, nil); + return; + + case Qrandom: + srand(truerand()); + respond(r, nil); + return; + } +} + +Srv fs = { + .attach= fsattach, + .open= fsopen, + .read= fsread, + .stat= fsstat, + .walk1= fswalk1, +}; + +void +usage(void) +{ + fprint(2, "usage: randfs [-D] [-s srvname] [-m mtpt]\n"); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + char *addr = nil; + char *srvname = nil; + char *mtpt = nil; + + ARGBEGIN{ + case 'D': + chatty9p++; + break; + case 'a': + addr = EARGF(usage()); + break; + case 's': + srvname = EARGF(usage()); + break; + case 'm': + mtpt = EARGF(usage()); + break; + default: + usage(); + }ARGEND; + + if(argc) + usage(); + + if(chatty9p) + fprint(2, "randsrv.nopipe %d srvname %s mtpt %s\n", fs.nopipe, srvname, mtpt); + if(addr == nil && srvname == nil && mtpt == nil) + sysfatal("must specify -a, -s, or -m option"); + if(addr) + listensrv(&fs, addr); + + if(srvname || mtpt) + postmountsrv(&fs, srvname, mtpt, MBEFORE); + exits(0); +} --- /n/sources/plan9/sys/src/cmd/aux/mkfile Thu Aug 16 22:50:45 2012 +++ /sys/src/cmd/aux/mkfile Thu Feb 26 00:00:00 2015 @@ -26,6 +26,7 @@ olefs\ pcmcia\ portmap\ + randfs\ rdwr\ reboot\ searchfs\