Nfsv3Encoder.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.Nfsv3Encoder = void 0;
  4. const Writer_1 = require("@jsonjoy.com/util/lib/buffers/Writer");
  5. const XdrEncoder_1 = require("../../xdr/XdrEncoder");
  6. const errors_1 = require("./errors");
  7. class Nfsv3Encoder {
  8. constructor(writer = new Writer_1.Writer()) {
  9. this.writer = writer;
  10. this.xdr = new XdrEncoder_1.XdrEncoder(writer);
  11. }
  12. encodeMessage(message, proc, isRequest) {
  13. if (isRequest)
  14. this.writeRequest(message, proc);
  15. else
  16. this.writeResponse(message, proc);
  17. return this.writer.flush();
  18. }
  19. writeMessage(message, proc, isRequest) {
  20. if (isRequest)
  21. this.writeRequest(message, proc);
  22. else
  23. this.writeResponse(message, proc);
  24. }
  25. writeRequest(request, proc) {
  26. switch (proc) {
  27. case 1:
  28. return this.writeGetattrRequest(request);
  29. case 2:
  30. return this.writeSetattrRequest(request);
  31. case 3:
  32. return this.writeLookupRequest(request);
  33. case 4:
  34. return this.writeAccessRequest(request);
  35. case 5:
  36. return this.writeReadlinkRequest(request);
  37. case 6:
  38. return this.writeReadRequest(request);
  39. case 7:
  40. return this.writeWriteRequest(request);
  41. case 8:
  42. return this.writeCreateRequest(request);
  43. case 9:
  44. return this.writeMkdirRequest(request);
  45. case 10:
  46. return this.writeSymlinkRequest(request);
  47. case 11:
  48. return this.writeMknodRequest(request);
  49. case 12:
  50. return this.writeRemoveRequest(request);
  51. case 13:
  52. return this.writeRmdirRequest(request);
  53. case 14:
  54. return this.writeRenameRequest(request);
  55. case 15:
  56. return this.writeLinkRequest(request);
  57. case 16:
  58. return this.writeReaddirRequest(request);
  59. case 17:
  60. return this.writeReaddirplusRequest(request);
  61. case 18:
  62. return this.writeFsstatRequest(request);
  63. case 19:
  64. return this.writeFsinfoRequest(request);
  65. case 20:
  66. return this.writePathconfRequest(request);
  67. case 21:
  68. return this.writeCommitRequest(request);
  69. default:
  70. throw new errors_1.Nfsv3EncodingError(`Unknown procedure: ${proc}`);
  71. }
  72. }
  73. writeResponse(response, proc) {
  74. switch (proc) {
  75. case 1:
  76. return this.writeGetattrResponse(response);
  77. case 2:
  78. return this.writeSetattrResponse(response);
  79. case 3:
  80. return this.writeLookupResponse(response);
  81. case 4:
  82. return this.writeAccessResponse(response);
  83. case 5:
  84. return this.writeReadlinkResponse(response);
  85. case 6:
  86. return this.writeReadResponse(response);
  87. case 7:
  88. return this.writeWriteResponse(response);
  89. case 8:
  90. return this.writeCreateResponse(response);
  91. case 9:
  92. return this.writeMkdirResponse(response);
  93. case 10:
  94. return this.writeSymlinkResponse(response);
  95. case 11:
  96. return this.writeMknodResponse(response);
  97. case 12:
  98. return this.writeRemoveResponse(response);
  99. case 13:
  100. return this.writeRmdirResponse(response);
  101. case 14:
  102. return this.writeRenameResponse(response);
  103. case 15:
  104. return this.writeLinkResponse(response);
  105. case 16:
  106. return this.writeReaddirResponse(response);
  107. case 17:
  108. return this.writeReaddirplusResponse(response);
  109. case 18:
  110. return this.writeFsstatResponse(response);
  111. case 19:
  112. return this.writeFsinfoResponse(response);
  113. case 20:
  114. return this.writePathconfResponse(response);
  115. case 21:
  116. return this.writeCommitResponse(response);
  117. default:
  118. throw new errors_1.Nfsv3EncodingError(`Unknown procedure: ${proc}`);
  119. }
  120. }
  121. writeFh(fh) {
  122. this.xdr.writeVarlenOpaque(fh.data);
  123. }
  124. writeFilename(filename) {
  125. this.xdr.writeStr(filename);
  126. }
  127. writeTime(time) {
  128. const xdr = this.xdr;
  129. xdr.writeUnsignedInt(time.seconds);
  130. xdr.writeUnsignedInt(time.nseconds);
  131. }
  132. writeSpecData(spec) {
  133. const xdr = this.xdr;
  134. xdr.writeUnsignedInt(spec.specdata1);
  135. xdr.writeUnsignedInt(spec.specdata2);
  136. }
  137. writeFattr(attr) {
  138. const xdr = this.xdr;
  139. xdr.writeUnsignedInt(attr.type);
  140. xdr.writeUnsignedInt(attr.mode);
  141. xdr.writeUnsignedInt(attr.nlink);
  142. xdr.writeUnsignedInt(attr.uid);
  143. xdr.writeUnsignedInt(attr.gid);
  144. xdr.writeUnsignedHyper(attr.size);
  145. xdr.writeUnsignedHyper(attr.used);
  146. this.writeSpecData(attr.rdev);
  147. xdr.writeUnsignedHyper(attr.fsid);
  148. xdr.writeUnsignedHyper(attr.fileid);
  149. this.writeTime(attr.atime);
  150. this.writeTime(attr.mtime);
  151. this.writeTime(attr.ctime);
  152. }
  153. writePostOpAttr(attr) {
  154. this.xdr.writeBoolean(attr.attributesFollow);
  155. if (attr.attributesFollow && attr.attributes) {
  156. this.writeFattr(attr.attributes);
  157. }
  158. }
  159. writeWccAttr(attr) {
  160. this.xdr.writeUnsignedHyper(attr.size);
  161. this.writeTime(attr.mtime);
  162. this.writeTime(attr.ctime);
  163. }
  164. writePreOpAttr(attr) {
  165. this.xdr.writeBoolean(attr.attributesFollow);
  166. if (attr.attributesFollow && attr.attributes) {
  167. this.writeWccAttr(attr.attributes);
  168. }
  169. }
  170. writeWccData(wcc) {
  171. this.writePreOpAttr(wcc.before);
  172. this.writePostOpAttr(wcc.after);
  173. }
  174. writePostOpFh(fh) {
  175. this.xdr.writeBoolean(fh.handleFollows);
  176. if (fh.handleFollows && fh.handle) {
  177. this.writeFh(fh.handle);
  178. }
  179. }
  180. writeSetMode(setMode) {
  181. const xdr = this.xdr;
  182. xdr.writeBoolean(setMode.set);
  183. if (setMode.set && setMode.mode !== undefined) {
  184. xdr.writeUnsignedInt(setMode.mode);
  185. }
  186. }
  187. writeSetUid(setUid) {
  188. const xdr = this.xdr;
  189. xdr.writeBoolean(setUid.set);
  190. if (setUid.set && setUid.uid !== undefined) {
  191. xdr.writeUnsignedInt(setUid.uid);
  192. }
  193. }
  194. writeSetGid(setGid) {
  195. const xdr = this.xdr;
  196. xdr.writeBoolean(setGid.set);
  197. if (setGid.set && setGid.gid !== undefined) {
  198. xdr.writeUnsignedInt(setGid.gid);
  199. }
  200. }
  201. writeSetSize(setSize) {
  202. const xdr = this.xdr;
  203. xdr.writeBoolean(setSize.set);
  204. if (setSize.set && setSize.size !== undefined) {
  205. xdr.writeUnsignedHyper(setSize.size);
  206. }
  207. }
  208. writeSetAtime(setAtime) {
  209. this.xdr.writeUnsignedInt(setAtime.how);
  210. if (setAtime.how === 2 && setAtime.atime) {
  211. this.writeTime(setAtime.atime);
  212. }
  213. }
  214. writeSetMtime(setMtime) {
  215. const xdr = this.xdr;
  216. xdr.writeUnsignedInt(setMtime.how);
  217. if (setMtime.how === 2 && setMtime.mtime) {
  218. this.writeTime(setMtime.mtime);
  219. }
  220. }
  221. writeSattr(sattr) {
  222. this.writeSetMode(sattr.mode);
  223. this.writeSetUid(sattr.uid);
  224. this.writeSetGid(sattr.gid);
  225. this.writeSetSize(sattr.size);
  226. this.writeSetAtime(sattr.atime);
  227. this.writeSetMtime(sattr.mtime);
  228. }
  229. writeSattrGuard(guard) {
  230. const xdr = this.xdr;
  231. xdr.writeBoolean(guard.check);
  232. if (guard.check && guard.objCtime) {
  233. this.writeTime(guard.objCtime);
  234. }
  235. }
  236. writeDirOpArgs(args) {
  237. this.writeFh(args.dir);
  238. this.writeFilename(args.name);
  239. }
  240. writeCreateHow(how) {
  241. const xdr = this.xdr;
  242. xdr.writeUnsignedInt(how.mode);
  243. switch (how.mode) {
  244. case 0:
  245. case 1:
  246. if (how.objAttributes) {
  247. this.writeSattr(how.objAttributes);
  248. }
  249. break;
  250. case 2:
  251. if (how.verf) {
  252. xdr.writeOpaque(how.verf);
  253. }
  254. break;
  255. }
  256. }
  257. writeMknodData(data) {
  258. this.xdr.writeUnsignedInt(data.type);
  259. switch (data.type) {
  260. case 4:
  261. if (data.chr) {
  262. this.writeSattr(data.chr.devAttributes);
  263. this.writeSpecData(data.chr.spec);
  264. }
  265. break;
  266. case 3:
  267. if (data.blk) {
  268. this.writeSattr(data.blk.devAttributes);
  269. this.writeSpecData(data.blk.spec);
  270. }
  271. break;
  272. case 6:
  273. if (data.sock) {
  274. this.writeSattr(data.sock);
  275. }
  276. break;
  277. case 7:
  278. if (data.pipe) {
  279. this.writeSattr(data.pipe);
  280. }
  281. break;
  282. }
  283. }
  284. writeEntry(entry) {
  285. const xdr = this.xdr;
  286. if (!entry) {
  287. xdr.writeBoolean(false);
  288. return;
  289. }
  290. xdr.writeBoolean(true);
  291. xdr.writeUnsignedHyper(entry.fileid);
  292. this.writeFilename(entry.name);
  293. xdr.writeUnsignedHyper(entry.cookie);
  294. this.writeEntry(entry.nextentry);
  295. }
  296. writeEntryPlus(entry) {
  297. const xdr = this.xdr;
  298. if (!entry) {
  299. xdr.writeBoolean(false);
  300. return;
  301. }
  302. xdr.writeBoolean(true);
  303. xdr.writeUnsignedHyper(entry.fileid);
  304. this.writeFilename(entry.name);
  305. xdr.writeUnsignedHyper(entry.cookie);
  306. this.writePostOpAttr(entry.nameAttributes);
  307. this.writePostOpFh(entry.nameHandle);
  308. this.writeEntryPlus(entry.nextentry);
  309. }
  310. writeDirList(dirList) {
  311. this.writeEntry(dirList.entries);
  312. this.xdr.writeBoolean(dirList.eof);
  313. }
  314. writeDirListPlus(dirList) {
  315. this.writeEntryPlus(dirList.entries);
  316. this.xdr.writeBoolean(dirList.eof);
  317. }
  318. writeGetattrRequest(req) {
  319. this.writeFh(req.object);
  320. }
  321. writeGetattrResponse(res) {
  322. this.xdr.writeUnsignedInt(res.status);
  323. if (res.status === 0 && res.resok) {
  324. this.writeFattr(res.resok.objAttributes);
  325. }
  326. }
  327. writeSetattrRequest(req) {
  328. this.writeFh(req.object);
  329. this.writeSattr(req.newAttributes);
  330. this.writeSattrGuard(req.guard);
  331. }
  332. writeSetattrResponse(res) {
  333. this.xdr.writeUnsignedInt(res.status);
  334. if (res.status === 0 && res.resok) {
  335. this.writeWccData(res.resok.objWcc);
  336. }
  337. else if (res.resfail) {
  338. this.writeWccData(res.resfail.objWcc);
  339. }
  340. }
  341. writeLookupRequest(req) {
  342. this.writeDirOpArgs(req.what);
  343. }
  344. writeLookupResponse(res) {
  345. this.xdr.writeUnsignedInt(res.status);
  346. if (res.status === 0 && res.resok) {
  347. this.writeFh(res.resok.object);
  348. this.writePostOpAttr(res.resok.objAttributes);
  349. this.writePostOpAttr(res.resok.dirAttributes);
  350. }
  351. else if (res.resfail) {
  352. this.writePostOpAttr(res.resfail.dirAttributes);
  353. }
  354. }
  355. writeAccessRequest(req) {
  356. this.writeFh(req.object);
  357. this.xdr.writeUnsignedInt(req.access);
  358. }
  359. writeAccessResponse(res) {
  360. const xdr = this.xdr;
  361. xdr.writeUnsignedInt(res.status);
  362. if (res.status === 0 && res.resok) {
  363. this.writePostOpAttr(res.resok.objAttributes);
  364. xdr.writeUnsignedInt(res.resok.access);
  365. }
  366. else if (res.resfail) {
  367. this.writePostOpAttr(res.resfail.objAttributes);
  368. }
  369. }
  370. writeReadlinkRequest(req) {
  371. this.writeFh(req.symlink);
  372. }
  373. writeReadlinkResponse(res) {
  374. this.xdr.writeUnsignedInt(res.status);
  375. if (res.status === 0 && res.resok) {
  376. this.writePostOpAttr(res.resok.symlinkAttributes);
  377. this.writeFilename(res.resok.data);
  378. }
  379. else if (res.resfail) {
  380. this.writePostOpAttr(res.resfail.symlinkAttributes);
  381. }
  382. }
  383. writeReadRequest(req) {
  384. this.writeFh(req.file);
  385. const xdr = this.xdr;
  386. xdr.writeUnsignedHyper(req.offset);
  387. xdr.writeUnsignedInt(req.count);
  388. }
  389. writeReadResponse(res) {
  390. const xdr = this.xdr;
  391. xdr.writeUnsignedInt(res.status);
  392. if (res.status === 0 && res.resok) {
  393. this.writePostOpAttr(res.resok.fileAttributes);
  394. xdr.writeUnsignedInt(res.resok.count);
  395. xdr.writeBoolean(res.resok.eof);
  396. xdr.writeVarlenOpaque(res.resok.data);
  397. }
  398. else if (res.resfail) {
  399. this.writePostOpAttr(res.resfail.fileAttributes);
  400. }
  401. }
  402. writeWriteRequest(req) {
  403. this.writeFh(req.file);
  404. const xdr = this.xdr;
  405. xdr.writeUnsignedHyper(req.offset);
  406. xdr.writeUnsignedInt(req.count);
  407. xdr.writeUnsignedInt(req.stable);
  408. xdr.writeVarlenOpaque(req.data);
  409. }
  410. writeWriteResponse(res) {
  411. const xdr = this.xdr;
  412. xdr.writeUnsignedInt(res.status);
  413. if (res.status === 0 && res.resok) {
  414. this.writeWccData(res.resok.fileWcc);
  415. xdr.writeUnsignedInt(res.resok.count);
  416. xdr.writeUnsignedInt(res.resok.committed);
  417. xdr.writeOpaque(res.resok.verf);
  418. }
  419. else if (res.resfail) {
  420. this.writeWccData(res.resfail.fileWcc);
  421. }
  422. }
  423. writeCreateRequest(req) {
  424. this.writeDirOpArgs(req.where);
  425. this.writeCreateHow(req.how);
  426. }
  427. writeCreateResponse(res) {
  428. this.xdr.writeUnsignedInt(res.status);
  429. if (res.status === 0 && res.resok) {
  430. this.writePostOpFh(res.resok.obj);
  431. this.writePostOpAttr(res.resok.objAttributes);
  432. this.writeWccData(res.resok.dirWcc);
  433. }
  434. else if (res.resfail) {
  435. this.writeWccData(res.resfail.dirWcc);
  436. }
  437. }
  438. writeMkdirRequest(req) {
  439. this.writeDirOpArgs(req.where);
  440. this.writeSattr(req.attributes);
  441. }
  442. writeMkdirResponse(res) {
  443. this.xdr.writeUnsignedInt(res.status);
  444. if (res.status === 0 && res.resok) {
  445. this.writePostOpFh(res.resok.obj);
  446. this.writePostOpAttr(res.resok.objAttributes);
  447. this.writeWccData(res.resok.dirWcc);
  448. }
  449. else if (res.resfail) {
  450. this.writeWccData(res.resfail.dirWcc);
  451. }
  452. }
  453. writeSymlinkRequest(req) {
  454. this.writeDirOpArgs(req.where);
  455. this.writeSattr(req.symlinkAttributes);
  456. this.writeFilename(req.symlinkData);
  457. }
  458. writeSymlinkResponse(res) {
  459. this.xdr.writeUnsignedInt(res.status);
  460. if (res.status === 0 && res.resok) {
  461. this.writePostOpFh(res.resok.obj);
  462. this.writePostOpAttr(res.resok.objAttributes);
  463. this.writeWccData(res.resok.dirWcc);
  464. }
  465. else if (res.resfail) {
  466. this.writeWccData(res.resfail.dirWcc);
  467. }
  468. }
  469. writeMknodRequest(req) {
  470. this.writeDirOpArgs(req.where);
  471. this.writeMknodData(req.what);
  472. }
  473. writeMknodResponse(res) {
  474. this.xdr.writeUnsignedInt(res.status);
  475. if (res.status === 0 && res.resok) {
  476. this.writePostOpFh(res.resok.obj);
  477. this.writePostOpAttr(res.resok.objAttributes);
  478. this.writeWccData(res.resok.dirWcc);
  479. }
  480. else if (res.resfail) {
  481. this.writeWccData(res.resfail.dirWcc);
  482. }
  483. }
  484. writeRemoveRequest(req) {
  485. this.writeDirOpArgs(req.object);
  486. }
  487. writeRemoveResponse(res) {
  488. this.xdr.writeUnsignedInt(res.status);
  489. if (res.status === 0 && res.resok) {
  490. this.writeWccData(res.resok.dirWcc);
  491. }
  492. else if (res.resfail) {
  493. this.writeWccData(res.resfail.dirWcc);
  494. }
  495. }
  496. writeRmdirRequest(req) {
  497. this.writeDirOpArgs(req.object);
  498. }
  499. writeRmdirResponse(res) {
  500. this.xdr.writeUnsignedInt(res.status);
  501. if (res.status === 0 && res.resok) {
  502. this.writeWccData(res.resok.dirWcc);
  503. }
  504. else if (res.resfail) {
  505. this.writeWccData(res.resfail.dirWcc);
  506. }
  507. }
  508. writeRenameRequest(req) {
  509. this.writeDirOpArgs(req.from);
  510. this.writeDirOpArgs(req.to);
  511. }
  512. writeRenameResponse(res) {
  513. this.xdr.writeUnsignedInt(res.status);
  514. if (res.status === 0 && res.resok) {
  515. this.writeWccData(res.resok.fromDirWcc);
  516. this.writeWccData(res.resok.toDirWcc);
  517. }
  518. else if (res.resfail) {
  519. this.writeWccData(res.resfail.fromDirWcc);
  520. this.writeWccData(res.resfail.toDirWcc);
  521. }
  522. }
  523. writeLinkRequest(req) {
  524. this.writeFh(req.file);
  525. this.writeDirOpArgs(req.link);
  526. }
  527. writeLinkResponse(res) {
  528. this.xdr.writeUnsignedInt(res.status);
  529. if (res.status === 0 && res.resok) {
  530. this.writePostOpAttr(res.resok.fileAttributes);
  531. this.writeWccData(res.resok.linkDirWcc);
  532. }
  533. else if (res.resfail) {
  534. this.writePostOpAttr(res.resfail.fileAttributes);
  535. this.writeWccData(res.resfail.linkDirWcc);
  536. }
  537. }
  538. writeReaddirRequest(req) {
  539. this.writeFh(req.dir);
  540. const xdr = this.xdr;
  541. xdr.writeUnsignedHyper(req.cookie);
  542. xdr.writeOpaque(req.cookieverf);
  543. xdr.writeUnsignedInt(req.count);
  544. }
  545. writeReaddirResponse(res) {
  546. const xdr = this.xdr;
  547. xdr.writeUnsignedInt(res.status);
  548. if (res.status === 0 && res.resok) {
  549. this.writePostOpAttr(res.resok.dirAttributes);
  550. xdr.writeOpaque(res.resok.cookieverf);
  551. this.writeDirList(res.resok.reply);
  552. }
  553. else if (res.resfail) {
  554. this.writePostOpAttr(res.resfail.dirAttributes);
  555. }
  556. }
  557. writeReaddirplusRequest(req) {
  558. this.writeFh(req.dir);
  559. const xdr = this.xdr;
  560. xdr.writeUnsignedHyper(req.cookie);
  561. xdr.writeOpaque(req.cookieverf);
  562. xdr.writeUnsignedInt(req.dircount);
  563. xdr.writeUnsignedInt(req.maxcount);
  564. }
  565. writeReaddirplusResponse(res) {
  566. const xdr = this.xdr;
  567. xdr.writeUnsignedInt(res.status);
  568. if (res.status === 0 && res.resok) {
  569. this.writePostOpAttr(res.resok.dirAttributes);
  570. xdr.writeOpaque(res.resok.cookieverf);
  571. this.writeDirListPlus(res.resok.reply);
  572. }
  573. else if (res.resfail) {
  574. this.writePostOpAttr(res.resfail.dirAttributes);
  575. }
  576. }
  577. writeFsstatRequest(req) {
  578. this.writeFh(req.fsroot);
  579. }
  580. writeFsstatResponse(res) {
  581. const xdr = this.xdr;
  582. xdr.writeUnsignedInt(res.status);
  583. if (res.status === 0 && res.resok) {
  584. this.writePostOpAttr(res.resok.objAttributes);
  585. xdr.writeUnsignedHyper(res.resok.tbytes);
  586. xdr.writeUnsignedHyper(res.resok.fbytes);
  587. xdr.writeUnsignedHyper(res.resok.abytes);
  588. xdr.writeUnsignedHyper(res.resok.tfiles);
  589. xdr.writeUnsignedHyper(res.resok.ffiles);
  590. xdr.writeUnsignedHyper(res.resok.afiles);
  591. xdr.writeUnsignedInt(res.resok.invarsec);
  592. }
  593. else if (res.resfail) {
  594. this.writePostOpAttr(res.resfail.objAttributes);
  595. }
  596. }
  597. writeFsinfoRequest(req) {
  598. this.writeFh(req.fsroot);
  599. }
  600. writeFsinfoResponse(res) {
  601. const xdr = this.xdr;
  602. xdr.writeUnsignedInt(res.status);
  603. if (res.status === 0 && res.resok) {
  604. this.writePostOpAttr(res.resok.objAttributes);
  605. xdr.writeUnsignedInt(res.resok.rtmax);
  606. xdr.writeUnsignedInt(res.resok.rtpref);
  607. xdr.writeUnsignedInt(res.resok.rtmult);
  608. xdr.writeUnsignedInt(res.resok.wtmax);
  609. xdr.writeUnsignedInt(res.resok.wtpref);
  610. xdr.writeUnsignedInt(res.resok.wtmult);
  611. xdr.writeUnsignedInt(res.resok.dtpref);
  612. xdr.writeUnsignedHyper(res.resok.maxfilesize);
  613. xdr.writeUnsignedInt(res.resok.timeDelta.seconds);
  614. xdr.writeUnsignedInt(res.resok.timeDelta.nseconds);
  615. xdr.writeUnsignedInt(res.resok.properties);
  616. }
  617. else if (res.resfail) {
  618. this.writePostOpAttr(res.resfail.objAttributes);
  619. }
  620. }
  621. writePathconfRequest(req) {
  622. this.writeFh(req.object);
  623. }
  624. writePathconfResponse(res) {
  625. const xdr = this.xdr;
  626. xdr.writeUnsignedInt(res.status);
  627. if (res.status === 0 && res.resok) {
  628. this.writePostOpAttr(res.resok.objAttributes);
  629. xdr.writeUnsignedInt(res.resok.linkmax);
  630. xdr.writeUnsignedInt(res.resok.namemax);
  631. xdr.writeBoolean(res.resok.noTrunc);
  632. xdr.writeBoolean(res.resok.chownRestricted);
  633. xdr.writeBoolean(res.resok.caseInsensitive);
  634. xdr.writeBoolean(res.resok.casePreserving);
  635. }
  636. else if (res.resfail) {
  637. this.writePostOpAttr(res.resfail.objAttributes);
  638. }
  639. }
  640. writeCommitRequest(req) {
  641. this.writeFh(req.file);
  642. const xdr = this.xdr;
  643. xdr.writeUnsignedHyper(req.offset);
  644. xdr.writeUnsignedInt(req.count);
  645. }
  646. writeCommitResponse(res) {
  647. const xdr = this.xdr;
  648. xdr.writeUnsignedInt(res.status);
  649. if (res.status === 0 && res.resok) {
  650. this.writeWccData(res.resok.fileWcc);
  651. xdr.writeOpaque(res.resok.verf);
  652. }
  653. else if (res.resfail) {
  654. this.writeWccData(res.resfail.fileWcc);
  655. }
  656. }
  657. }
  658. exports.Nfsv3Encoder = Nfsv3Encoder;
  659. //# sourceMappingURL=Nfsv3Encoder.js.map