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