9p1lib.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. #include "all.h"
  2. /* BUG transition */
  3. // int client9p = 2;
  4. // int kernel9p = 2;
  5. #include "9p1.h"
  6. #define CHAR(x) *p++ = f->x
  7. #define SHORT(x) { ulong vvv = f->x; *p++ = vvv; *p++ = vvv>>8; }
  8. #define LONGINT(q) {*p++ = (q); *p++ = (q)>>8; *p++ = (q)>>16; *p++ = (q)>>24;}
  9. #define LONG(x) { ulong vvv = f->x; LONGINT(vvv); }
  10. #define VLONG(x) { \
  11. uvlong q = f->x; \
  12. *p++ = (q)>> 0; *p++ = (q)>> 8; *p++ = (q)>>16; *p++ = (q)>>24; \
  13. *p++ = (q)>>32; *p++ = (q)>>40; *p++ = (q)>>48; *p++ = (q)>>56; \
  14. }
  15. #define BYTES(x,n) memmove(p, f->x, n); p += n
  16. #define STRING(x,n) strncpy((char*)p, f->x, n); p += n
  17. int
  18. convS2M9p1(Fcall *f, uchar *ap)
  19. {
  20. uchar *p;
  21. int t;
  22. p = ap;
  23. CHAR(type);
  24. t = f->type;
  25. SHORT(tag);
  26. switch(t) {
  27. default:
  28. print("convS2M9p1: bad type: %d\n", t);
  29. return 0;
  30. case Tnop:
  31. case Tosession:
  32. break;
  33. case Tsession:
  34. BYTES(chal, sizeof(f->chal));
  35. break;
  36. case Tflush:
  37. SHORT(oldtag);
  38. break;
  39. case Tattach:
  40. SHORT(fid);
  41. STRING(uname, sizeof(f->uname));
  42. STRING(aname, sizeof(f->aname));
  43. BYTES(ticket, sizeof(f->ticket));
  44. BYTES(auth, sizeof(f->auth));
  45. break;
  46. case Toattach:
  47. SHORT(fid);
  48. STRING(uname, sizeof(f->uname));
  49. STRING(aname, sizeof(f->aname));
  50. BYTES(ticket, NAMELEN);
  51. break;
  52. case Tclone:
  53. SHORT(fid);
  54. SHORT(newfid);
  55. break;
  56. case Twalk:
  57. SHORT(fid);
  58. STRING(name, sizeof(f->name));
  59. break;
  60. case Tclwalk:
  61. SHORT(fid);
  62. SHORT(newfid);
  63. STRING(name, sizeof(f->name));
  64. break;
  65. case Topen:
  66. SHORT(fid);
  67. CHAR(mode);
  68. break;
  69. case Tcreate:
  70. SHORT(fid);
  71. STRING(name, sizeof(f->name));
  72. LONG(perm);
  73. CHAR(mode);
  74. break;
  75. case Tread:
  76. SHORT(fid);
  77. VLONG(offset);
  78. SHORT(count);
  79. break;
  80. case Twrite:
  81. SHORT(fid);
  82. VLONG(offset);
  83. SHORT(count);
  84. p++;
  85. if((uchar*)p == (uchar*)f->data) {
  86. p += f->count;
  87. break;
  88. }
  89. BYTES(data, f->count);
  90. break;
  91. case Tclunk:
  92. case Tremove:
  93. case Tstat:
  94. SHORT(fid);
  95. break;
  96. case Twstat:
  97. SHORT(fid);
  98. BYTES(stat, sizeof(f->stat));
  99. break;
  100. /*
  101. */
  102. case Rnop:
  103. case Rosession:
  104. case Rflush:
  105. break;
  106. case Rsession:
  107. BYTES(chal, sizeof(f->chal));
  108. BYTES(authid, sizeof(f->authid));
  109. BYTES(authdom, sizeof(f->authdom));
  110. break;
  111. case Rerror:
  112. STRING(ename, sizeof(f->ename));
  113. break;
  114. case Rclone:
  115. case Rclunk:
  116. case Rremove:
  117. case Rwstat:
  118. SHORT(fid);
  119. break;
  120. case Rwalk:
  121. case Ropen:
  122. case Rcreate:
  123. case Rclwalk:
  124. SHORT(fid);
  125. LONG(qid.path);
  126. LONG(qid.version);
  127. break;
  128. case Rattach:
  129. SHORT(fid);
  130. LONG(qid.path);
  131. LONG(qid.version);
  132. BYTES(rauth, sizeof(f->rauth));
  133. break;
  134. case Roattach:
  135. SHORT(fid);
  136. LONG(qid.path);
  137. LONG(qid.version);
  138. break;
  139. case Rread:
  140. SHORT(fid);
  141. SHORT(count);
  142. p++;
  143. if((uchar*)p == (uchar*)f->data) {
  144. p += f->count;
  145. break;
  146. }
  147. BYTES(data, f->count);
  148. break;
  149. case Rwrite:
  150. SHORT(fid);
  151. SHORT(count);
  152. break;
  153. case Rstat:
  154. SHORT(fid);
  155. BYTES(stat, sizeof(f->stat));
  156. break;
  157. }
  158. return p - (uchar*)ap;
  159. }
  160. /*
  161. * buggery to give false qid for
  162. * the top 2 levels of the dump fs
  163. */
  164. static ulong
  165. fakeqid9p1(Dentry *f)
  166. {
  167. ulong q;
  168. int c;
  169. q = f->qid.path;
  170. if(q == (QPROOT|QPDIR)) {
  171. c = f->name[0];
  172. if(isascii(c) && isdigit(c)) {
  173. q = 3|QPDIR;
  174. c = (c-'0')*10 + (f->name[1]-'0');
  175. if(c >= 1 && c <= 12)
  176. q = 4|QPDIR;
  177. }
  178. }
  179. return q;
  180. }
  181. int
  182. convD2M9p1(Dentry *f, char *ap)
  183. {
  184. uchar *p;
  185. ulong q;
  186. p = (uchar*)ap;
  187. STRING(name, sizeof(f->name));
  188. memset(p, 0, 2*NAMELEN);
  189. uidtostr((char*)p, f->uid, 1);
  190. p += NAMELEN;
  191. uidtostr((char*)p, f->gid, 1);
  192. p += NAMELEN;
  193. q = fakeqid9p1(f);
  194. LONGINT(q);
  195. LONG(qid.version);
  196. q = f->mode & 0x0fff;
  197. if(f->mode & DDIR)
  198. q |= PDIR;
  199. if(f->mode & DAPND)
  200. q |= PAPND;
  201. if(f->mode & DLOCK)
  202. q |= PLOCK;
  203. LONGINT(q);
  204. LONG(atime);
  205. LONG(mtime);
  206. VLONG(size);
  207. LONGINT(0);
  208. return p - (uchar*)ap;
  209. }
  210. int
  211. convA2M9p1(Authenticator *f, char *ap, char *key)
  212. {
  213. int n;
  214. uchar *p;
  215. p = (uchar*)ap;
  216. CHAR(num);
  217. BYTES(chal, CHALLEN);
  218. LONG(id);
  219. n = p - (uchar*)ap;
  220. if(key)
  221. encrypt(key, ap, n);
  222. return n;
  223. }
  224. #undef CHAR
  225. #undef SHORT
  226. #undef LONG
  227. #undef LONGINT
  228. #undef VLONG
  229. #undef BYTES
  230. #undef STRING
  231. #define CHAR(x) f->x = *p++
  232. #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
  233. #define LONG(x) f->x = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); p += 4
  234. #define VLONG(x) { \
  235. f->x = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)) | \
  236. (uvlong)(p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24)) << 32; \
  237. p += 8; \
  238. }
  239. #define BYTES(x,n) memmove(f->x, p, n); p += n
  240. #define STRING(x,n) memmove(f->x, p, n); p += n
  241. int
  242. convM2S9p1(uchar *ap, Fcall *f, int n)
  243. {
  244. uchar *p;
  245. int t;
  246. p = ap;
  247. CHAR(type);
  248. t = f->type;
  249. SHORT(tag);
  250. switch(t) {
  251. default:
  252. /*
  253. * only whine if it couldn't be a 9P2000 Tversion.
  254. */
  255. if(t != 19 || ap[4] != 100)
  256. print("convM2S9p1: bad type: %d\n", f->type);
  257. return 0;
  258. case Tnop:
  259. case Tosession:
  260. break;
  261. case Tsession:
  262. BYTES(chal, sizeof(f->chal));
  263. break;
  264. case Tflush:
  265. SHORT(oldtag);
  266. break;
  267. case Tattach:
  268. SHORT(fid);
  269. BYTES(uname, sizeof(f->uname));
  270. BYTES(aname, sizeof(f->aname));
  271. BYTES(ticket, sizeof(f->ticket));
  272. BYTES(auth, sizeof(f->auth));
  273. break;
  274. case Toattach:
  275. SHORT(fid);
  276. BYTES(uname, sizeof(f->uname));
  277. BYTES(aname, sizeof(f->aname));
  278. BYTES(ticket, NAMELEN);
  279. break;
  280. case Tclone:
  281. SHORT(fid);
  282. SHORT(newfid);
  283. break;
  284. case Twalk:
  285. SHORT(fid);
  286. BYTES(name, sizeof(f->name));
  287. break;
  288. case Tclwalk:
  289. SHORT(fid);
  290. SHORT(newfid);
  291. BYTES(name, sizeof(f->name));
  292. break;
  293. case Tremove:
  294. SHORT(fid);
  295. break;
  296. case Topen:
  297. SHORT(fid);
  298. CHAR(mode);
  299. break;
  300. case Tcreate:
  301. SHORT(fid);
  302. BYTES(name, sizeof(f->name));
  303. LONG(perm);
  304. CHAR(mode);
  305. break;
  306. case Tread:
  307. SHORT(fid);
  308. VLONG(offset);
  309. SHORT(count);
  310. break;
  311. case Twrite:
  312. SHORT(fid);
  313. VLONG(offset);
  314. SHORT(count);
  315. p++;
  316. f->data = (char*)p; p += f->count;
  317. break;
  318. case Tclunk:
  319. case Tstat:
  320. SHORT(fid);
  321. break;
  322. case Twstat:
  323. SHORT(fid);
  324. BYTES(stat, sizeof(f->stat));
  325. break;
  326. /*
  327. */
  328. case Rnop:
  329. case Rosession:
  330. break;
  331. case Rsession:
  332. BYTES(chal, sizeof(f->chal));
  333. BYTES(authid, sizeof(f->authid));
  334. BYTES(authdom, sizeof(f->authdom));
  335. break;
  336. case Rerror:
  337. BYTES(ename, sizeof(f->ename));
  338. break;
  339. case Rflush:
  340. break;
  341. case Rclone:
  342. case Rclunk:
  343. case Rremove:
  344. case Rwstat:
  345. SHORT(fid);
  346. break;
  347. case Rwalk:
  348. case Rclwalk:
  349. case Ropen:
  350. case Rcreate:
  351. SHORT(fid);
  352. LONG(qid.path);
  353. LONG(qid.version);
  354. break;
  355. case Rattach:
  356. SHORT(fid);
  357. LONG(qid.path);
  358. LONG(qid.version);
  359. BYTES(rauth, sizeof(f->rauth));
  360. break;
  361. case Roattach:
  362. SHORT(fid);
  363. LONG(qid.path);
  364. LONG(qid.version);
  365. break;
  366. case Rread:
  367. SHORT(fid);
  368. SHORT(count);
  369. p++;
  370. f->data = (char*)p; p += f->count;
  371. break;
  372. case Rwrite:
  373. SHORT(fid);
  374. SHORT(count);
  375. break;
  376. case Rstat:
  377. SHORT(fid);
  378. BYTES(stat, sizeof(f->stat));
  379. break;
  380. }
  381. if((uchar*)ap+n == p)
  382. return n;
  383. return 0;
  384. }
  385. int
  386. convM2D9p1(char *ap, Dentry *f)
  387. {
  388. uchar *p;
  389. char str[NAMELEN];
  390. p = (uchar*)ap;
  391. BYTES(name, sizeof(f->name));
  392. memmove(str, p, NAMELEN);
  393. p += NAMELEN;
  394. f->uid = strtouid(str);
  395. memmove(str, p, NAMELEN);
  396. p += NAMELEN;
  397. f->gid = strtouid(str);
  398. LONG(qid.path);
  399. LONG(qid.version);
  400. LONG(atime);
  401. f->mode = (f->atime & 0x0fff) | DALLOC;
  402. if(f->atime & PDIR)
  403. f->mode |= DDIR;
  404. if(f->atime & PAPND)
  405. f->mode |= DAPND;
  406. if(f->atime & PLOCK)
  407. f->mode |= DLOCK;
  408. LONG(atime);
  409. LONG(mtime);
  410. VLONG(size);
  411. p += 4;
  412. return p - (uchar*)ap;
  413. }
  414. void
  415. convM2A9p1(char *ap, Authenticator *f, char *key)
  416. {
  417. uchar *p;
  418. if(key)
  419. decrypt(key, ap, AUTHENTLEN);
  420. p = (uchar*)ap;
  421. CHAR(num);
  422. BYTES(chal, CHALLEN);
  423. LONG(id);
  424. USED(p);
  425. }
  426. void
  427. convM2T9p1(char *ap, Ticket *f, char *key)
  428. {
  429. uchar *p;
  430. if(key)
  431. decrypt(key, ap, TICKETLEN);
  432. p = (uchar*)ap;
  433. CHAR(num);
  434. BYTES(chal, CHALLEN);
  435. STRING(cuid, NAMELEN);
  436. f->cuid[NAMELEN-1] = 0;
  437. STRING(suid, NAMELEN);
  438. f->suid[NAMELEN-1] = 0;
  439. BYTES(key, DESKEYLEN);
  440. USED(p);
  441. }