dirread.c 641 B

12345678910111213141516171819202122232425262728293031323334353637383940
  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. void
  8. dirread9p(Req *r, Dirgen *gen, void *aux)
  9. {
  10. int start;
  11. uchar *p, *ep;
  12. uint rv;
  13. Dir d;
  14. if(r->ifcall.offset == 0)
  15. start = 0;
  16. else
  17. start = r->fid->dirindex;
  18. p = (uchar*)r->ofcall.data;
  19. ep = p+r->ifcall.count;
  20. while(p < ep){
  21. memset(&d, 0, sizeof d);
  22. if((*gen)(start, &d, aux) < 0)
  23. break;
  24. rv = convD2M(&d, p, ep-p);
  25. free(d.name);
  26. free(d.muid);
  27. free(d.uid);
  28. free(d.gid);
  29. if(rv <= BIT16SZ)
  30. break;
  31. p += rv;
  32. start++;
  33. }
  34. r->fid->dirindex = start;
  35. r->ofcall.count = p - (uchar*)r->ofcall.data;
  36. }