oldfcall.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. #include <plan9.h>
  2. #include <fcall.h>
  3. #include <oldfcall.h>
  4. /*
  5. * routines to package the old protocol in the new structures.
  6. */
  7. #define SHORT(x) p[0]=f->x; p[1]=f->x>>8; p += 2
  8. #define LONG(x) p[0]=f->x; p[1]=f->x>>8; p[2]=f->x>>16; p[3]=f->x>>24; p += 4
  9. #define VLONG(x) p[0]=f->x; p[1]=f->x>>8;\
  10. p[2]=f->x>>16; p[3]=f->x>>24;\
  11. p[4]=f->x>>32; p[5]=f->x>>40;\
  12. p[6]=f->x>>48; p[7]=f->x>>56;\
  13. p += 8
  14. #define STRING(x,n) strecpy((char*)p, (char*)p+n, f->x); p += n;
  15. #define FIXQID(q) q.path ^= (q.path>>33); q.path &= 0x7FFFFFFF; q.path |= (q.type&0x80)<<24
  16. uint
  17. oldhdrsize(uchar type)
  18. {
  19. switch(type){
  20. default:
  21. return 0;
  22. case oldTnop:
  23. return 3;
  24. case oldTflush:
  25. return 3+2;
  26. case oldTclone:
  27. return 3+2+2;
  28. case oldTwalk:
  29. return 3+2+28;
  30. case oldTopen:
  31. return 3+2+1;
  32. case oldTcreate:
  33. return 3+2+28+4+1;
  34. case oldTread:
  35. return 3+2+8+2;
  36. case oldTwrite:
  37. return 3+2+8+2+1;
  38. case oldTclunk:
  39. return 3+2;
  40. case oldTremove:
  41. return 3+2;
  42. case oldTstat:
  43. return 3+2;
  44. case oldTwstat:
  45. return 3+2+116;
  46. case oldTsession:
  47. return 3+8;
  48. case oldTattach:
  49. return 3+2+28+28+72+13;
  50. }
  51. }
  52. uint
  53. iosize(uchar *p)
  54. {
  55. if(p[0] != oldTwrite)
  56. return 0;
  57. return p[3+2+8] | (p[3+2+8+1]<<8);
  58. }
  59. uint
  60. sizeS2M(Fcall *f)
  61. {
  62. switch(f->type)
  63. {
  64. default:
  65. abort();
  66. return 0;
  67. /* no T messages */
  68. /*
  69. */
  70. case Rversion:
  71. return 1+2;
  72. /*
  73. case Rsession:
  74. return 1+2+8+28+48;
  75. */
  76. case Rattach:
  77. return 1+2+2+4+4+13;
  78. case Rerror:
  79. return 1+2+64;
  80. case Rflush:
  81. if(f->tag&0x8000)
  82. return 1+2+8+28+48; /* session */
  83. return 1+2;
  84. /* assumes we don't ever see Tclwalk requests ... */
  85. case Rwalk:
  86. if(f->nwqid == 0)
  87. return 1+2+2;
  88. else
  89. return 1+2+2+4+4;
  90. case Ropen:
  91. return 1+2+2+4+4;
  92. case Rcreate:
  93. return 1+2+2+4+4;
  94. case Rread:
  95. return 1+2+2+2+1+f->count;
  96. case Rwrite:
  97. return 1+2+2+2;
  98. case Rclunk:
  99. return 1+2+2;
  100. case Rremove:
  101. return 1+2+2;
  102. case Rstat:
  103. return 1+2+2+116;
  104. case Rwstat:
  105. return 1+2+2;
  106. }
  107. }
  108. uint
  109. convS2Mold(Fcall *f, uchar *ap, uint nap)
  110. {
  111. uchar *p;
  112. if(nap < sizeS2M(f))
  113. return 0;
  114. p = ap;
  115. switch(f->type)
  116. {
  117. default:
  118. abort();
  119. return 0;
  120. /* no T messages */
  121. /*
  122. */
  123. case Rversion:
  124. *p++ = oldRnop;
  125. SHORT(tag);
  126. break;
  127. /*
  128. case Rsession:
  129. *p++ = oldRsession;
  130. SHORT(tag);
  131. if(f->nchal > 8)
  132. f->nchal = 8;
  133. memmove(p, f->chal, f->nchal);
  134. p += f->nchal;
  135. if(f->nchal < 8){
  136. memset(p, 0, 8 - f->nchal);
  137. p += 8 - f->nchal;
  138. }
  139. STRING(authid, 28);
  140. STRING(authdom, 48);
  141. break;
  142. */
  143. case Rattach:
  144. *p++ = oldRattach;
  145. SHORT(tag);
  146. SHORT(fid);
  147. FIXQID(f->qid);
  148. LONG(qid.path);
  149. LONG(qid.vers);
  150. memset(p, 0, 13);
  151. p += 13;
  152. break;
  153. case Rerror:
  154. *p++ = oldRerror;
  155. SHORT(tag);
  156. STRING(ename, 64);
  157. break;
  158. case Rflush:
  159. if(f->tag&0x8000){
  160. *p++ = oldRsession;
  161. f->tag &= ~0x8000;
  162. SHORT(tag);
  163. memset(p, 0, 8+28+48);
  164. p += 8+28+48;
  165. }else{
  166. *p++ = oldRflush;
  167. SHORT(tag);
  168. }
  169. break;
  170. /* assumes we don't ever see Tclwalk requests ... */
  171. case Rwalk:
  172. if(f->nwqid == 0){ /* successful clone */
  173. *p++ = oldRclone;
  174. SHORT(tag);
  175. SHORT(fid);
  176. }else{ /* successful 1-element walk */
  177. *p++ = oldRwalk;
  178. SHORT(tag);
  179. SHORT(fid);
  180. FIXQID(f->wqid[0]);
  181. LONG(wqid[0].path);
  182. LONG(wqid[0].vers);
  183. }
  184. break;
  185. case Ropen:
  186. *p++ = oldRopen;
  187. SHORT(tag);
  188. SHORT(fid);
  189. FIXQID(f->qid);
  190. LONG(qid.path);
  191. LONG(qid.vers);
  192. break;
  193. case Rcreate:
  194. *p++ = oldRcreate;
  195. SHORT(tag);
  196. SHORT(fid);
  197. FIXQID(f->qid);
  198. LONG(qid.path);
  199. LONG(qid.vers);
  200. break;
  201. case Rread:
  202. *p++ = oldRread;
  203. SHORT(tag);
  204. SHORT(fid);
  205. SHORT(count);
  206. p++; /* pad(1) */
  207. memmove(p, f->data, f->count);
  208. p += f->count;
  209. break;
  210. case Rwrite:
  211. *p++ = oldRwrite;
  212. SHORT(tag);
  213. SHORT(fid);
  214. SHORT(count);
  215. break;
  216. case Rclunk:
  217. *p++ = oldRclunk;
  218. SHORT(tag);
  219. SHORT(fid);
  220. break;
  221. case Rremove:
  222. *p++ = oldRremove;
  223. SHORT(tag);
  224. SHORT(fid);
  225. break;
  226. case Rstat:
  227. *p++ = oldRstat;
  228. SHORT(tag);
  229. SHORT(fid);
  230. memmove(p, f->stat, 116);
  231. p += 116;
  232. break;
  233. case Rwstat:
  234. *p++ = oldRwstat;
  235. SHORT(tag);
  236. SHORT(fid);
  237. break;
  238. }
  239. return p - ap;
  240. }
  241. uint
  242. sizeD2Mold(Dir *d)
  243. {
  244. return 116;
  245. }
  246. uint
  247. convD2Mold(Dir *f, uchar *ap, uint nap)
  248. {
  249. uchar *p;
  250. if(nap < 116)
  251. return 0;
  252. p = ap;
  253. STRING(name, 28);
  254. STRING(uid, 28);
  255. STRING(gid, 28);
  256. FIXQID(f->qid);
  257. LONG(qid.path);
  258. LONG(qid.vers);
  259. LONG(mode);
  260. LONG(atime);
  261. LONG(mtime);
  262. VLONG(length);
  263. SHORT(type);
  264. SHORT(dev);
  265. return p - ap;
  266. }
  267. #undef SHORT
  268. #undef LONG
  269. #undef VLONG
  270. #undef STRING
  271. #define CHAR(x) f->x = *p++
  272. #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
  273. #define LONG(x) f->x = (p[0] | (p[1]<<8) |\
  274. (p[2]<<16) | (p[3]<<24)); p += 4
  275. #define VLONG(x) f->x = (ulong)(p[0] | (p[1]<<8) |\
  276. (p[2]<<16) | (p[3]<<24)) |\
  277. ((vlong)(p[4] | (p[5]<<8) |\
  278. (p[6]<<16) | (p[7]<<24)) << 32); p += 8
  279. #define STRING(x,n) f->x = (char*)p; p += n
  280. uint
  281. convM2Sold(uchar *ap, uint nap, Fcall *f)
  282. {
  283. uchar *p, *q, *ep;
  284. p = ap;
  285. ep = p + nap;
  286. if(p+3 > ep)
  287. return 0;
  288. switch(*p++){
  289. case oldTnop:
  290. f->type = Tversion;
  291. SHORT(tag);
  292. f->msize = 0;
  293. f->version = "9P1";
  294. break;
  295. case oldTflush:
  296. f->type = Tflush;
  297. SHORT(tag);
  298. if(p+2 > ep)
  299. return 0;
  300. SHORT(oldtag);
  301. break;
  302. case oldTclone:
  303. f->type = Twalk;
  304. SHORT(tag);
  305. if(p+2+2 > ep)
  306. return 0;
  307. SHORT(fid);
  308. SHORT(newfid);
  309. f->nwname = 0;
  310. break;
  311. case oldTwalk:
  312. f->type = Twalk;
  313. SHORT(tag);
  314. if(p+2+28 > ep)
  315. return 0;
  316. SHORT(fid);
  317. f->newfid = f->fid;
  318. f->nwname = 1;
  319. f->wname[0] = (char*)p;
  320. p += 28;
  321. break;
  322. case oldTopen:
  323. f->type = Topen;
  324. SHORT(tag);
  325. if(p+2+1 > ep)
  326. return 0;
  327. SHORT(fid);
  328. CHAR(mode);
  329. break;
  330. case oldTcreate:
  331. f->type = Tcreate;
  332. SHORT(tag);
  333. if(p+2+28+4+1 > ep)
  334. return 0;
  335. SHORT(fid);
  336. f->name = (char*)p;
  337. p += 28;
  338. LONG(perm);
  339. CHAR(mode);
  340. break;
  341. case oldTread:
  342. f->type = Tread;
  343. SHORT(tag);
  344. if(p+2+8+2 > ep)
  345. return 0;
  346. SHORT(fid);
  347. VLONG(offset);
  348. SHORT(count);
  349. break;
  350. case oldTwrite:
  351. f->type = Twrite;
  352. SHORT(tag);
  353. if(p+2+8+2+1 > ep)
  354. return 0;
  355. SHORT(fid);
  356. VLONG(offset);
  357. SHORT(count);
  358. p++; /* pad(1) */
  359. if(p+f->count > ep)
  360. return 0;
  361. f->data = (char*)p;
  362. p += f->count;
  363. break;
  364. case oldTclunk:
  365. f->type = Tclunk;
  366. SHORT(tag);
  367. if(p+2 > ep)
  368. return 0;
  369. SHORT(fid);
  370. break;
  371. case oldTremove:
  372. f->type = Tremove;
  373. SHORT(tag);
  374. if(p+2 > ep)
  375. return 0;
  376. SHORT(fid);
  377. break;
  378. case oldTstat:
  379. f->type = Tstat;
  380. f->nstat = 116;
  381. SHORT(tag);
  382. if(p+2 > ep)
  383. return 0;
  384. SHORT(fid);
  385. break;
  386. case oldTwstat:
  387. f->type = Twstat;
  388. SHORT(tag);
  389. if(p+2+116 > ep)
  390. return 0;
  391. SHORT(fid);
  392. f->stat = p;
  393. q = p+28*3+5*4;
  394. memset(q, 0xFF, 8); /* clear length to ``don't care'' */
  395. p += 116;
  396. break;
  397. /*
  398. case oldTsession:
  399. f->type = Tsession;
  400. SHORT(tag);
  401. if(p+8 > ep)
  402. return 0;
  403. f->chal = p;
  404. p += 8;
  405. f->nchal = 8;
  406. break;
  407. */
  408. case oldTsession:
  409. f->type = Tflush;
  410. SHORT(tag);
  411. f->tag |= 0x8000;
  412. f->oldtag = f->tag;
  413. p += 8;
  414. break;
  415. case oldTattach:
  416. f->type = Tattach;
  417. SHORT(tag);
  418. if(p+2+28+28+72+13 > ep)
  419. return 0;
  420. SHORT(fid);
  421. STRING(uname, 28);
  422. STRING(aname, 28);
  423. p += 72+13;
  424. f->afid = NOFID;
  425. break;
  426. default:
  427. return 0;
  428. }
  429. return p-ap;
  430. }
  431. uint
  432. convM2Dold(uchar *ap, uint nap, Dir *f, char *strs)
  433. {
  434. uchar *p;
  435. USED(strs);
  436. if(nap < 116)
  437. return 0;
  438. p = (uchar*)ap;
  439. STRING(name, 28);
  440. STRING(uid, 28);
  441. STRING(gid, 28);
  442. LONG(qid.path);
  443. LONG(qid.vers);
  444. LONG(mode);
  445. LONG(atime);
  446. LONG(mtime);
  447. VLONG(length);
  448. SHORT(type);
  449. SHORT(dev);
  450. f->qid.type = (f->mode>>24)&0xF0;
  451. return p - (uchar*)ap;
  452. }