xref: /plan9/sys/src/lib9p/dirread.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <auth.h>
4*9a747e4fSDavid du Colombier #include <fcall.h>
5*9a747e4fSDavid du Colombier #include <thread.h>
6*9a747e4fSDavid du Colombier #include <9p.h>
7*9a747e4fSDavid du Colombier 
8*9a747e4fSDavid du Colombier void
dirread9p(Req * r,Dirgen * gen,void * aux)9*9a747e4fSDavid du Colombier dirread9p(Req *r, Dirgen *gen, void *aux)
10*9a747e4fSDavid du Colombier {
11*9a747e4fSDavid du Colombier 	int start;
12*9a747e4fSDavid du Colombier 	uchar *p, *ep;
13*9a747e4fSDavid du Colombier 	uint rv;
14*9a747e4fSDavid du Colombier 	Dir d;
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier 	if(r->ifcall.offset == 0)
17*9a747e4fSDavid du Colombier 		start = 0;
18*9a747e4fSDavid du Colombier 	else
19*9a747e4fSDavid du Colombier 		start = r->fid->dirindex;
20*9a747e4fSDavid du Colombier 
21*9a747e4fSDavid du Colombier 	p = (uchar*)r->ofcall.data;
22*9a747e4fSDavid du Colombier 	ep = p+r->ifcall.count;
23*9a747e4fSDavid du Colombier 
24*9a747e4fSDavid du Colombier 	while(p < ep){
25*9a747e4fSDavid du Colombier 		memset(&d, 0, sizeof d);
26*9a747e4fSDavid du Colombier 		if((*gen)(start, &d, aux) < 0)
27*9a747e4fSDavid du Colombier 			break;
28*9a747e4fSDavid du Colombier 		rv = convD2M(&d, p, ep-p);
29*9a747e4fSDavid du Colombier 		free(d.name);
30*9a747e4fSDavid du Colombier 		free(d.muid);
31*9a747e4fSDavid du Colombier 		free(d.uid);
32*9a747e4fSDavid du Colombier 		free(d.gid);
33*9a747e4fSDavid du Colombier 		if(rv <= BIT16SZ)
34*9a747e4fSDavid du Colombier 			break;
35*9a747e4fSDavid du Colombier 		p += rv;
36*9a747e4fSDavid du Colombier 		start++;
37*9a747e4fSDavid du Colombier 	}
38*9a747e4fSDavid du Colombier 	r->fid->dirindex = start;
39*9a747e4fSDavid du Colombier 	r->ofcall.count = p - (uchar*)r->ofcall.data;
40*9a747e4fSDavid du Colombier }
41