conv.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "local.h"
  4. #include "fcall.h"
  5. static void
  6. pn(uchar **pp, char *v)
  7. {
  8. uchar *p = *pp;
  9. int l;
  10. l = v ? strlen(v) : 0;
  11. PBIT16(p, l); p += BIT16SZ;
  12. memmove(p, v, l);
  13. p += l;
  14. *pp = p;
  15. }
  16. static uint
  17. sn(char *p)
  18. {
  19. if(p == nil)
  20. return BIT16SZ;
  21. return strlen(p) + BIT16SZ;
  22. }
  23. uint
  24. logfsconvM2S(uchar *ap, uint nap, LogMessage *f)
  25. {
  26. uchar *p = ap;
  27. uchar *ep = p + nap;
  28. uchar *mep;
  29. uint size;
  30. //print("conv(%d)\n", nap);
  31. if(p + 1 > ep)
  32. return 0;
  33. f->type = *p++;
  34. //print("type %c\n", f->type);
  35. switch(f->type) {
  36. case LogfsLogTstart:
  37. case LogfsLogTcreate:
  38. case LogfsLogTtrunc:
  39. case LogfsLogTremove:
  40. case LogfsLogTwrite:
  41. case LogfsLogTwstat:
  42. break;
  43. case LogfsLogTend:
  44. return 1;
  45. default:
  46. return 0;
  47. }
  48. if(p + BIT16SZ > ep)
  49. return 0;
  50. size = GBIT16(p); p += BIT16SZ;
  51. //print("size %ud\n", size);
  52. if(p + size > ep)
  53. return 0;
  54. mep = p + size;
  55. if(p + BIT32SZ > mep)
  56. return 0;
  57. f->path = GBIT32(p); p += BIT32SZ;
  58. switch(f->type) {
  59. case LogfsLogTstart:
  60. /* 's' size[2] path[4] nerase[4] */
  61. if(p + BIT32SZ > ep)
  62. return 0;
  63. f->u.start.nerase = GBIT32(p); p += BIT32SZ;
  64. break;
  65. case LogfsLogTcreate:
  66. /* 'c' size[2] path[4] perm[4] newpath[4] mtime[4] cvers[4] name[s] uid[s] gid[s] */
  67. if(p + 4 * BIT32SZ > mep)
  68. return 0;
  69. f->u.create.perm = GBIT32(p); p+= BIT32SZ;
  70. f->u.create.newpath = GBIT32(p); p+= BIT32SZ;
  71. f->u.create.mtime = GBIT32(p); p+= BIT32SZ;
  72. f->u.create.cvers = GBIT32(p); p+= BIT32SZ;
  73. if(!logfsgn(&p, mep, &f->u.create.name)
  74. || !logfsgn(&p, mep, &f->u.create.uid)
  75. || !logfsgn(&p, mep, &f->u.create.gid))
  76. return 0;
  77. break;
  78. case LogfsLogTremove:
  79. /* 'r' size[2] path[4] mtime[4] muid[s] */
  80. if(p + BIT32SZ > mep)
  81. return 0;
  82. f->u.remove.mtime = GBIT32(p); p += BIT32SZ;
  83. if(!logfsgn(&p, mep, &f->u.remove.muid))
  84. return 0;
  85. break;
  86. case LogfsLogTtrunc:
  87. /* 't' size[2] path[4] mtime[4] cvers[4] muid[s] */
  88. if(p + 2 * BIT32SZ > mep)
  89. return 0;
  90. f->u.trunc.mtime = GBIT32(p); p += BIT32SZ;
  91. f->u.trunc.cvers = GBIT32(p); p += BIT32SZ;
  92. if(!logfsgn(&p, mep, &f->u.trunc.muid))
  93. return 0;
  94. break;
  95. case LogfsLogTwrite:
  96. /* 'w' size[2] path[4] offset[4] count[2] mtime[4] cvers[4] muid[s] flashaddr[4] [data[n]] */
  97. if(p + BIT32SZ + BIT16SZ + 2 * BIT32SZ > mep)
  98. return 0;
  99. f->u.write.offset = GBIT32(p); p += BIT32SZ;
  100. f->u.write.count = GBIT16(p); p += BIT16SZ;
  101. f->u.write.mtime = GBIT32(p); p += BIT32SZ;
  102. f->u.write.cvers = GBIT32(p); p += BIT32SZ;
  103. if(!logfsgn(&p, mep, &f->u.write.muid))
  104. return 0;
  105. if(p + BIT32SZ > mep)
  106. return 0;
  107. f->u.write.flashaddr = GBIT32(p); p += BIT32SZ;
  108. if(f->u.write.flashaddr & LogAddr) {
  109. if(p + f->u.write.count > mep)
  110. return 0;
  111. f->u.write.data = p;
  112. p += f->u.write.count;
  113. }
  114. else
  115. f->u.write.data = nil;
  116. break;
  117. case LogfsLogTwstat:
  118. /* 'W' size[2] path[4] name[s] perm[4] uid[s] gid[s] mtime[4] muid[s] or */
  119. /* 'W' size[2] path[4] name[s] perm[4] gid[s] mtime[4] muid[s] */
  120. if(!logfsgn(&p, mep, &f->u.wstat.name))
  121. return 0;
  122. if(p + BIT32SZ > mep)
  123. return 0;
  124. f->u.wstat.perm = GBIT32(p); p += BIT32SZ;
  125. if(!logfsgn(&p, mep, &f->u.wstat.uid))
  126. return 0;
  127. if(!logfsgn(&p, mep, &f->u.wstat.gid))
  128. return 0;
  129. if(p + BIT32SZ > mep)
  130. return 0;
  131. f->u.wstat.mtime = GBIT32(p); p += BIT32SZ;
  132. if(!logfsgn(&p, mep, &f->u.wstat.muid))
  133. return 0;
  134. break;
  135. default:
  136. return 0;
  137. }
  138. if(p != mep)
  139. return 0;
  140. return p - ap;
  141. }
  142. uint
  143. logfssizeS2M(LogMessage *m)
  144. {
  145. switch(m->type) {
  146. case LogfsLogTend:
  147. return 1;
  148. case LogfsLogTstart:
  149. return 11;
  150. case LogfsLogTcreate:
  151. /* 'c' size[2] path[4] perm[4] newpath[4] mtime[4] cvers[4] name[s] uid[s] gid[s] */
  152. return 1 + BIT16SZ + 5 * BIT32SZ
  153. + sn(m->u.create.name) + sn(m->u.create.uid) + sn(m->u.create.gid);
  154. case LogfsLogTremove:
  155. /* 'r' size[2] path[4] mtime[4] muid[s] */
  156. return 1 + BIT16SZ + 2 * BIT32SZ + sn(m->u.remove.muid);
  157. case LogfsLogTtrunc:
  158. /* 't' size[2] path[4] mtime[4] cvers[4] muid[s] */
  159. return 1 + BIT16SZ + 3 * BIT32SZ + sn(m->u.trunc.muid);
  160. case LogfsLogTwrite:
  161. /* 'w' size[2] path[4] offset[4] count[2] mtime[4] cvers[4] muid[s] flashaddr[4] [data[n]] */
  162. return 1 + BIT16SZ + 2 * BIT32SZ + BIT16SZ + 2 * BIT32SZ + sn(m->u.write.muid)
  163. + BIT32SZ + (m->u.write.data ? m->u.write.count : 0);
  164. case LogfsLogTwstat:
  165. /* 'W' size[2] path[4] name[s] perm[4] uid[s] gid[s] mtime[4] muid[s] */
  166. /* 'W' size[2] path[4] name[s] perm[4] gid[s] mtime[4] muid[s] */
  167. return 1 + BIT16SZ + BIT32SZ + sn(m->u.wstat.name) + BIT32SZ
  168. + sn(m->u.wstat.uid)
  169. + sn(m->u.wstat.gid) + BIT32SZ + sn(m->u.wstat.muid);
  170. default:
  171. return 0;
  172. }
  173. }
  174. uint
  175. logfsconvS2M(LogMessage *s, uchar *ap, uint nap)
  176. {
  177. uint size;
  178. uchar *p;
  179. size = logfssizeS2M(s);
  180. if(size == 0 || size > nap)
  181. return 0;
  182. p = ap;
  183. *p++ = s->type;
  184. if(s->type == LogfsLogTend)
  185. return 1;
  186. size -= 1 + BIT16SZ;
  187. PBIT16(p, size); p += BIT16SZ;
  188. PBIT32(p, s->path); p += BIT32SZ;
  189. switch(s->type) {
  190. case LogfsLogTstart:
  191. PBIT32(p, s->u.start.nerase); p += BIT32SZ;
  192. break;
  193. case LogfsLogTcreate:
  194. /* 'c' size[2] path[4] perm[4] newpath[4] mtime[4] cvers[4] name[s] uid[s] gid[s] */
  195. PBIT32(p, s->u.create.perm); p += BIT32SZ;
  196. PBIT32(p, s->u.create.newpath); p += BIT32SZ;
  197. PBIT32(p, s->u.create.mtime); p += BIT32SZ;
  198. PBIT32(p, s->u.create.cvers); p += BIT32SZ;
  199. pn(&p, s->u.create.name);
  200. pn(&p, s->u.create.uid);
  201. pn(&p, s->u.create.gid);
  202. break;
  203. case LogfsLogTremove:
  204. /* 'r' size[2] path[4] mtime[4] muid[s] */
  205. PBIT32(p, s->u.remove.mtime); p += BIT32SZ;
  206. pn(&p, s->u.remove.muid);
  207. break;
  208. case LogfsLogTtrunc:
  209. /* 't' size[2] path[4] mtime[4] cvers[4] muid[s] */
  210. PBIT32(p, s->u.trunc.mtime); p += BIT32SZ;
  211. PBIT32(p, s->u.trunc.cvers); p += BIT32SZ;
  212. pn(&p, s->u.trunc.muid);
  213. break;
  214. case LogfsLogTwrite:
  215. /* 'w' size[2] path[4] offset[4] count[2] mtime[4] cvers[4] muid[s] flashaddr[4] [data[n]] */
  216. PBIT32(p, s->u.write.offset); p += BIT32SZ;
  217. PBIT16(p, s->u.write.count); p += BIT16SZ;
  218. PBIT32(p, s->u.write.mtime); p += BIT32SZ;
  219. PBIT32(p, s->u.write.cvers); p += BIT32SZ;
  220. pn(&p, s->u.write.muid);
  221. PBIT32(p, s->u.write.flashaddr); p += BIT32SZ;
  222. if(s->u.write.data) {
  223. memmove(p, s->u.write.data, s->u.write.count);
  224. p += s->u.write.count;
  225. }
  226. break;
  227. case LogfsLogTwstat:
  228. /* 'W' size[2] path[4] name[s] perm[4] uid[s] gid[s] mtime[4] muid[s] */
  229. /* 'W' size[2] path[4] name[s] perm[4] gid[s] mtime[4] muid[s] */
  230. pn(&p, s->u.wstat.name);
  231. PBIT32(p, s->u.wstat.perm); p += BIT32SZ;
  232. pn(&p, s->u.wstat.uid);
  233. pn(&p, s->u.wstat.gid);
  234. PBIT32(p, s->u.wstat.mtime); p+= BIT32SZ;
  235. pn(&p, s->u.wstat.muid);
  236. break;
  237. default:
  238. return 0;
  239. }
  240. return p - ap;
  241. }
  242. void
  243. logfsdumpS(LogMessage *m)
  244. {
  245. switch(m->type) {
  246. case LogfsLogTend:
  247. print("LogfsLogTend()");
  248. break;
  249. case LogfsLogTstart:
  250. print("LogfsLogTstart(path=%ud, nerase=%ud)", m->path, m->u.start.nerase);
  251. break;
  252. case LogfsLogTcreate:
  253. print("LogfsLogTcreate(path=%ud, perm=0%uo, newpath=%ud, mtime=%ud, cvers=%ud, name=%s, uid=%s, gid=%s)",
  254. m->path, m->u.create.perm, m->u.create.newpath, m->u.create.mtime, m->u.create.cvers,
  255. m->u.create.name, m->u.create.uid, m->u.create.gid);
  256. break;
  257. case LogfsLogTremove:
  258. print("LogfsLogTremove(path=%ud, mtime=%ud, muid=%s)",
  259. m->path, m->u.remove.mtime, m->u.remove.muid);
  260. break;
  261. case LogfsLogTtrunc:
  262. print("LogfsLogTtrunc(path=%ud, mtime=%ud, cvers=%ud, muid=%s)",
  263. m->path, m->u.trunc.mtime, m->u.trunc.cvers, m->u.trunc.muid);
  264. break;
  265. case LogfsLogTwrite:
  266. print("LogfsLogTwrite(path=%ud, offset=%ud, count=%ud, mtime=%ud, cvers=%ud, muid=%s, flashaddr=0x%.8ux)",
  267. m->path, m->u.write.offset, m->u.write.count, m->u.write.mtime, m->u.write.cvers, m->u.write.muid,
  268. m->u.write.flashaddr);
  269. break;
  270. case LogfsLogTwstat:
  271. print("LogfsLogTwstat(path=%ud, name=%s, perm=0%uo, uid=%s, gid=%s, mtime=%ud, muid=%s)",
  272. m->path, m->u.wstat.name, m->u.wstat.perm, m->u.wstat.uid, m->u.wstat.gid,
  273. m->u.wstat.mtime, m->u.wstat.muid);
  274. break;
  275. default:
  276. print("LogfsLogTother(%c)", m->type);
  277. break;
  278. }
  279. }