Exemplo n.º 1
0
void
fsread(Req *r)
{
	char *s;

	switch((int)r->fid->qid.path){
	case Qroot:
		dirread9p(r, rootgen, nil);
		respond(r, nil);
		break;

	case Qdir:
		dirread9p(r, dirgen, nil);
		respond(r, nil);
		break;

	case Qctl:
		s = ctlstring();
		readstr(r, s);
		free(s);
		respond(r, nil);
		break;

	default:
		rdwrpart(r);
		break;
	}
}
Exemplo n.º 2
0
Arquivo: fs.c Projeto: rminnich/harvey
static void
fsread(Req *r)
{
	char e[ERRMAX], *s;
	uint32_t path;

	path = r->fid->qid.path;
	switch(TYPE(path)){
	default:
		snprint(e, sizeof e, "bug in execnet path=%lx", path);
		respond(r, e);
		break;

	case Qroot:
		dirread9p(r, rootgen, nil);
		respond(r, nil);
		break;

	case Qexec:
		dirread9p(r, execgen, nil);
		respond(r, nil);
		break;

	case Qn:
		dirread9p(r, conngen, client[NUM(path)]);
		respond(r, nil);
		break;

	case Qctl:
		snprint(e, sizeof e, "%u", NUM(path));
		readstr(r, e);
		respond(r, nil);
		break;

	case Qdata:
		dataread(r, client[NUM(path)]);
		break;

	case Qlocal:
		snprint(e, sizeof e, "%d", client[NUM(path)]->pid);
		readstr(r, e);
		respond(r, nil);
		break;

	case Qremote:
		s = client[NUM(path)]->cmd;
		if(strlen(s) >= 5)	/* "exec " */
			readstr(r, s+5);
		else
			readstr(r, s);
		respond(r, nil);
		break;

	case Qstatus:
		readstr(r, statusstr[client[NUM(path)]->status]);
		respond(r, nil);
		break;
	}
}
Exemplo n.º 3
0
void
fsread(Req *r)
{
	int n;
	char err[128];

	switch((int)r->fid->qid.path){
	case Qroot:
		dirread9p(r, fsdirgen, nil);
		respond(r, nil);
		break;
	case Qgrep:
		if(grepstate == Waiting)
			respond(r, "Waiting for query");
		else{
			if((n = grepread(r, err, sizeof(err))) == -1)
				respond(r, err);
			else
				respond(r, nil);
			if(n <= 0){
				close(grepout[0]);
				if(waitpid() != greppid)
					exits("Pid was wrong");
				greppid = 0;
				grepstate = Waiting;
				grepatime = time(nil);
				grepvers++;
			}
		}
		break;
	}
}
Exemplo n.º 4
0
static void
fsread(Req *r)
{
	if(r->fid->qid.path == 0)
		dirread9p(r, dirgen, nil);
	else
		r->ofcall.count = 0;
	respond(r, nil);
}
Exemplo n.º 5
0
static void
fsread(Req *r)
{
	vlong n, m, got;
	Aux *a = r->fid->aux;
	char *buf = r->ofcall.data;
	vlong len = r->ifcall.count;
	vlong off = r->ifcall.offset;

	if(ptype(r->fid->qid.path) == Pinfo){
		r->ofcall.count = readinfo(pindex(r->fid->qid.path), buf, len,
			off);
		respond(r, nil);
		return;
	}

	if(r->fid->qid.type & QTDIR){
		dirread9p(r, dirgen, a);
		respond(r, nil);
		return;
	}

	got = 0;
	n = Sess->mtu -OVERHEAD;
	do{
		if(len - got < n)
			n = len - got;
		m = CIFSread(Sess, a->sp, a->fh, off + got, buf + got, n, len);
		if(m != -1)
			got += m;
	} while(got < len && m >= n);

	r->ofcall.count = got;
	if(m == -1)
		responderrstr(r);
	else
		respond(r, nil);
}
Exemplo n.º 6
0
static void
fsread(Req *r)
{
	char buf[MAXPATH], *s;
	Revfile *rf;
	int i, n;
	vlong off;
	int len;

	off = r->ifcall.offset;
	len = r->ifcall.count;

	rf = r->fid->aux;
	switch(rf->level){
	case Qroot:
		if(off == 0){
			revlogupdate(&changelog);
			revlogupdate(&manifest);
		}
		dirread9p(r, rootgen, nil);
		respond(r, nil);
		return;
	case Qrev:
		dirread9p(r, revgen, rf->info);
		respond(r, nil);
		return;
	case Qrev0:
	case Qrev1:
	case Qrev2:
		s = nil;
		if(rf->buf)
			goto Strgen;
		i = hashrev(&changelog, rf->info->chash);
		if(rf->level == Qrev1)
			i = changelog.map[i].p1rev;
		else if(rf->level == Qrev2)
			i = changelog.map[i].p2rev;
	Revgen:
		s = fsmkrevname(buf, sizeof(buf), i);
		goto Strgen;
	case Qtreerev:
		if((i = hashrev(rf->rlog, rf->node->hash)) >= 0)
			i = rf->rlog->map[i].linkrev;
		goto Revgen;
	case Qlog:
		if(off >= rf->info->loglen)
			len = 0;
		else if((off + len) >= rf->info->loglen)
			len = rf->info->loglen - off;
		goto Fdgen;
	case Qwho:
		s = rf->info->who;
		goto Strgen;
	case Qwhy:
		s = rf->info->why;
	Strgen:
		if(rf->buf == nil)
			rf->buf = s ? smprint("%s\n", s) : estrdup9p("");
		readstr(r, rf->buf);
		respond(r, nil);
		return;
	case Qtree:
		if(rf->node->down){
	case Qfiles:
	case Qchanges:
			dirread9p(r, treegen, rf->node->down);
			respond(r, nil);
			return;
		}
	Fdgen:
		if(rf->fd < 0)
			break;
		if((n = pread(rf->fd, r->ofcall.data, len, off + rf->doff)) < 0){
			responderror(r);
			return;
		}
		r->ofcall.count = n;
		respond(r, nil);
		return;
	}
	respond(r, "bug in fsread");
}
Exemplo n.º 7
0
static void
xread(Req *r)
{
	int i, size, height, ascent;
	vlong path;
	Fmt fmt;
	XFont *f;
	char *data;
	Memsubfont *sf;
	Memimage *m;
	
	path = r->fid->qid.path;
	switch(QTYPE(path)) {
	case Qroot:
		dirread9p(r, rootgen, nil);
		break;
	case Qfontdir:
		dirread9p(r, fontgen, r->fid);
		break;
	case Qsizedir:
		dirread9p(r, sizegen, r->fid);
		break;
	case Qfontfile:
		fmtstrinit(&fmt);
		f = &xfont[QFONT(path)];
		load(f);
		if(f->unit == 0 && f->loadheight == nil) {
			readstr(r, "font missing\n");
			break;
		}
		height = 0;
		ascent = 0;
		if(f->unit > 0) {
			height = f->height * (int)QSIZE(path)/f->unit + 0.99999999;
			ascent = height - (int)(-f->originy * (int)QSIZE(path)/f->unit + 0.99999999);
		}
		if(f->loadheight != nil)
			f->loadheight(f, QSIZE(path), &height, &ascent);
		fmtprint(&fmt, "%11d %11d\n", height, ascent);
		for(i=0; i<nelem(f->range); i++) {
			if(f->range[i] == 0)
				continue;
			fmtprint(&fmt, "0x%04x 0x%04x x%04x.bit\n", i*SubfontSize, ((i+1)*SubfontSize) - 1, i*SubfontSize);
		}
		data = fmtstrflush(&fmt);
		readstr(r, data);
		free(data);
		break;
	case Qsubfontfile:
		f = &xfont[QFONT(path)];
		load(f);
		if(r->fid->aux == nil) {
			r->fid->aux = mksubfont(f, f->name, QRANGE(path)*SubfontSize, ((QRANGE(path)+1)*SubfontSize)-1, QSIZE(path), QANTIALIAS(path));
			if(r->fid->aux == nil) {
				responderrstr(r);
				return;
			}
		}
		sf = r->fid->aux;
		m = sf->bits;
		if(r->ifcall.offset < 5*12) {
			char *chan;
			if(QANTIALIAS(path))
				chan = "k8";
			else
				chan = "k1";
			data = smprint("%11s %11d %11d %11d %11d ", chan, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);
			readstr(r, data);
			free(data);
			break;
		}
		r->ifcall.offset -= 5*12;
		size = bytesperline(m->r, chantodepth(m->chan)) * Dy(m->r);
		if(r->ifcall.offset < size) {
			readbuf(r, byteaddr(m, m->r.min), size);
			break;
		}
		r->ifcall.offset -= size;
		data = emalloc9p(3*12+6*(sf->n+1));
		sprint(data, "%11d %11d %11d ", sf->n, sf->height, sf->ascent);
		packinfo(sf->info, (uchar*)data+3*12, sf->n);
		readbuf(r, data, 3*12+6*(sf->n+1));
		free(data);
		break;
	}
	respond(r, nil);
}