ref: 17f7f6be4e1a316c0f5f26ff70e047aece4de2bc
dir: /sys/src/lib9p/dirread.c/
#include <u.h> #include <libc.h> #include <fcall.h> #include <thread.h> #include <9p.h> void dirread9p(Req *r, Dirgen *gen, void *aux) { int start; uchar *p, *ep; uint rv; Dir d; if(r->ifcall.offset == 0) start = 0; else start = r->fid->dirindex; p = (uchar*)r->ofcall.data; ep = p+r->ifcall.count; while(p < ep){ memset(&d, 0, sizeof d); if((*gen)(start, &d, aux) < 0) break; rv = convD2M(&d, p, ep-p); free(d.name); free(d.muid); free(d.uid); free(d.gid); if(rv <= BIT16SZ) break; p += rv; start++; } r->fid->dirindex = start; r->ofcall.count = p - (uchar*)r->ofcall.data; }