#include <u.h>
#include <libc.h>
#include <thread.h>
#include <fcall.h>
#include <9p.h>
#include "dat.h"
#include "fns.h"
extern int regsfd;
char Egreg[] = "the front fell off";
enum {
Qregs,
Qmem,
Qmax
};
static Dir files[] = {
[Qregs] {.name "regs", .mode 0440},
[Qmem] {.name "mem", .mode 0440},
};
void
srvread(Req *r)
{
int rc;
switch((int)r->fid->qid.path){
case Qregs:
rc = pread(regsfd, r->ofcall.data, r->ifcall.count, r->ifcall.offset);
if(rc < 0)
responderror(r);
else{
r->ofcall.count = rc;
respond(r, nil);
}
break;
case Qmem:
r->ofcall.count = vmemread(r->ofcall.data, r->ifcall.count, r->ifcall.offset);
if(r->ofcall.count == 0)
respond(r, "fault");
else
respond(r, nil);
break;
default:
respond(r, Egreg);
}
}
Srv vmxsrv = {
.read srvread,
};
void
init9p(char *srvname)
{
char *uid;
int i;
uid = getuser();
vmxsrv.tree = alloctree(uid, uid, 0770, nil);
for(i = 0; i < Qmax; i++)
createfile(vmxsrv.tree->root, files[i].name, uid, files[i].mode, nil);
threadpostmountsrv(&vmxsrv, srvname, nil, 0);
}