Пример #1
0
long
dirreadall(int fd, Dir **d)
{
	uchar *buf, *nbuf;
	long n, ts;
	struct stat st;

	if(fstat(fd, &st) < 0)
		return -1;

	if(st.st_blksize < 8192)
		st.st_blksize = 8192;

	buf = nil;
	ts = 0;
	for(;;){
		nbuf = realloc(buf, ts+st.st_blksize);
		if(nbuf == nil){
			free(buf);
			return -1;
		}
		buf = nbuf;
		n = mygetdents(fd, (void*)(buf+ts), st.st_blksize);
		if(n <= 0)
			break;
		ts += n;
	}
	if(ts >= 0)
		ts = dirpackage(fd, (char*)buf, ts, d);
	free(buf);
	if(ts == 0 && n < 0)
		return -1;
	return ts;
}
Пример #2
0
long
dirreadall(int fd, Dir **d)
{
	uchar *buf, *nbuf;
	long n, ts;

	buf = nil;
	ts = 0;
	for(;;){
		nbuf = realloc(buf, ts+DIRMAX);
		if(nbuf == nil){
			free(buf);
			return -1;
		}
		buf = nbuf;
		n = read(fd, buf+ts, DIRMAX);
		if(n <= 0)
			break;
		ts += n;
	}
	if(ts >= 0)
		ts = dirpackage(buf, ts, d);
	free(buf);
	if(ts == 0 && n < 0)
		return -1;
	return ts;
}
Пример #3
0
long
dirread(int fd, Dir **dp)
{
	char *buf;
	struct stat st;
	int n;

	*dp = 0;

	if(fstat(fd, &st) < 0)
		return -1;

	if(st.st_blksize < 8192)
		st.st_blksize = 8192;

	buf = malloc(st.st_blksize);
	if(buf == nil)
		return -1;

	n = mygetdents(fd, (void*)buf, st.st_blksize);
	if(n < 0){
		free(buf);
		return -1;
	}
	n = dirpackage(fd, buf, n, dp);
	free(buf);
	return n;
}
Пример #4
0
__private_extern__ int
readdirs_9p(mount_9p *nmp, fid_9p fid, dir_9p **d, uint32_t *nd)
{
	uint8_t *p, *newp;
	uint32_t n;
	int e, ts;

	TRACE();
	*d = NULL;
	*nd = 0;
	ts = 0;
	p = NULL;
	for (;;) {
		newp = malloc_9p(ts+DIRMAX);
		if (newp == NULL) {
			e = ENOMEM;
			break;
		}
		bcopy(p, newp, ts);
		free_9p(p);
		p = newp;
		if ((e=read_9p(nmp, fid, p+ts, DIRMAX, ts, &n)) || n==0)
			break;
		ts += n;
	}

	if (!e)
		e = dirpackage(p, ts, d, nd, ISSET(nmp->flags, F_DOTU));

	free_9p(p);
	return e;
}
Пример #5
0
long
dirread(int fd, Dir **d)
{
	uchar *buf;
	long ts;

	buf = malloc(DIRMAX);
	if(buf == nil)
		return -1;
	ts = read(fd, buf, DIRMAX);
	if(ts >= 0)
		ts = dirpackage(buf, ts, d);
	free(buf);
	return ts;
}
Пример #6
0
__private_extern__ int
readdir_9p(mount_9p *nmp, fid_9p fid, off_t off, dir_9p **d, uint32_t *nd, uint32_t *nrd)
{
	void *p;
	int e;
	
	TRACE();
	*d = NULL;
	*nd = 0;
	*nrd = 0;
	p = malloc_9p(DIRMAX);
	if (p == NULL)
		return ENOMEM;

	e = read_9p(nmp, fid, p, DIRMAX, off, nrd);
	if (!e)
		e = dirpackage(p, *nrd, d, nd, ISSET(nmp->flags, F_DOTU));
	free_9p(p);
	return e;
}
Пример #7
0
void
dump(char *path)
{
	char *elem, *p, *path0, *err;
	uchar buf[4096];
	Fid fid;
	Qid qid;
	Dir *d;
	Req r;
	int off, i, n;

	// root
	memset(&fid, 0, sizeof fid);
	dostat(0, &fid.qid, nil);	
	qid = fid.qid;

	path0 = path;
	while(path != nil) {
		p = strchr(path, '/');
		if(p != nil)
			*p = '\0';
		elem = path;
		if(strcmp(elem, "") != 0 && strcmp(elem, ".") != 0) {
			err = xwalk1(&fid, elem, &qid);
			if(err != nil) {
				fprint(2, "%s: %s\n", path0, err);
				exits(err);
			}
		}
		if(p)
			*p++ = '/';
		path = p;
	}
	
	memset(&r, 0, sizeof r);
	xsrv.fake = 1;

	// read and display
	off = 0;
	for(;;) {
		r.srv = &xsrv;
		r.fid = &fid;
		r.ifcall.type = Tread;
		r.ifcall.count = sizeof buf;
		r.ifcall.offset = off;
		r.ofcall.data = (char*)buf;
		r.ofcall.count = 0;
		xread(&r);
		if(r.ofcall.type != Rread) {
			fprint(2, "reading %s: %s\n", path0, r.ofcall.ename);
			exits(r.ofcall.ename);
		}
		n = r.ofcall.count;
		if(n == 0)
			break;
		if(off == 0 && pflag > 1) {
			print("\001");
		}
		off += n;
		if(qid.type & QTDIR) {
			n = dirpackage(buf, n, &d);
			for(i=0; i<n; i++)
				print("%s%s\n", d[i].name, (d[i].mode&DMDIR) ? "/" : "");
			free(d);
		} else
			write(1, buf, n);
	}
}