#include "dat.h" #include "fns.h" static Node* node; Aux* create_aux(FileType t) { Aux* self = (Aux*)malloc(sizeof(Aux)); self->type = t; self->data = nil; self->count = 0; return self; } void fs_destroy_file(File* f) { Aux* a = (Aux*)f->aux; if(a && a->data) { free(a->data); } if (a) { free (a); } } void kuro_read(Req* r) { Aux* a = (Aux*)r->fid->file->aux; switch (a->type) { case CTL: case MEMORY: default: respond(r, nil); break; } } void write_ctl(Req* r) { char cmd[16] = {0}; char* c = r->ifcall.data; int i; for (i = 0; i < r->ifcall.count && *c != ' ' && *c != '\n'; i++) { strncat(cmd, c, 1); c++; } if (*c == ' ') { c++; } /* maybe don't do this... */ strcsw(c, '\n', 0); /* diagnostics for now */ print("cmd: %s\n", cmd); print("arg: %s\n", c); print("unknown command...\n"); r->ofcall.count = r->ifcall.count; respond(r, nil); } void kuro_write(Req* r) { Aux* a = (Aux*)r->fid->file->aux; switch (a->type) { case CTL: write_ctl(r); break; case CPU: default: respond(r, nil); break; } } char* mk_mtpt(char* parent, char* buf) { int pid = getpid(); sprintf(buf, "%s/%d", parent, pid); return buf; } void start_9p(Node* n) { node = n; char* mtpt_base = getenv("KURO_MTPT"); if (mtpt_base && n) { char mtpt[256] = {0}; mk_mtpt(mtpt_base, mtpt); if (ensure(mtpt)) { print("kuro fsys: %s\n", mtpt); } else { sysfatal("couldn't create fsys at %s\n", mtpt); } Srv srv = { .read = kuro_read, .write = kuro_write }; Tree* tree = alloctree(nil, nil, DMDIR | 0777, fs_destroy_file); srv.tree = tree; closefile(createfile(tree->root, "ctl", nil, 0600, create_aux(CTL))); threadpostmountsrv(&srv, nil, mtpt, MREPL | MCREATE); threadexits(0); } }