| #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; |
| } |