shithub: riscv

ref: 38c2cdf164f0cc12db65f9f51b3b4a7815543d12
dir: /sys/src/cmd/vmx/9p.c/

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