convM2D.c 1.4 KB

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