#include #include #include #include #include #include <9p.h> #define min(a, b) ((a) < (b) ? (a) : (b)) static char Eim[] = "imaginary result"; char buf[1024]; void fsread(Req *r) { int count; count = min(r->ifcall.count, strlen(buf)); if(r->ifcall.offset >= count){ r->ofcall.count = 0; respond(r, nil); return; } memmove(r->ofcall.data, buf, count); r->ofcall.count = count; respond(r, nil); } void fswrite(Req *r) { double in, n; in = strtod(r->ifcall.data, nil); if(in < 0){ respond(r, Eim); return; } n = sqrt(in); snprint(buf, sizeof buf, "%g\n", n); r->fid->file->length = strlen(buf); r->ofcall.count = r->ifcall.count; respond(r, nil); } Srv fs = { .read = fsread, .write = fswrite, }; void usage(void) { fprint(2, "usage: sqrtfs [-D] [-s srvname] [-m mtpt]\n"); exits("usage"); } void main(int argc, char *argv[]) { File *f; char *srvname, *mtpt; srvname = nil; mtpt = "/n/sqrt"; ARGBEGIN{ case 'D': chatty9p++; break; case 's': srvname = EARGF(usage()); break; case 'm': mtpt = EARGF(usage()); break; default: usage(); }ARGEND; if(argc != 0) usage(); fs.tree = alloctree(nil, nil, DMDIR|0777, nil); if((f = createfile(fs.tree->root, "sqrt", nil, 0666, nil)) == nil) sysfatal("createfile: %r"); snprint(buf, sizeof buf, "%d\n", 0); f->length = 1; postmountsrv(&fs, srvname, mtpt, MREPL|MCREATE); exits(0); }