convD2M.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <plan9.h>
  2. #include <fcall.h>
  3. uint
  4. sizeD2M(Dir *d)
  5. {
  6. char *sv[4];
  7. int i, ns;
  8. sv[0] = d->name;
  9. sv[1] = d->uid;
  10. sv[2] = d->gid;
  11. sv[3] = d->muid;
  12. ns = 0;
  13. for(i = 0; i < 4; i++)
  14. ns += strlen(sv[i]);
  15. return STATFIXLEN + ns;
  16. }
  17. uint
  18. convD2M(Dir *d, uchar *buf, uint nbuf)
  19. {
  20. uchar *p, *ebuf;
  21. char *sv[4];
  22. int i, ns, nsv[4], ss;
  23. if(nbuf < BIT16SZ)
  24. return 0;
  25. p = buf;
  26. ebuf = buf + nbuf;
  27. sv[0] = d->name;
  28. sv[1] = d->uid;
  29. sv[2] = d->gid;
  30. sv[3] = d->muid;
  31. ns = 0;
  32. for(i = 0; i < 4; i++){
  33. nsv[i] = strlen(sv[i]);
  34. ns += nsv[i];
  35. }
  36. ss = STATFIXLEN + ns;
  37. /* set size befor erroring, so user can know how much is needed */
  38. /* note that length excludes count field itself */
  39. PBIT16(p, ss-BIT16SZ);
  40. p += BIT16SZ;
  41. if(ss > nbuf)
  42. return BIT16SZ;
  43. PBIT16(p, d->type);
  44. p += BIT16SZ;
  45. PBIT32(p, d->dev);
  46. p += BIT32SZ;
  47. PBIT8(p, d->qid.type);
  48. p += BIT8SZ;
  49. PBIT32(p, d->qid.vers);
  50. p += BIT32SZ;
  51. PBIT64(p, d->qid.path);
  52. p += BIT64SZ;
  53. PBIT32(p, d->mode);
  54. p += BIT32SZ;
  55. PBIT32(p, d->atime);
  56. p += BIT32SZ;
  57. PBIT32(p, d->mtime);
  58. p += BIT32SZ;
  59. PBIT64(p, d->length);
  60. p += BIT64SZ;
  61. for(i = 0; i < 4; i++){
  62. ns = nsv[i];
  63. if(p + ns + BIT16SZ > ebuf)
  64. return 0;
  65. PBIT16(p, ns);
  66. p += BIT16SZ;
  67. memmove(p, sv[i], ns);
  68. p += ns;
  69. }
  70. if(ss != p - buf)
  71. return 0;
  72. return p - buf;
  73. }