_fcall.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #include <string.h>
  2. #include "sys9.h"
  3. #include "lib.h"
  4. #include "dir.h"
  5. #include "fcall.h"
  6. typedef unsigned char uchar;
  7. #define CHAR(x) *p++ = f->x
  8. #define SHORT(x) p[0] = f->x; p[1] = f->x>>8; p += 2
  9. #define LONG(x) p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24; p += 4
  10. #define VLONG(x) p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24;\
  11. p[4] = 0; p[5] = 0; p[6] = 0; p[7] = 0; p += 8
  12. #define STRING(x,n) memcpy(p, f->x, n); p += n
  13. int
  14. convS2M(Fcall *f, char *ap)
  15. {
  16. uchar *p;
  17. p = (uchar*)ap;
  18. CHAR(type);
  19. SHORT(tag);
  20. switch(f->type)
  21. {
  22. default:
  23. return 0;
  24. case Tosession:
  25. case Tnop:
  26. break;
  27. case Tsession:
  28. STRING(chal, sizeof(f->chal));
  29. break;
  30. case Tflush:
  31. SHORT(oldtag);
  32. break;
  33. case Tattach:
  34. SHORT(fid);
  35. STRING(uname, sizeof(f->uname));
  36. STRING(aname, sizeof(f->aname));
  37. STRING(ticket, sizeof(f->ticket));
  38. STRING(auth, sizeof(f->auth));
  39. break;
  40. case Toattach:
  41. SHORT(fid);
  42. STRING(uname, sizeof(f->uname));
  43. STRING(aname, sizeof(f->aname));
  44. STRING(ticket, NAMELEN);
  45. break;
  46. case Tauth:
  47. SHORT(fid);
  48. STRING(uname, sizeof(f->uname));
  49. STRING(ticket, 8+NAMELEN);
  50. break;
  51. case Tclone:
  52. SHORT(fid);
  53. SHORT(newfid);
  54. break;
  55. case Twalk:
  56. SHORT(fid);
  57. STRING(name, sizeof(f->name));
  58. break;
  59. case Topen:
  60. SHORT(fid);
  61. CHAR(mode);
  62. break;
  63. case Tcreate:
  64. SHORT(fid);
  65. STRING(name, sizeof(f->name));
  66. LONG(perm);
  67. CHAR(mode);
  68. break;
  69. case Tread:
  70. SHORT(fid);
  71. VLONG(offset);
  72. SHORT(count);
  73. break;
  74. case Twrite:
  75. SHORT(fid);
  76. VLONG(offset);
  77. SHORT(count);
  78. p++; /* pad(1) */
  79. STRING(data, f->count);
  80. break;
  81. case Tclunk:
  82. SHORT(fid);
  83. break;
  84. case Tremove:
  85. SHORT(fid);
  86. break;
  87. case Tstat:
  88. SHORT(fid);
  89. break;
  90. case Twstat:
  91. SHORT(fid);
  92. STRING(stat, sizeof(f->stat));
  93. break;
  94. case Tclwalk:
  95. SHORT(fid);
  96. SHORT(newfid);
  97. STRING(name, sizeof(f->name));
  98. break;
  99. /*
  100. */
  101. case Rosession:
  102. case Rnop:
  103. break;
  104. case Rsession:
  105. STRING(chal, sizeof(f->chal));
  106. STRING(authid, sizeof(f->authid));
  107. STRING(authdom, sizeof(f->authdom));
  108. break;
  109. case Rerror:
  110. STRING(ename, sizeof(f->ename));
  111. break;
  112. case Rflush:
  113. break;
  114. case Rattach:
  115. SHORT(fid);
  116. LONG(qid.path);
  117. LONG(qid.vers);
  118. STRING(rauth, sizeof(f->rauth));
  119. break;
  120. case Roattach:
  121. SHORT(fid);
  122. LONG(qid.path);
  123. LONG(qid.vers);
  124. break;
  125. case Rauth:
  126. SHORT(fid);
  127. STRING(ticket, 8+8+7+7);
  128. break;
  129. case Rclone:
  130. SHORT(fid);
  131. break;
  132. case Rwalk:
  133. case Rclwalk:
  134. SHORT(fid);
  135. LONG(qid.path);
  136. LONG(qid.vers);
  137. break;
  138. case Ropen:
  139. SHORT(fid);
  140. LONG(qid.path);
  141. LONG(qid.vers);
  142. break;
  143. case Rcreate:
  144. SHORT(fid);
  145. LONG(qid.path);
  146. LONG(qid.vers);
  147. break;
  148. case Rread:
  149. SHORT(fid);
  150. SHORT(count);
  151. p++; /* pad(1) */
  152. STRING(data, f->count);
  153. break;
  154. case Rwrite:
  155. SHORT(fid);
  156. SHORT(count);
  157. break;
  158. case Rclunk:
  159. SHORT(fid);
  160. break;
  161. case Rremove:
  162. SHORT(fid);
  163. break;
  164. case Rstat:
  165. SHORT(fid);
  166. STRING(stat, sizeof(f->stat));
  167. break;
  168. case Rwstat:
  169. SHORT(fid);
  170. break;
  171. }
  172. return p - (uchar*)ap;
  173. }
  174. #undef CHAR
  175. #undef SHORT
  176. #undef LONG
  177. #undef VLONG
  178. #undef STRING
  179. #define CHAR(x) f->x = *p++
  180. #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
  181. #define LONG(x) f->x = (p[0] | (p[1]<<8) |\
  182. (p[2]<<16) | (p[3]<<24)); p += 4
  183. #define VLONG(x) f->x = (p[0] | (p[1]<<8) |\
  184. (p[2]<<16) | (p[3]<<24)); p += 8
  185. #define STRING(x,n) memcpy(f->x, p, n); p += n
  186. int
  187. convM2S(char *ap, Fcall *f, int n)
  188. {
  189. uchar *p;
  190. p = (uchar*)ap;
  191. CHAR(type);
  192. SHORT(tag);
  193. switch(f->type)
  194. {
  195. default:
  196. return 0;
  197. case Tnop:
  198. case Tosession:
  199. break;
  200. case Tsession:
  201. STRING(chal, sizeof(f->chal));
  202. break;
  203. case Tflush:
  204. SHORT(oldtag);
  205. break;
  206. case Tattach:
  207. SHORT(fid);
  208. STRING(uname, sizeof(f->uname));
  209. STRING(aname, sizeof(f->aname));
  210. STRING(ticket, sizeof(f->ticket));
  211. STRING(auth, sizeof(f->auth));
  212. break;
  213. case Toattach:
  214. SHORT(fid);
  215. STRING(uname, sizeof(f->uname));
  216. STRING(aname, sizeof(f->aname));
  217. STRING(ticket, NAMELEN);
  218. break;
  219. case Tauth:
  220. SHORT(fid);
  221. STRING(uname, sizeof(f->uname));
  222. STRING(ticket, 8+NAMELEN);
  223. break;
  224. case Tclone:
  225. SHORT(fid);
  226. SHORT(newfid);
  227. break;
  228. case Twalk:
  229. SHORT(fid);
  230. STRING(name, sizeof(f->name));
  231. break;
  232. case Topen:
  233. SHORT(fid);
  234. CHAR(mode);
  235. break;
  236. case Tcreate:
  237. SHORT(fid);
  238. STRING(name, sizeof(f->name));
  239. LONG(perm);
  240. CHAR(mode);
  241. break;
  242. case Tread:
  243. SHORT(fid);
  244. VLONG(offset);
  245. SHORT(count);
  246. break;
  247. case Twrite:
  248. SHORT(fid);
  249. VLONG(offset);
  250. SHORT(count);
  251. p++; /* pad(1) */
  252. f->data = (char*)p; p += f->count;
  253. break;
  254. case Tclunk:
  255. SHORT(fid);
  256. break;
  257. case Tremove:
  258. SHORT(fid);
  259. break;
  260. case Tstat:
  261. SHORT(fid);
  262. break;
  263. case Twstat:
  264. SHORT(fid);
  265. STRING(stat, sizeof(f->stat));
  266. break;
  267. case Tclwalk:
  268. SHORT(fid);
  269. SHORT(newfid);
  270. STRING(name, sizeof(f->name));
  271. break;
  272. /*
  273. */
  274. case Rnop:
  275. case Rosession:
  276. break;
  277. case Rsession:
  278. STRING(chal, sizeof(f->chal));
  279. STRING(authid, sizeof(f->authid));
  280. STRING(authdom, sizeof(f->authdom));
  281. break;
  282. case Rerror:
  283. STRING(ename, sizeof(f->ename));
  284. break;
  285. case Rflush:
  286. break;
  287. case Rattach:
  288. SHORT(fid);
  289. LONG(qid.path);
  290. LONG(qid.vers);
  291. STRING(rauth, sizeof(f->rauth));
  292. break;
  293. case Roattach:
  294. SHORT(fid);
  295. LONG(qid.path);
  296. LONG(qid.vers);
  297. break;
  298. case Rauth:
  299. SHORT(fid);
  300. STRING(ticket, 8+8+7+7);
  301. break;
  302. case Rclone:
  303. SHORT(fid);
  304. break;
  305. case Rwalk:
  306. case Rclwalk:
  307. SHORT(fid);
  308. LONG(qid.path);
  309. LONG(qid.vers);
  310. break;
  311. case Ropen:
  312. SHORT(fid);
  313. LONG(qid.path);
  314. LONG(qid.vers);
  315. break;
  316. case Rcreate:
  317. SHORT(fid);
  318. LONG(qid.path);
  319. LONG(qid.vers);
  320. break;
  321. case Rread:
  322. SHORT(fid);
  323. SHORT(count);
  324. p++; /* pad(1) */
  325. f->data = (char*)p; p += f->count;
  326. break;
  327. case Rwrite:
  328. SHORT(fid);
  329. SHORT(count);
  330. break;
  331. case Rclunk:
  332. SHORT(fid);
  333. break;
  334. case Rremove:
  335. SHORT(fid);
  336. break;
  337. case Rstat:
  338. SHORT(fid);
  339. STRING(stat, sizeof(f->stat));
  340. break;
  341. case Rwstat:
  342. SHORT(fid);
  343. break;
  344. }
  345. if((uchar*)ap+n == p)
  346. return n;
  347. return 0;
  348. }