9p1lib.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. #include "all.h"
  2. #include "9p1.h"
  3. #define CHAR(x) *p++ = f->x
  4. #define SHORT(x) { ulong vvv = f->x; p[0] = vvv; p[1] = vvv>>8; p += 2; }
  5. #define VLONG(q) p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4
  6. #define LONG(x) { ulong vvv = f->x; VLONG(vvv); }
  7. #define BYTES(x,n) memmove(p, f->x, n); p += n
  8. #define STRING(x,n) strncpy((char*)p, f->x, n); p += n
  9. int
  10. convS2M9p1(Oldfcall *f, uchar *ap)
  11. {
  12. uchar *p;
  13. int t;
  14. p = ap;
  15. CHAR(type);
  16. t = f->type;
  17. SHORT(tag);
  18. switch(t)
  19. {
  20. default:
  21. print("convS2M9p1: bad type: %d\n", t);
  22. return 0;
  23. case Tnop9p1:
  24. case Tosession9p1:
  25. break;
  26. case Tsession9p1:
  27. BYTES(chal, sizeof(f->chal));
  28. break;
  29. case Tflush9p1:
  30. SHORT(oldtag);
  31. break;
  32. case Tattach9p1:
  33. SHORT(fid);
  34. STRING(uname, sizeof(f->uname));
  35. STRING(aname, sizeof(f->aname));
  36. BYTES(ticket, sizeof(f->ticket));
  37. BYTES(auth, sizeof(f->auth));
  38. break;
  39. case Toattach9p1:
  40. SHORT(fid);
  41. STRING(uname, sizeof(f->uname));
  42. STRING(aname, sizeof(f->aname));
  43. BYTES(ticket, NAMELEN);
  44. break;
  45. case Tclone9p1:
  46. SHORT(fid);
  47. SHORT(newfid);
  48. break;
  49. case Twalk9p1:
  50. SHORT(fid);
  51. STRING(name, sizeof(f->name));
  52. break;
  53. case Tclwalk9p1:
  54. SHORT(fid);
  55. SHORT(newfid);
  56. STRING(name, sizeof(f->name));
  57. break;
  58. case Topen9p1:
  59. SHORT(fid);
  60. CHAR(mode);
  61. break;
  62. case Tcreate9p1:
  63. SHORT(fid);
  64. STRING(name, sizeof(f->name));
  65. LONG(perm);
  66. CHAR(mode);
  67. break;
  68. case Tread9p1:
  69. SHORT(fid);
  70. LONG(offset); VLONG(0);
  71. SHORT(count);
  72. break;
  73. case Twrite9p1:
  74. SHORT(fid);
  75. LONG(offset); VLONG(0);
  76. SHORT(count);
  77. p++;
  78. if((uchar*)p == (uchar*)f->data) {
  79. p += f->count;
  80. break;
  81. }
  82. BYTES(data, f->count);
  83. break;
  84. case Tclunk9p1:
  85. case Tremove9p1:
  86. case Tstat9p1:
  87. SHORT(fid);
  88. break;
  89. case Twstat9p1:
  90. SHORT(fid);
  91. BYTES(stat, sizeof(f->stat));
  92. break;
  93. /*
  94. */
  95. case Rnop9p1:
  96. case Rosession9p1:
  97. case Rflush9p1:
  98. break;
  99. case Rsession9p1:
  100. BYTES(chal, sizeof(f->chal));
  101. BYTES(authid, sizeof(f->authid));
  102. BYTES(authdom, sizeof(f->authdom));
  103. break;
  104. case Rerror9p1:
  105. STRING(ename, sizeof(f->ename));
  106. break;
  107. case Rclone9p1:
  108. case Rclunk9p1:
  109. case Rremove9p1:
  110. case Rwstat9p1:
  111. SHORT(fid);
  112. break;
  113. case Rwalk9p1:
  114. case Ropen9p1:
  115. case Rcreate9p1:
  116. case Rclwalk9p1:
  117. SHORT(fid);
  118. LONG(qid.path);
  119. LONG(qid.version);
  120. break;
  121. case Rattach9p1:
  122. SHORT(fid);
  123. LONG(qid.path);
  124. LONG(qid.version);
  125. BYTES(rauth, sizeof(f->rauth));
  126. break;
  127. case Roattach9p1:
  128. SHORT(fid);
  129. LONG(qid.path);
  130. LONG(qid.version);
  131. break;
  132. case Rread9p1:
  133. SHORT(fid);
  134. SHORT(count);
  135. p++;
  136. if((uchar*)p == (uchar*)f->data) {
  137. p += f->count;
  138. break;
  139. }
  140. BYTES(data, f->count);
  141. break;
  142. case Rwrite9p1:
  143. SHORT(fid);
  144. SHORT(count);
  145. break;
  146. case Rstat9p1:
  147. SHORT(fid);
  148. BYTES(stat, sizeof(f->stat));
  149. break;
  150. }
  151. return p - (uchar*)ap;
  152. }
  153. /*
  154. * buggery to give false qid for
  155. * the top 2 levels of the dump fs
  156. */
  157. static ulong
  158. fakeqid9p1(Dentry *f)
  159. {
  160. ulong q;
  161. int c;
  162. q = f->qid.path;
  163. if(q == (QPROOT|QPDIR)) {
  164. c = f->name[0];
  165. if(c >= '0' && c <= '9') {
  166. q = 3|QPDIR;
  167. c = (c-'0')*10 + (f->name[1]-'0');
  168. if(c >= 1 && c <= 12)
  169. q = 4|QPDIR;
  170. }
  171. }
  172. return q;
  173. }
  174. int
  175. convD2M9p1(Dentry *f, char *ap)
  176. {
  177. uchar *p;
  178. ulong q;
  179. p = (uchar*)ap;
  180. STRING(name, sizeof(f->name));
  181. memset(p, 0, 2*NAMELEN);
  182. uidtostr((char*)p, f->uid);
  183. p += NAMELEN;
  184. uidtostr((char*)p, f->gid);
  185. p += NAMELEN;
  186. q = fakeqid9p1(f);
  187. VLONG(q);
  188. LONG(qid.version);
  189. {
  190. q = f->mode & 0x0fff;
  191. if(f->mode & DDIR)
  192. q |= PDIR;
  193. if(f->mode & DAPND)
  194. q |= PAPND;
  195. if(f->mode & DLOCK)
  196. q |= PLOCK;
  197. VLONG(q);
  198. }
  199. LONG(atime);
  200. LONG(mtime);
  201. LONG(size); VLONG(0);
  202. VLONG(0);
  203. return p - (uchar*)ap;
  204. }
  205. #undef CHAR
  206. #undef SHORT
  207. #undef LONG
  208. #undef VLONG
  209. #undef BYTES
  210. #undef STRING
  211. #define CHAR(x) f->x = *p++
  212. #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
  213. #define VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4
  214. #define LONG(x) VLONG(f->x)
  215. #define BYTES(x,n) memmove(f->x, p, n); p += n
  216. #define STRING(x,n) memmove(f->x, p, n); p += n
  217. int
  218. convM2S9p1(uchar *ap, Oldfcall *f, int n)
  219. {
  220. uchar *p;
  221. int t;
  222. p = ap;
  223. CHAR(type);
  224. t = f->type;
  225. SHORT(tag);
  226. switch(t)
  227. {
  228. default:
  229. /*
  230. * only whine if it couldn't be a 9P2000 Tversion9p1.
  231. */
  232. if(t != 19 || ap[4] != 100)
  233. print("convM2S9p1: bad type: %d\n", f->type);
  234. return 0;
  235. case Tnop9p1:
  236. case Tosession9p1:
  237. break;
  238. case Tsession9p1:
  239. BYTES(chal, sizeof(f->chal));
  240. break;
  241. case Tflush9p1:
  242. SHORT(oldtag);
  243. break;
  244. case Tattach9p1:
  245. SHORT(fid);
  246. BYTES(uname, sizeof(f->uname));
  247. BYTES(aname, sizeof(f->aname));
  248. BYTES(ticket, sizeof(f->ticket));
  249. BYTES(auth, sizeof(f->auth));
  250. break;
  251. case Toattach9p1:
  252. SHORT(fid);
  253. BYTES(uname, sizeof(f->uname));
  254. BYTES(aname, sizeof(f->aname));
  255. BYTES(ticket, NAMELEN);
  256. break;
  257. case Tclone9p1:
  258. SHORT(fid);
  259. SHORT(newfid);
  260. break;
  261. case Twalk9p1:
  262. SHORT(fid);
  263. BYTES(name, sizeof(f->name));
  264. break;
  265. case Tclwalk9p1:
  266. SHORT(fid);
  267. SHORT(newfid);
  268. BYTES(name, sizeof(f->name));
  269. break;
  270. case Tremove9p1:
  271. SHORT(fid);
  272. break;
  273. case Topen9p1:
  274. SHORT(fid);
  275. CHAR(mode);
  276. break;
  277. case Tcreate9p1:
  278. SHORT(fid);
  279. BYTES(name, sizeof(f->name));
  280. LONG(perm);
  281. CHAR(mode);
  282. break;
  283. case Tread9p1:
  284. SHORT(fid);
  285. LONG(offset); p += 4;
  286. SHORT(count);
  287. break;
  288. case Twrite9p1:
  289. SHORT(fid);
  290. LONG(offset); p += 4;
  291. SHORT(count);
  292. p++;
  293. f->data = (char*)p; p += f->count;
  294. break;
  295. case Tclunk9p1:
  296. case Tstat9p1:
  297. SHORT(fid);
  298. break;
  299. case Twstat9p1:
  300. SHORT(fid);
  301. BYTES(stat, sizeof(f->stat));
  302. break;
  303. /*
  304. */
  305. case Rnop9p1:
  306. case Rosession9p1:
  307. break;
  308. case Rsession9p1:
  309. BYTES(chal, sizeof(f->chal));
  310. BYTES(authid, sizeof(f->authid));
  311. BYTES(authdom, sizeof(f->authdom));
  312. break;
  313. case Rerror9p1:
  314. BYTES(ename, sizeof(f->ename));
  315. break;
  316. case Rflush9p1:
  317. break;
  318. case Rclone9p1:
  319. case Rclunk9p1:
  320. case Rremove9p1:
  321. case Rwstat9p1:
  322. SHORT(fid);
  323. break;
  324. case Rwalk9p1:
  325. case Rclwalk9p1:
  326. case Ropen9p1:
  327. case Rcreate9p1:
  328. SHORT(fid);
  329. LONG(qid.path);
  330. LONG(qid.version);
  331. break;
  332. case Rattach9p1:
  333. SHORT(fid);
  334. LONG(qid.path);
  335. LONG(qid.version);
  336. BYTES(rauth, sizeof(f->rauth));
  337. break;
  338. case Roattach9p1:
  339. SHORT(fid);
  340. LONG(qid.path);
  341. LONG(qid.version);
  342. break;
  343. case Rread9p1:
  344. SHORT(fid);
  345. SHORT(count);
  346. p++;
  347. f->data = (char*)p; p += f->count;
  348. break;
  349. case Rwrite9p1:
  350. SHORT(fid);
  351. SHORT(count);
  352. break;
  353. case Rstat9p1:
  354. SHORT(fid);
  355. BYTES(stat, sizeof(f->stat));
  356. break;
  357. }
  358. if((uchar*)ap+n == p)
  359. return n;
  360. return 0;
  361. }
  362. int
  363. convM2D9p1(char *ap, Dentry *f)
  364. {
  365. uchar *p;
  366. char str[28];
  367. p = (uchar*)ap;
  368. BYTES(name, sizeof(f->name));
  369. memmove(str, p, NAMELEN);
  370. p += NAMELEN;
  371. f->uid = strtouid(str);
  372. memmove(str, p, NAMELEN);
  373. p += NAMELEN;
  374. f->gid = strtouid(str);
  375. LONG(qid.path);
  376. LONG(qid.version);
  377. {
  378. LONG(atime);
  379. f->mode = (f->atime & 0x0fff) | DALLOC;
  380. if(f->atime & PDIR)
  381. f->mode |= DDIR;
  382. if(f->atime & PAPND)
  383. f->mode |= DAPND;
  384. if(f->atime & PLOCK)
  385. f->mode |= DLOCK;
  386. }
  387. LONG(atime);
  388. LONG(mtime);
  389. LONG(size); p += 4;
  390. p += 4;
  391. return p - (uchar*)ap;
  392. }