convS2M.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <fcall.h>
  4. static
  5. uchar*
  6. pstring(uchar *p, char *s)
  7. {
  8. uint n;
  9. if(s == nil){
  10. PBIT16(p, 0);
  11. p += BIT16SZ;
  12. return p;
  13. }
  14. n = strlen(s);
  15. PBIT16(p, n);
  16. p += BIT16SZ;
  17. memmove(p, s, n);
  18. p += n;
  19. return p;
  20. }
  21. static
  22. uchar*
  23. pqid(uchar *p, Qid *q)
  24. {
  25. PBIT8(p, q->type);
  26. p += BIT8SZ;
  27. PBIT32(p, q->vers);
  28. p += BIT32SZ;
  29. PBIT64(p, q->path);
  30. p += BIT64SZ;
  31. return p;
  32. }
  33. static
  34. uint
  35. stringsz(char *s)
  36. {
  37. if(s == nil)
  38. return BIT16SZ;
  39. return BIT16SZ+strlen(s);
  40. }
  41. uint
  42. sizeS2M(Fcall *f)
  43. {
  44. uint n;
  45. int i;
  46. n = 0;
  47. n += BIT32SZ; /* size */
  48. n += BIT8SZ; /* type */
  49. n += BIT16SZ; /* tag */
  50. switch(f->type)
  51. {
  52. default:
  53. return 0;
  54. case Tversion:
  55. n += BIT32SZ;
  56. n += stringsz(f->version);
  57. break;
  58. case Tflush:
  59. n += BIT16SZ;
  60. break;
  61. case Tauth:
  62. n += BIT32SZ;
  63. n += stringsz(f->uname);
  64. n += stringsz(f->aname);
  65. break;
  66. case Tattach:
  67. n += BIT32SZ;
  68. n += BIT32SZ;
  69. n += stringsz(f->uname);
  70. n += stringsz(f->aname);
  71. break;
  72. case Twalk:
  73. n += BIT32SZ;
  74. n += BIT32SZ;
  75. n += BIT16SZ;
  76. for(i=0; i<f->nwname; i++)
  77. n += stringsz(f->wname[i]);
  78. break;
  79. case Topen:
  80. n += BIT32SZ;
  81. n += BIT8SZ;
  82. break;
  83. case Tcreate:
  84. n += BIT32SZ;
  85. n += stringsz(f->name);
  86. n += BIT32SZ;
  87. n += BIT8SZ;
  88. break;
  89. case Tread:
  90. n += BIT32SZ;
  91. n += BIT64SZ;
  92. n += BIT32SZ;
  93. break;
  94. case Twrite:
  95. n += BIT32SZ;
  96. n += BIT64SZ;
  97. n += BIT32SZ;
  98. n += f->count;
  99. break;
  100. case Tclunk:
  101. case Tremove:
  102. n += BIT32SZ;
  103. break;
  104. case Tstat:
  105. n += BIT32SZ;
  106. break;
  107. case Twstat:
  108. n += BIT32SZ;
  109. n += BIT16SZ;
  110. n += f->nstat;
  111. break;
  112. /*
  113. */
  114. case Rversion:
  115. n += BIT32SZ;
  116. n += stringsz(f->version);
  117. break;
  118. case Rerror:
  119. n += stringsz(f->ename);
  120. break;
  121. case Rflush:
  122. break;
  123. case Rauth:
  124. n += QIDSZ;
  125. break;
  126. case Rattach:
  127. n += QIDSZ;
  128. break;
  129. case Rwalk:
  130. n += BIT16SZ;
  131. n += f->nwqid*QIDSZ;
  132. break;
  133. case Ropen:
  134. case Rcreate:
  135. n += QIDSZ;
  136. n += BIT32SZ;
  137. break;
  138. case Rread:
  139. n += BIT32SZ;
  140. n += f->count;
  141. break;
  142. case Rwrite:
  143. n += BIT32SZ;
  144. break;
  145. case Rclunk:
  146. break;
  147. case Rremove:
  148. break;
  149. case Rstat:
  150. n += BIT16SZ;
  151. n += f->nstat;
  152. break;
  153. case Rwstat:
  154. break;
  155. }
  156. return n;
  157. }
  158. uint
  159. convS2M(Fcall *f, uchar *ap, uint nap)
  160. {
  161. uchar *p;
  162. uint i, size;
  163. size = sizeS2M(f);
  164. if(size == 0)
  165. return 0;
  166. if(size > nap)
  167. return 0;
  168. p = (uchar*)ap;
  169. PBIT32(p, size);
  170. p += BIT32SZ;
  171. PBIT8(p, f->type);
  172. p += BIT8SZ;
  173. PBIT16(p, f->tag);
  174. p += BIT16SZ;
  175. switch(f->type)
  176. {
  177. default:
  178. return 0;
  179. case Tversion:
  180. PBIT32(p, f->msize);
  181. p += BIT32SZ;
  182. p = pstring(p, f->version);
  183. break;
  184. case Tflush:
  185. PBIT16(p, f->oldtag);
  186. p += BIT16SZ;
  187. break;
  188. case Tauth:
  189. PBIT32(p, f->afid);
  190. p += BIT32SZ;
  191. p = pstring(p, f->uname);
  192. p = pstring(p, f->aname);
  193. break;
  194. case Tattach:
  195. PBIT32(p, f->fid);
  196. p += BIT32SZ;
  197. PBIT32(p, f->afid);
  198. p += BIT32SZ;
  199. p = pstring(p, f->uname);
  200. p = pstring(p, f->aname);
  201. break;
  202. case Twalk:
  203. PBIT32(p, f->fid);
  204. p += BIT32SZ;
  205. PBIT32(p, f->newfid);
  206. p += BIT32SZ;
  207. PBIT16(p, f->nwname);
  208. p += BIT16SZ;
  209. if(f->nwname > MAXWELEM)
  210. return 0;
  211. for(i=0; i<f->nwname; i++)
  212. p = pstring(p, f->wname[i]);
  213. break;
  214. case Topen:
  215. PBIT32(p, f->fid);
  216. p += BIT32SZ;
  217. PBIT8(p, f->mode);
  218. p += BIT8SZ;
  219. break;
  220. case Tcreate:
  221. PBIT32(p, f->fid);
  222. p += BIT32SZ;
  223. p = pstring(p, f->name);
  224. PBIT32(p, f->perm);
  225. p += BIT32SZ;
  226. PBIT8(p, f->mode);
  227. p += BIT8SZ;
  228. break;
  229. case Tread:
  230. PBIT32(p, f->fid);
  231. p += BIT32SZ;
  232. PBIT64(p, f->offset);
  233. p += BIT64SZ;
  234. PBIT32(p, f->count);
  235. p += BIT32SZ;
  236. break;
  237. case Twrite:
  238. PBIT32(p, f->fid);
  239. p += BIT32SZ;
  240. PBIT64(p, f->offset);
  241. p += BIT64SZ;
  242. PBIT32(p, f->count);
  243. p += BIT32SZ;
  244. memmove(p, f->data, f->count);
  245. p += f->count;
  246. break;
  247. case Tclunk:
  248. case Tremove:
  249. PBIT32(p, f->fid);
  250. p += BIT32SZ;
  251. break;
  252. case Tstat:
  253. PBIT32(p, f->fid);
  254. p += BIT32SZ;
  255. break;
  256. case Twstat:
  257. PBIT32(p, f->fid);
  258. p += BIT32SZ;
  259. PBIT16(p, f->nstat);
  260. p += BIT16SZ;
  261. memmove(p, f->stat, f->nstat);
  262. p += f->nstat;
  263. break;
  264. /*
  265. */
  266. case Rversion:
  267. PBIT32(p, f->msize);
  268. p += BIT32SZ;
  269. p = pstring(p, f->version);
  270. break;
  271. case Rerror:
  272. p = pstring(p, f->ename);
  273. break;
  274. case Rflush:
  275. break;
  276. case Rauth:
  277. p = pqid(p, &f->aqid);
  278. break;
  279. case Rattach:
  280. p = pqid(p, &f->qid);
  281. break;
  282. case Rwalk:
  283. PBIT16(p, f->nwqid);
  284. p += BIT16SZ;
  285. if(f->nwqid > MAXWELEM)
  286. return 0;
  287. for(i=0; i<f->nwqid; i++)
  288. p = pqid(p, &f->wqid[i]);
  289. break;
  290. case Ropen:
  291. case Rcreate:
  292. p = pqid(p, &f->qid);
  293. PBIT32(p, f->iounit);
  294. p += BIT32SZ;
  295. break;
  296. case Rread:
  297. PBIT32(p, f->count);
  298. p += BIT32SZ;
  299. memmove(p, f->data, f->count);
  300. p += f->count;
  301. break;
  302. case Rwrite:
  303. PBIT32(p, f->count);
  304. p += BIT32SZ;
  305. break;
  306. case Rclunk:
  307. break;
  308. case Rremove:
  309. break;
  310. case Rstat:
  311. PBIT16(p, f->nstat);
  312. p += BIT16SZ;
  313. memmove(p, f->stat, f->nstat);
  314. p += f->nstat;
  315. break;
  316. case Rwstat:
  317. break;
  318. }
  319. if(size != p-ap)
  320. return 0;
  321. return size;
  322. }