mount3.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  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. /*
  10. * SUN NFSv3 Mounter. See RFC 1813
  11. */
  12. #include <u.h>
  13. #include <libc.h>
  14. #include <thread.h>
  15. #include <sunrpc.h>
  16. #include <nfs3.h>
  17. void
  18. nfsMount3TNullPrint(Fmt *fmt, NfsMount3TNull *x)
  19. {
  20. USED(x);
  21. fmtprint(fmt, "%s\n", "NfsMount3TNull");
  22. }
  23. uint
  24. nfsMount3TNullSize(NfsMount3TNull *x)
  25. {
  26. uint a;
  27. USED(x);
  28. a = 0;
  29. return a;
  30. }
  31. int
  32. nfsMount3TNullPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3TNull *x)
  33. {
  34. USED(ea);
  35. USED(x);
  36. *pa = a;
  37. return 0;
  38. }
  39. int
  40. nfsMount3TNullUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  41. NfsMount3TNull *x)
  42. {
  43. USED(ea);
  44. USED(x);
  45. *pa = a;
  46. return 0;
  47. }
  48. void
  49. nfsMount3RNullPrint(Fmt *fmt, NfsMount3RNull *x)
  50. {
  51. USED(x);
  52. fmtprint(fmt, "%s\n", "NfsMount3RNull");
  53. }
  54. uint
  55. nfsMount3RNullSize(NfsMount3RNull *x)
  56. {
  57. uint a;
  58. USED(x);
  59. a = 0;
  60. return a;
  61. }
  62. int
  63. nfsMount3RNullPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3RNull *x)
  64. {
  65. USED(ea);
  66. USED(x);
  67. *pa = a;
  68. return 0;
  69. }
  70. int
  71. nfsMount3RNullUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  72. NfsMount3RNull *x)
  73. {
  74. USED(ea);
  75. USED(x);
  76. *pa = a;
  77. return 0;
  78. }
  79. void
  80. nfsMount3TMntPrint(Fmt *fmt, NfsMount3TMnt *x)
  81. {
  82. fmtprint(fmt, "%s\n", "NfsMount3TMnt");
  83. fmtprint(fmt, "\t%s=", "path");
  84. fmtprint(fmt, "\"%s\"", x->path);
  85. fmtprint(fmt, "\n");
  86. }
  87. uint
  88. nfsMount3TMntSize(NfsMount3TMnt *x)
  89. {
  90. uint a;
  91. USED(x);
  92. a = 0 + sunStringSize(x->path);
  93. return a;
  94. }
  95. int
  96. nfsMount3TMntPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3TMnt *x)
  97. {
  98. if(sunStringPack(a, ea, &a, &x->path, 1024) < 0) goto Err;
  99. *pa = a;
  100. return 0;
  101. Err:
  102. *pa = ea;
  103. return -1;
  104. }
  105. int
  106. nfsMount3TMntUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3TMnt *x)
  107. {
  108. if(sunStringUnpack(a, ea, &a, &x->path, 1024) < 0) goto Err;
  109. *pa = a;
  110. return 0;
  111. Err:
  112. *pa = ea;
  113. return -1;
  114. }
  115. void
  116. nfsMount3RMntPrint(Fmt *fmt, NfsMount3RMnt *x)
  117. {
  118. fmtprint(fmt, "%s\n", "NfsMount3RMnt");
  119. fmtprint(fmt, "\t%s=", "status");
  120. fmtprint(fmt, "%ud", x->status);
  121. fmtprint(fmt, "\n");
  122. switch(x->status){
  123. case 0:
  124. fmtprint(fmt, "\t%s=", "handle");
  125. fmtprint(fmt, "%.*H", x->len, x->handle);
  126. fmtprint(fmt, "\n");
  127. break;
  128. }
  129. }
  130. uint
  131. nfsMount3RMntSize(NfsMount3RMnt *x)
  132. {
  133. uint a;
  134. USED(x);
  135. a = 0 + 4;
  136. switch(x->status){
  137. case 0:
  138. a = a + sunVarOpaqueSize(x->len);
  139. a = a + 4 + 4 * x->nauth;
  140. break;
  141. }
  142. a = a;
  143. return a;
  144. }
  145. uint
  146. nfsMount1RMntSize(NfsMount3RMnt *x)
  147. {
  148. uint a;
  149. USED(x);
  150. a = 0 + 4;
  151. switch(x->status){
  152. case 0:
  153. a = a + NfsMount1HandleSize;
  154. break;
  155. }
  156. return a;
  157. }
  158. int
  159. nfsMount3RMntPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3RMnt *x)
  160. {
  161. int i;
  162. if(sunUint32Pack(a, ea, &a, &x->status) < 0) goto Err;
  163. switch(x->status){
  164. case 0:
  165. if(sunVarOpaquePack(a, ea, &a, &x->handle, &x->len, NfsMount3MaxHandleSize) < 0) goto Err;
  166. if(sunUint32Pack(a, ea, &a, &x->nauth) < 0) goto Err;
  167. for(i=0; i<x->nauth; i++)
  168. if(sunUint32Pack(a, ea, &a, &x->auth[i]) < 0) goto Err;
  169. break;
  170. }
  171. *pa = a;
  172. return 0;
  173. Err:
  174. *pa = ea;
  175. return -1;
  176. }
  177. int
  178. nfsMount1RMntPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3RMnt *x)
  179. {
  180. if(sunUint32Pack(a, ea, &a, &x->status) < 0) goto Err;
  181. switch(x->status){
  182. case 0:
  183. if(x->len != NfsMount1HandleSize)
  184. goto Err;
  185. if(sunFixedOpaquePack(a, ea, &a, x->handle, NfsMount1HandleSize) < 0) goto Err;
  186. if(x->nauth != 0)
  187. goto Err;
  188. break;
  189. }
  190. *pa = a;
  191. return 0;
  192. Err:
  193. *pa = ea;
  194. return -1;
  195. }
  196. int
  197. nfsMount1RMntUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3RMnt *x)
  198. {
  199. if(sunUint32Unpack(a, ea, &a, &x->status) < 0) goto Err;
  200. switch(x->status){
  201. case 0:
  202. x->len = NfsMount1HandleSize;
  203. x->nauth = 0;
  204. x->auth = 0;
  205. if(sunFixedOpaqueUnpack(a, ea, &a, x->handle, NfsMount1HandleSize) < 0) goto Err;
  206. if(x->nauth != 0)
  207. goto Err;
  208. break;
  209. }
  210. *pa = a;
  211. return 0;
  212. Err:
  213. *pa = ea;
  214. return -1;
  215. }
  216. int
  217. nfsMount3RMntUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3RMnt *x)
  218. {
  219. int i;
  220. if(sunUint32Unpack(a, ea, &a, &x->status) < 0) goto Err;
  221. switch(x->status){
  222. case 0:
  223. if(sunVarOpaqueUnpack(a, ea, &a, &x->handle, &x->len, NfsMount3MaxHandleSize) < 0) goto Err;
  224. if(sunUint32Unpack(a, ea, &a, &x->nauth) < 0) goto Err;
  225. x->auth = (uint32_t*)a;
  226. for(i=0; i<x->nauth; i++)
  227. if(sunUint32Unpack(a, ea, &a, &x->auth[i]) < 0) goto Err;
  228. break;
  229. }
  230. *pa = a;
  231. return 0;
  232. Err:
  233. *pa = ea;
  234. return -1;
  235. }
  236. void
  237. nfsMount3TDumpPrint(Fmt *fmt, NfsMount3TDump *x)
  238. {
  239. USED(x);
  240. fmtprint(fmt, "%s\n", "NfsMount3TDump");
  241. }
  242. uint
  243. nfsMount3TDumpSize(NfsMount3TDump *x)
  244. {
  245. uint a;
  246. USED(x);
  247. a = 0;
  248. return a;
  249. }
  250. int
  251. nfsMount3TDumpPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3TDump *x)
  252. {
  253. USED(ea);
  254. USED(x);
  255. *pa = a;
  256. return 0;
  257. }
  258. int
  259. nfsMount3TDumpUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  260. NfsMount3TDump *x)
  261. {
  262. USED(ea);
  263. USED(x);
  264. *pa = a;
  265. return 0;
  266. }
  267. void
  268. nfsMount3EntryPrint(Fmt *fmt, NfsMount3Entry *x)
  269. {
  270. fmtprint(fmt, "%s\n", "NfsMount3Entry");
  271. fmtprint(fmt, "\t%s=", "host");
  272. fmtprint(fmt, "\"%s\"", x->host);
  273. fmtprint(fmt, "\n");
  274. fmtprint(fmt, "\t%s=", "path");
  275. fmtprint(fmt, "\"%s\"", x->path);
  276. fmtprint(fmt, "\n");
  277. }
  278. uint
  279. nfsMount3EntrySize(NfsMount3Entry *x)
  280. {
  281. uint a;
  282. USED(x);
  283. a = 0 + sunStringSize(x->host) + sunStringSize(x->path);
  284. return a;
  285. }
  286. int
  287. nfsMount3EntryPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3Entry *x)
  288. {
  289. u1int one;
  290. one = 1;
  291. if(sunUint1Pack(a, ea, &a, &one) < 0) goto Err;
  292. if(sunStringPack(a, ea, &a, &x->host, 255) < 0) goto Err;
  293. if(sunStringPack(a, ea, &a, &x->path, 1024) < 0) goto Err;
  294. *pa = a;
  295. return 0;
  296. Err:
  297. *pa = ea;
  298. return -1;
  299. }
  300. int
  301. nfsMount3EntryUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  302. NfsMount3Entry *x)
  303. {
  304. u1int one;
  305. if(sunUint1Unpack(a, ea, &a, &one) < 0 || one != 1) goto Err;
  306. if(sunStringUnpack(a, ea, &a, &x->host, NfsMount3MaxNameSize) < 0) goto Err;
  307. if(sunStringUnpack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err;
  308. *pa = a;
  309. return 0;
  310. Err:
  311. *pa = ea;
  312. return -1;
  313. }
  314. void
  315. nfsMount3RDumpPrint(Fmt *fmt, NfsMount3RDump *x)
  316. {
  317. USED(x);
  318. fmtprint(fmt, "%s\n", "NfsMount3RDump");
  319. }
  320. uint
  321. nfsMount3RDumpSize(NfsMount3RDump *x)
  322. {
  323. uint a;
  324. USED(x);
  325. a = 0;
  326. a += x->count;
  327. a += 4;
  328. return a;
  329. }
  330. int
  331. nfsMount3RDumpPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3RDump *x)
  332. {
  333. u1int zero;
  334. zero = 0;
  335. if(a+x->count > ea) goto Err;
  336. memmove(a, x->data, x->count);
  337. a += x->count;
  338. if(sunUint1Pack(a, ea, &a, &zero) < 0)
  339. goto Err;
  340. *pa = a;
  341. return 0;
  342. Err:
  343. *pa = ea;
  344. return -1;
  345. }
  346. int
  347. nfsMount3RDumpUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  348. NfsMount3RDump *x)
  349. {
  350. int i;
  351. uint8_t *oa;
  352. u1int u1;
  353. uint32_t u32;
  354. oa = a;
  355. for(i=0;; i++){
  356. if(sunUint1Unpack(a, ea, &a, &u1) < 0)
  357. goto Err;
  358. if(u1 == 0)
  359. break;
  360. if(sunUint32Unpack(a, ea, &a, &u32) < 0
  361. || u32 > NfsMount3MaxNameSize
  362. || (a+=u32) >= ea
  363. || sunUint32Unpack(a, ea, &a, &u32) < 0
  364. || u32 > NfsMount3MaxPathSize
  365. || (a+=u32) >= ea)
  366. goto Err;
  367. }
  368. x->count = (a-4) - oa;
  369. x->data = oa;
  370. *pa = a;
  371. return 0;
  372. Err:
  373. *pa = ea;
  374. return -1;
  375. }
  376. void
  377. nfsMount3TUmntPrint(Fmt *fmt, NfsMount3TUmnt *x)
  378. {
  379. fmtprint(fmt, "%s\n", "NfsMount3TUmnt");
  380. fmtprint(fmt, "\t%s=", "path");
  381. fmtprint(fmt, "\"%s\"", x->path);
  382. fmtprint(fmt, "\n");
  383. }
  384. uint
  385. nfsMount3TUmntSize(NfsMount3TUmnt *x)
  386. {
  387. uint a;
  388. USED(x);
  389. a = 0 + sunStringSize(x->path);
  390. return a;
  391. }
  392. int
  393. nfsMount3TUmntPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3TUmnt *x)
  394. {
  395. if(sunStringPack(a, ea, &a, &x->path, 1024) < 0) goto Err;
  396. *pa = a;
  397. return 0;
  398. Err:
  399. *pa = ea;
  400. return -1;
  401. }
  402. int
  403. nfsMount3TUmntUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  404. NfsMount3TUmnt *x)
  405. {
  406. if(sunStringUnpack(a, ea, &a, &x->path, 1024) < 0) goto Err;
  407. *pa = a;
  408. return 0;
  409. Err:
  410. *pa = ea;
  411. return -1;
  412. }
  413. void
  414. nfsMount3RUmntPrint(Fmt *fmt, NfsMount3RUmnt *x)
  415. {
  416. USED(x);
  417. fmtprint(fmt, "%s\n", "NfsMount3RUmnt");
  418. }
  419. uint
  420. nfsMount3RUmntSize(NfsMount3RUmnt *x)
  421. {
  422. uint a;
  423. USED(x);
  424. a = 0;
  425. return a;
  426. }
  427. int
  428. nfsMount3RUmntPack(uint8_t *a, uint8_t *ea, uint8_t **pa, NfsMount3RUmnt *x)
  429. {
  430. USED(ea);
  431. USED(x);
  432. *pa = a;
  433. return 0;
  434. }
  435. int
  436. nfsMount3RUmntUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  437. NfsMount3RUmnt *x)
  438. {
  439. USED(ea);
  440. USED(x);
  441. *pa = a;
  442. return 0;
  443. }
  444. void
  445. nfsMount3TUmntallPrint(Fmt *fmt, NfsMount3TUmntall *x)
  446. {
  447. USED(x);
  448. fmtprint(fmt, "%s\n", "NfsMount3TUmntall");
  449. }
  450. uint
  451. nfsMount3TUmntallSize(NfsMount3TUmntall *x)
  452. {
  453. uint a;
  454. USED(x);
  455. a = 0;
  456. return a;
  457. }
  458. int
  459. nfsMount3TUmntallPack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  460. NfsMount3TUmntall *x)
  461. {
  462. USED(ea);
  463. USED(x);
  464. *pa = a;
  465. return 0;
  466. }
  467. int
  468. nfsMount3TUmntallUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  469. NfsMount3TUmntall *x)
  470. {
  471. USED(ea);
  472. USED(x);
  473. *pa = a;
  474. return 0;
  475. }
  476. void
  477. nfsMount3RUmntallPrint(Fmt *fmt, NfsMount3RUmntall *x)
  478. {
  479. USED(x);
  480. fmtprint(fmt, "%s\n", "NfsMount3RUmntall");
  481. }
  482. uint
  483. nfsMount3RUmntallSize(NfsMount3RUmntall *x)
  484. {
  485. uint a;
  486. USED(x);
  487. a = 0;
  488. return a;
  489. }
  490. int
  491. nfsMount3RUmntallPack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  492. NfsMount3RUmntall *x)
  493. {
  494. USED(ea);
  495. USED(x);
  496. *pa = a;
  497. return 0;
  498. }
  499. int
  500. nfsMount3RUmntallUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  501. NfsMount3RUmntall *x)
  502. {
  503. USED(ea);
  504. USED(x);
  505. *pa = a;
  506. return 0;
  507. }
  508. void
  509. nfsMount3TExportPrint(Fmt *fmt, NfsMount3TExport *x)
  510. {
  511. USED(x);
  512. fmtprint(fmt, "%s\n", "NfsMount3TExport");
  513. }
  514. uint
  515. nfsMount3TExportSize(NfsMount3TExport *x)
  516. {
  517. uint a;
  518. USED(x);
  519. a = 0;
  520. return a;
  521. }
  522. int
  523. nfsMount3TExportPack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  524. NfsMount3TExport *x)
  525. {
  526. USED(ea);
  527. USED(x);
  528. *pa = a;
  529. return 0;
  530. }
  531. int
  532. nfsMount3TExportUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  533. NfsMount3TExport *x)
  534. {
  535. USED(ea);
  536. USED(x);
  537. *pa = a;
  538. return 0;
  539. }
  540. void
  541. nfsMount3RExportPrint(Fmt *fmt, NfsMount3RExport *x)
  542. {
  543. USED(x);
  544. fmtprint(fmt, "%s\n", "NfsMount3RExport");
  545. fmtprint(fmt, "\n");
  546. }
  547. uint
  548. nfsMount3RExportSize(NfsMount3RExport *x)
  549. {
  550. uint a;
  551. USED(x);
  552. a = 0;
  553. a += x->count;
  554. a += 4; /* end of export list */
  555. return a;
  556. }
  557. int
  558. nfsMount3RExportPack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  559. NfsMount3RExport *x)
  560. {
  561. u1int zero;
  562. zero = 0;
  563. if(a+x->count > ea) goto Err;
  564. memmove(a, x->data, x->count);
  565. a += x->count;
  566. if(sunUint1Pack(a, ea, &a, &zero) < 0)
  567. goto Err;
  568. *pa = a;
  569. return 0;
  570. Err:
  571. *pa = ea;
  572. return -1;
  573. }
  574. int
  575. nfsMount3RExportUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  576. NfsMount3RExport *x)
  577. {
  578. int ng, ne;
  579. uint8_t *oa;
  580. u1int u1;
  581. uint32_t u32;
  582. oa = a;
  583. ng = 0;
  584. for(ne=0;; ne++){
  585. if(sunUint1Unpack(a, ea, &a, &u1) < 0)
  586. goto Err;
  587. if(u1 == 0)
  588. break;
  589. if(sunUint32Unpack(a, ea, &a, &u32) < 0
  590. || (a += (u32+3)&~3) >= ea)
  591. goto Err;
  592. for(;; ng++){
  593. if(sunUint1Unpack(a, ea, &a, &u1) < 0)
  594. goto Err;
  595. if(u1 == 0)
  596. break;
  597. if(sunUint32Unpack(a, ea, &a, &u32) < 0
  598. || (a += (u32+3)&~3) >= ea)
  599. goto Err;
  600. }
  601. }
  602. x->data = oa;
  603. x->count = (a-4) - oa;
  604. *pa = a;
  605. return 0;
  606. Err:
  607. *pa = ea;
  608. return -1;
  609. }
  610. uint
  611. nfsMount3ExportGroupSize(uint8_t *a)
  612. {
  613. int ng;
  614. u1int have;
  615. uint32_t n;
  616. a += 4;
  617. sunUint32Unpack(a, a+4, &a, &n);
  618. a += (n+3)&~3;
  619. ng = 0;
  620. for(;;){
  621. sunUint1Unpack(a, a+4, &a, &have);
  622. if(have == 0)
  623. break;
  624. ng++;
  625. sunUint32Unpack(a, a+4, &a, &n);
  626. a += (n+3)&~3;
  627. }
  628. return ng;
  629. }
  630. int
  631. nfsMount3ExportUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa, char **gp,
  632. char ***pgp, NfsMount3Export *x)
  633. {
  634. int ng;
  635. u1int u1;
  636. if(sunUint1Unpack(a, ea, &a, &u1) < 0 || u1 != 1) goto Err;
  637. if(sunStringUnpack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err;
  638. x->g = gp;
  639. ng = 0;
  640. for(;;){
  641. if(sunUint1Unpack(a, ea, &a, &u1) < 0) goto Err;
  642. if(u1 == 0)
  643. break;
  644. if(sunStringUnpack(a, ea, &a, &gp[ng++], NfsMount3MaxNameSize) < 0) goto Err;
  645. }
  646. x->ng = ng;
  647. *pgp = gp+ng;
  648. *pa = a;
  649. return 0;
  650. Err:
  651. *pa = ea;
  652. return -1;
  653. }
  654. uint
  655. nfsMount3ExportSize(NfsMount3Export *x)
  656. {
  657. int i;
  658. uint a;
  659. a = 4 + sunStringSize(x->path);
  660. for(i=0; i<x->ng; i++)
  661. a += 4 + sunStringSize(x->g[i]);
  662. a += 4;
  663. return a;
  664. }
  665. int
  666. nfsMount3ExportPack(uint8_t *a, uint8_t *ea, uint8_t **pa,
  667. NfsMount3Export *x)
  668. {
  669. int i;
  670. u1int u1;
  671. u1 = 1;
  672. if(sunUint1Pack(a, ea, &a, &u1) < 0) goto Err;
  673. if(sunStringPack(a, ea, &a, &x->path, NfsMount3MaxPathSize) < 0) goto Err;
  674. for(i=0; i<x->ng; i++){
  675. if(sunUint1Pack(a, ea, &a, &u1) < 0) goto Err;
  676. if(sunStringPack(a, ea, &a, &x->g[i], NfsMount3MaxNameSize) < 0) goto Err;
  677. }
  678. u1 = 0;
  679. if(sunUint1Pack(a, ea, &a, &u1) < 0) goto Err;
  680. *pa = a;
  681. return 0;
  682. Err:
  683. *pa = ea;
  684. return -1;
  685. }
  686. typedef int (*P)(uint8_t*, uint8_t*, uint8_t**, SunCall*);
  687. typedef void (*F)(Fmt*, SunCall*);
  688. typedef uint (*S)(SunCall*);
  689. static SunProc proc3[] = {
  690. (P)nfsMount3TNullPack, (P)nfsMount3TNullUnpack, (S)nfsMount3TNullSize, (F)nfsMount3TNullPrint, sizeof(NfsMount3TNull),
  691. (P)nfsMount3RNullPack, (P)nfsMount3RNullUnpack, (S)nfsMount3RNullSize, (F)nfsMount3RNullPrint, sizeof(NfsMount3RNull),
  692. (P)nfsMount3TMntPack, (P)nfsMount3TMntUnpack, (S)nfsMount3TMntSize, (F)nfsMount3TMntPrint, sizeof(NfsMount3TMnt),
  693. (P)nfsMount3RMntPack, (P)nfsMount3RMntUnpack, (S)nfsMount3RMntSize, (F)nfsMount3RMntPrint, sizeof(NfsMount3RMnt),
  694. (P)nfsMount3TDumpPack, (P)nfsMount3TDumpUnpack, (S)nfsMount3TDumpSize, (F)nfsMount3TDumpPrint, sizeof(NfsMount3TDump),
  695. (P)nfsMount3RDumpPack, (P)nfsMount3RDumpUnpack, (S)nfsMount3RDumpSize, (F)nfsMount3RDumpPrint, sizeof(NfsMount3RDump),
  696. (P)nfsMount3TUmntPack, (P)nfsMount3TUmntUnpack, (S)nfsMount3TUmntSize, (F)nfsMount3TUmntPrint, sizeof(NfsMount3TUmnt),
  697. (P)nfsMount3RUmntPack, (P)nfsMount3RUmntUnpack, (S)nfsMount3RUmntSize, (F)nfsMount3RUmntPrint, sizeof(NfsMount3RUmnt),
  698. (P)nfsMount3TUmntallPack, (P)nfsMount3TUmntallUnpack, (S)nfsMount3TUmntallSize, (F)nfsMount3TUmntallPrint, sizeof(NfsMount3TUmntall),
  699. (P)nfsMount3RUmntallPack, (P)nfsMount3RUmntallUnpack, (S)nfsMount3RUmntallSize, (F)nfsMount3RUmntallPrint, sizeof(NfsMount3RUmntall),
  700. (P)nfsMount3TExportPack, (P)nfsMount3TExportUnpack, (S)nfsMount3TExportSize, (F)nfsMount3TExportPrint, sizeof(NfsMount3TExport),
  701. (P)nfsMount3RExportPack, (P)nfsMount3RExportUnpack, (S)nfsMount3RExportSize, (F)nfsMount3RExportPrint, sizeof(NfsMount3RExport),
  702. };
  703. static SunProc proc1[] = {
  704. (P)nfsMount3TNullPack, (P)nfsMount3TNullUnpack, (S)nfsMount3TNullSize, (F)nfsMount3TNullPrint, sizeof(NfsMount3TNull),
  705. (P)nfsMount3RNullPack, (P)nfsMount3RNullUnpack, (S)nfsMount3RNullSize, (F)nfsMount3RNullPrint, sizeof(NfsMount3RNull),
  706. (P)nfsMount3TMntPack, (P)nfsMount3TMntUnpack, (S)nfsMount3TMntSize, (F)nfsMount3TMntPrint, sizeof(NfsMount3TMnt),
  707. (P)nfsMount1RMntPack, (P)nfsMount1RMntUnpack, (S)nfsMount1RMntSize, (F)nfsMount3RMntPrint, sizeof(NfsMount3RMnt),
  708. (P)nfsMount3TDumpPack, (P)nfsMount3TDumpUnpack, (S)nfsMount3TDumpSize, (F)nfsMount3TDumpPrint, sizeof(NfsMount3TDump),
  709. (P)nfsMount3RDumpPack, (P)nfsMount3RDumpUnpack, (S)nfsMount3RDumpSize, (F)nfsMount3RDumpPrint, sizeof(NfsMount3RDump),
  710. (P)nfsMount3TUmntPack, (P)nfsMount3TUmntUnpack, (S)nfsMount3TUmntSize, (F)nfsMount3TUmntPrint, sizeof(NfsMount3TUmnt),
  711. (P)nfsMount3RUmntPack, (P)nfsMount3RUmntUnpack, (S)nfsMount3RUmntSize, (F)nfsMount3RUmntPrint, sizeof(NfsMount3RUmnt),
  712. (P)nfsMount3TUmntallPack, (P)nfsMount3TUmntallUnpack, (S)nfsMount3TUmntallSize, (F)nfsMount3TUmntallPrint, sizeof(NfsMount3TUmntall),
  713. (P)nfsMount3RUmntallPack, (P)nfsMount3RUmntallUnpack, (S)nfsMount3RUmntallSize, (F)nfsMount3RUmntallPrint, sizeof(NfsMount3RUmntall),
  714. (P)nfsMount3TExportPack, (P)nfsMount3TExportUnpack, (S)nfsMount3TExportSize, (F)nfsMount3TExportPrint, sizeof(NfsMount3TExport),
  715. (P)nfsMount3RExportPack, (P)nfsMount3RExportUnpack, (S)nfsMount3RExportSize, (F)nfsMount3RExportPrint, sizeof(NfsMount3RExport),
  716. };
  717. SunProg nfsMount3Prog =
  718. {
  719. NfsMount3Program,
  720. NfsMount3Version,
  721. proc3,
  722. nelem(proc3),
  723. };
  724. SunProg nfsMount1Prog =
  725. {
  726. NfsMount1Program,
  727. NfsMount1Version,
  728. proc1,
  729. nelem(proc1),
  730. };