conv.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "flashfs.h"
  4. int
  5. convJ2M(Jrec *j, uchar *buff)
  6. {
  7. int m, n;
  8. switch(j->type) {
  9. case FT_create:
  10. if(j->mode & (1 << 8)) {
  11. if(j->mode & DMDIR)
  12. j->type = FT_DCREATE1;
  13. else
  14. j->type = FT_FCREATE1;
  15. }
  16. else {
  17. if(j->mode & DMDIR)
  18. j->type = FT_DCREATE0;
  19. else
  20. j->type = FT_FCREATE0;
  21. }
  22. case FT_FCREATE0:
  23. case FT_FCREATE1:
  24. case FT_DCREATE0:
  25. case FT_DCREATE1:
  26. n = putc3(&buff[0], j->fnum);
  27. goto create;
  28. case FT_chmod:
  29. if(j->mode & (1 << 8))
  30. j->type = FT_CHMOD1;
  31. else
  32. j->type = FT_CHMOD0;
  33. case FT_CHMOD0:
  34. case FT_CHMOD1:
  35. n = putc3(&buff[0], j->fnum);
  36. buff[n++] = j->mode;
  37. return n + putc3(&buff[n], j->mnum);
  38. case FT_REMOVE:
  39. return putc3(&buff[0], j->fnum);
  40. case FT_WRITE:
  41. n = putc3(&buff[0], j->fnum);
  42. n += putc3(&buff[n], j->mtime);
  43. n += putc3(&buff[n], j->offset);
  44. return n + putc3(&buff[n], j->size - 1);
  45. case FT_AWRITE:
  46. n = putc3(&buff[0], j->fnum);
  47. n += putc3(&buff[n], j->offset);
  48. return n + putc3(&buff[n], j->size - 1);
  49. case FT_trunc:
  50. if(j->mode & (1 << 8))
  51. j->type = FT_TRUNC1;
  52. else
  53. j->type = FT_TRUNC0;
  54. case FT_TRUNC0:
  55. case FT_TRUNC1:
  56. n = putc3(&buff[0], j->fnum);
  57. n += putc3(&buff[n], j->tnum);
  58. goto create;
  59. case FT_SUMMARY:
  60. case FT_SUMBEG:
  61. return putc3(&buff[0], j->seq);
  62. case FT_SUMEND:
  63. return 0;
  64. create:
  65. buff[n++] = j->mode;
  66. n += putc3(&buff[n], j->mtime);
  67. n += putc3(&buff[n], j->parent);
  68. m = strlen(j->name);
  69. memmove(&buff[n], j->name, m);
  70. n += m;
  71. buff[n++] = '\0';
  72. return n;
  73. }
  74. return -1;
  75. }
  76. int
  77. convM2J(Jrec *j, uchar *buff)
  78. {
  79. int m, n;
  80. j->type = buff[0];
  81. switch(j->type) {
  82. case FT_FCREATE0:
  83. case FT_FCREATE1:
  84. case FT_DCREATE0:
  85. case FT_DCREATE1:
  86. n = 1 + getc3(&buff[1], &j->fnum);
  87. j->mode = buff[n++];
  88. switch(j->type) {
  89. case FT_FCREATE0:
  90. break;
  91. case FT_FCREATE1:
  92. j->mode |= 1 << 8;
  93. break;
  94. case FT_DCREATE0:
  95. j->mode |= DMDIR;
  96. break;
  97. case FT_DCREATE1:
  98. j->mode |= DMDIR | (1 << 8);
  99. break;
  100. }
  101. j->type = FT_create;
  102. goto create;
  103. case FT_CHMOD0:
  104. case FT_CHMOD1:
  105. n = 1 + getc3(&buff[1], &j->fnum);
  106. j->mode = buff[n++];
  107. switch(j->type) {
  108. case FT_CHMOD0:
  109. break;
  110. case FT_CHMOD1:
  111. j->mode |= 1 << 8;
  112. break;
  113. }
  114. j->type = FT_chmod;
  115. return n + getc3(&buff[n], &j->mnum);
  116. case FT_REMOVE:
  117. return 1 + getc3(&buff[1], &j->fnum);
  118. case FT_WRITE:
  119. n = 1 + getc3(&buff[1], &j->fnum);
  120. n += getc3(&buff[n], &j->mtime);
  121. n += getc3(&buff[n], &j->offset);
  122. n += getc3(&buff[n], &j->size);
  123. j->size++;
  124. return n;
  125. case FT_AWRITE:
  126. n = 1 + getc3(&buff[1], &j->fnum);
  127. n += getc3(&buff[n], &j->offset);
  128. n += getc3(&buff[n], &j->size);
  129. j->size++;
  130. return n;
  131. case FT_TRUNC0:
  132. case FT_TRUNC1:
  133. n = 1 + getc3(&buff[1], &j->fnum);
  134. n += getc3(&buff[n], &j->tnum);
  135. j->mode = buff[n++];
  136. switch(j->type) {
  137. case FT_TRUNC0:
  138. break;
  139. case FT_TRUNC1:
  140. j->mode |= 1 << 8;
  141. break;
  142. }
  143. j->type = FT_trunc;
  144. goto create;
  145. case FT_SUMMARY:
  146. case FT_SUMBEG:
  147. return 1 + getc3(&buff[1], &j->seq);
  148. case FT_SUMEND:
  149. return 1;
  150. create:
  151. n += getc3(&buff[n], &j->mtime);
  152. n += getc3(&buff[n], &j->parent);
  153. memmove(j->name, &buff[n], MAXNSIZE+1);
  154. j->name[MAXNSIZE+1] = '\0';
  155. m = strlen(j->name);
  156. if(m > MAXNSIZE)
  157. return -1;
  158. return n + m + 1;
  159. }
  160. return -1;
  161. }
  162. int
  163. Jconv(Fmt *fp)
  164. {
  165. Jrec *j;
  166. j = va_arg(fp->args, Jrec *);
  167. switch(j->type) {
  168. case FT_create:
  169. case FT_FCREATE0:
  170. case FT_FCREATE1:
  171. case FT_DCREATE0:
  172. case FT_DCREATE1:
  173. return fmtprint(fp, "create f %ld p %ld t %lud m %ulo %s",
  174. j->fnum, j->parent, j->mtime, j->mode, j->name);
  175. case FT_chmod:
  176. case FT_CHMOD0:
  177. case FT_CHMOD1:
  178. return fmtprint(fp, "chmod f %ld m %ulo #%ld",
  179. j->fnum, j->mode, j->mnum);
  180. case FT_REMOVE:
  181. return fmtprint(fp, "remove f %ld", j->fnum);
  182. case FT_WRITE:
  183. return fmtprint(fp, "write f %ld z %ld o %ld t %uld",
  184. j->fnum, j->size, j->offset, j->mtime);
  185. case FT_AWRITE:
  186. return fmtprint(fp, "awrite f %ld z %ld o %ld",
  187. j->fnum, j->size, j->offset);
  188. case FT_trunc:
  189. case FT_TRUNC0:
  190. case FT_TRUNC1:
  191. return fmtprint(fp, "trunc f %ld o %ld p %ld t %ld m %ulo %s",
  192. j->fnum, j->tnum, j->parent, j->mtime, j->mode, j->name);
  193. case FT_SUMMARY:
  194. return fmtprint(fp, "summary %ld",
  195. j->seq);
  196. case FT_SUMBEG:
  197. return fmtprint(fp, "sumbeg %ld",
  198. j->seq);
  199. case FT_SUMEND:
  200. return fmtprint(fp, "end");
  201. default:
  202. return fmtprint(fp, "?type %d", j->type);
  203. }
  204. }