9p1lib.c 8.2 KB

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