kuro/srv.c

104 lines
1.8 KiB
C

#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);
}
}