shithub: fsgen

ref: e81025205d1ac4e517e2a4e21dfa9326c937a57b
dir: /fshandler.inc/

View raw version
static void
fsread(Req *r)
{
	respond(r, nil);
}

static void
fswrite(Req *r)
{
	respond(r, nil);
}

static void
fsstat(Req *r)
{
	uvlong q;
	Filedata *fd;
	// TODO: support multiple parameters
	void (*func)(Req *r);
	
	q = breakqid(r->fid->qid.path);
	
	for (int i = 0; i < Qmax; i++) {
		if (q == i) {
			fd = &filedata[i];
			r->d = fd->dir;
			qidtype = i;
			r->d.qid.path = makeqid(0);
			r->d.qid.vers = 0;
			r->d.qid.type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
			r->d.name = estrdup9p(fd->dir.name);
			r->d.uid = estrdup9p("none");
			r->d.gid = estrdup9p("none");
			r->d.gid = estrdup9p("none");
			if (fd->stat) {
				func = fd->stat;
				func(r);
				/* if function exists, it should respond */
				return;
			} else
				respond(r, nil);
			return;
		}
	}
	respond(r, "file not found");
}

static int
childrencontains(int *fh, int search)
{
	int *i;
	for (i = fh; *i; i++) {
		if (*i == search)
			return 1;
	}
	return 0;
}

static int
findparent(int qid)
{
	for (int i = Qroot; i < Qmax; i++) {
		if (childrencontains(filehierarchy[i], qid))
			return i;
	}
	return Qroot;
}

static char*
fswalk(Fid *fid, char *name, Qid *qid)
{
	int qt;
	uvlong id;
	Filedata *fd;
	
	if (strcmp(name, ".") == 0) {
		*qid = fid->qid;
		return nil;
	}
	
	qt = breakqid(fid->qid.path);
	id = getqidid(fid->qid.path);
	
	if (strcmp(name, "..") == 0) {
		qt = findparent(qt);
		fd = &filedata[qt];
		qidtype = qt;
		qid->path = makeqid(id);
		qid->vers = 0;
		qid->type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
		fid->qid = *qid;
		fprint(2, "walk: QID: %d %d\n", qt, qid->type);
		return nil;
	}
	
	return nil;
}

static void
fsattach(Req *r)
{
	Qid q;
	
	qidtype = Qroot;
	q.path = makeqid(0);
	q.vers = 0;
	q.type = QTDIR;
	
	fprint(2, "qtype: %d\n", q.type);
	
	r->ofcall.qid = r->fid->qid = q;
	respond(r, nil);
}