convM2D.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "lib9.h"
  2. #include "fcall.h"
  3. int
  4. statcheck(uchar *buf, uint nbuf)
  5. {
  6. uchar *ebuf;
  7. int i;
  8. ebuf = buf + nbuf;
  9. if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf))
  10. return -1;
  11. buf += STATFIXLEN - 4 * BIT16SZ;
  12. for(i = 0; i < 4; i++){
  13. if(buf + BIT16SZ > ebuf)
  14. return -1;
  15. buf += BIT16SZ + GBIT16(buf);
  16. }
  17. if(buf != ebuf)
  18. return -1;
  19. return 0;
  20. }
  21. static char nullstring[] = "";
  22. uint
  23. convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
  24. {
  25. uchar *p, *ebuf;
  26. char *sv[4];
  27. int i, ns;
  28. if(nbuf < STATFIXLEN)
  29. return 0;
  30. p = buf;
  31. ebuf = buf + nbuf;
  32. p += BIT16SZ; /* ignore size */
  33. d->type = GBIT16(p);
  34. p += BIT16SZ;
  35. d->dev = GBIT32(p);
  36. p += BIT32SZ;
  37. d->qid.type = GBIT8(p);
  38. p += BIT8SZ;
  39. d->qid.vers = GBIT32(p);
  40. p += BIT32SZ;
  41. d->qid.path = GBIT64(p);
  42. p += BIT64SZ;
  43. d->mode = GBIT32(p);
  44. p += BIT32SZ;
  45. d->atime = GBIT32(p);
  46. p += BIT32SZ;
  47. d->mtime = GBIT32(p);
  48. p += BIT32SZ;
  49. d->length = GBIT64(p);
  50. p += BIT64SZ;
  51. for(i = 0; i < 4; i++){
  52. if(p + BIT16SZ > ebuf)
  53. return 0;
  54. ns = GBIT16(p);
  55. p += BIT16SZ;
  56. if(p + ns > ebuf)
  57. return 0;
  58. if(strs){
  59. sv[i] = strs;
  60. memmove(strs, p, ns);
  61. strs += ns;
  62. *strs++ = '\0';
  63. }
  64. p += ns;
  65. }
  66. if(strs){
  67. d->name = sv[0];
  68. d->uid = sv[1];
  69. d->gid = sv[2];
  70. d->muid = sv[3];
  71. }else{
  72. d->name = nullstring;
  73. d->uid = nullstring;
  74. d->gid = nullstring;
  75. d->muid = nullstring;
  76. }
  77. return p - buf;
  78. }