Пример #1
0
static int32_t
fsread(Usbfs*_1, Fid *fid, void *data, int32_t cnt, int64_t off)
{
	int qd;
	int rc;
	Dev *dev;
	Qid q;
	int32_t (*xfsread)(Usbfs *fs, Fid *f, void *data, int32_t count,
			   int64_t );

	q = fid->qid;
	qd = qiddev(q.path);
	if(qd == Dtop)
		return usbdirread(nil, q, data, cnt, off, dirgen, nil);
	qlock(&fslck);
	if(fs[qd] == nil){
		qunlock(&fslck);
		werrstr(Eio);
		return -1;
	}
	dev = fs[qd]->dev;
	if(dev != nil)
		incref(&dev->Ref);
	xfsread = fs[qd]->read;
	qunlock(&fslck);
	rc = xfsread(fs[qd], fid, data, cnt, off);
	if(dev != nil)
		closedev(dev);
	return rc;
}
Пример #2
0
static int32_t
fsread(Usbfs *fs, Fid *fid, void *data, int32_t count, int64_t offset)
{
	int cn, qt;
	char *s, *se;
	char buf[2048];		/* keep this large for ifstats */
	Buf *bp;
	Conn *c;
	Ether *e;
	Qid q;

	q = fid->qid;
	q.path &= ~fs->qid;
	e = fs->aux;
	s = buf;
	se = buf+sizeof(buf);
	qt = qtype(q.path);
	cn = qnum(q.path);
	switch(qt){
	case Qroot:
		count = usbdirread(fs, q, data, count, offset, rootdirgen, nil);
		break;
	case Qaddr:
		s = seprintaddr(s, se, e->addr);
		count = usbreadbuf(data, count, offset, buf, s - buf);
		break;
	case Qnifstats:
		/* BUG */
	case Qifstats:
		s = seprintifstats(s, se, e);
		if(e->seprintstats != nil)
			s = e->seprintstats(s, se, e);
		count = usbreadbuf(data, count, offset, buf, s - buf);
		break;
	case Qnstats:
		/* BUG */
	case Qstats:
		s = seprintstats(s, se, e);
		count = usbreadbuf(data, count, offset, buf, s - buf);
		break;

	case Qndir:
		count = usbdirread(fs, q, data, count, offset, conndirgen, nil);
		break;
	case Qndata:
		c = getconn(e, cn, 0);
		if(c == nil){
			werrstr(Eio);
			return -1;
		}
		bp = recvp(c->rc);
		if(bp == nil)
			return -1;
		if(etherdebug > 1)
			dumpframe("etherin", bp->rp, bp->ndata);
		count = usbreadbuf(data, count, 0LL, bp->rp, bp->ndata);
		freebuf(e, bp);
		break;
	case Qnctl:
		s = seprint(s, se, "%11d ", cn);
		count = usbreadbuf(data, count, offset, buf, s - buf);
		break;
	case Qntype:
		c = getconn(e, cn, 0);
		if(c == nil)
			s = seprint(s, se, "%11d ", 0);
		else
			s = seprint(s, se, "%11d ", c->type);
		count = usbreadbuf(data, count, offset, buf, s - buf);
		break;
	default:
		sysfatal("usb: ether: fsread bug");
	}
	return count;
}