Skip to content

Commit 0ab7527

Browse files
authored
Merge pull request #62 from jsonjoy-com/nfs-v4
NFS v4
2 parents 36166e7 + d983335 commit 0ab7527

27 files changed

+25472
-85
lines changed

src/nfs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
## Resources
44

55
- [NFSv3 RFC 1813](./v3/__tests__/rfc1813.txt)
6+
- [NFSv4 RFC 7530](./v4/__tests__/rfc7530.txt)

src/nfs/v3/Nfsv3Decoder.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ export class Nfsv3Decoder {
130130

131131
private readFh(): structs.Nfsv3Fh {
132132
const data = this.xdr.readVarlenOpaque();
133-
return new structs.Nfsv3Fh(new Reader(data));
133+
return new structs.Nfsv3Fh(data);
134134
}
135135

136136
private readFilename(): string {
@@ -262,13 +262,13 @@ export class Nfsv3Decoder {
262262
const xdr = this.xdr;
263263
const mode = xdr.readUnsignedInt() as Nfsv3CreateMode;
264264
let objAttributes: structs.Nfsv3Sattr | undefined;
265-
let verf: Reader | undefined;
265+
let verf: Uint8Array | undefined;
266266
// tslint:disable-next-line
267267
if (mode === Nfsv3CreateMode.UNCHECKED || mode === Nfsv3CreateMode.GUARDED) {
268268
objAttributes = this.readSattr();
269269
} else if (mode === Nfsv3CreateMode.EXCLUSIVE) {
270270
const verfData = xdr.readOpaque(8);
271-
verf = new Reader(verfData);
271+
verf = verfData;
272272
}
273273
return new structs.Nfsv3CreateHow(mode, objAttributes, verf);
274274
}
@@ -446,7 +446,7 @@ export class Nfsv3Decoder {
446446
const count = xdr.readUnsignedInt();
447447
const eof = xdr.readBoolean();
448448
const data = xdr.readVarlenOpaque();
449-
resok = new msg.Nfsv3ReadResOk(fileAttributes, count, eof, new Reader(data));
449+
resok = new msg.Nfsv3ReadResOk(fileAttributes, count, eof, data);
450450
} else {
451451
resfail = new msg.Nfsv3ReadResFail(fileAttributes);
452452
}
@@ -460,7 +460,7 @@ export class Nfsv3Decoder {
460460
const count = xdr.readUnsignedInt();
461461
const stable = xdr.readUnsignedInt();
462462
const data = xdr.readVarlenOpaque();
463-
return new msg.Nfsv3WriteRequest(file, offset, count, stable, new Reader(data));
463+
return new msg.Nfsv3WriteRequest(file, offset, count, stable, data);
464464
}
465465

466466
private decodeWriteResponse(): msg.Nfsv3WriteResponse {
@@ -473,7 +473,7 @@ export class Nfsv3Decoder {
473473
const count = xdr.readUnsignedInt();
474474
const committed = xdr.readUnsignedInt();
475475
const verf = xdr.readOpaque(8);
476-
resok = new msg.Nfsv3WriteResOk(fileWcc, count, committed, new Reader(verf));
476+
resok = new msg.Nfsv3WriteResOk(fileWcc, count, committed, verf);
477477
} else {
478478
resfail = new msg.Nfsv3WriteResFail(fileWcc);
479479
}
@@ -651,7 +651,7 @@ export class Nfsv3Decoder {
651651
const cookie = xdr.readUnsignedHyper();
652652
const cookieverf = xdr.readOpaque(8);
653653
const count = xdr.readUnsignedInt();
654-
return new msg.Nfsv3ReaddirRequest(dir, cookie, new Reader(cookieverf), count);
654+
return new msg.Nfsv3ReaddirRequest(dir, cookie, cookieverf, count);
655655
}
656656

657657
private decodeReaddirResponse(): msg.Nfsv3ReaddirResponse {
@@ -663,7 +663,7 @@ export class Nfsv3Decoder {
663663
if (status === 0) {
664664
const cookieverf = xdr.readOpaque(8);
665665
const reply = this.readDirList();
666-
resok = new msg.Nfsv3ReaddirResOk(dirAttributes, new Reader(cookieverf), reply);
666+
resok = new msg.Nfsv3ReaddirResOk(dirAttributes, cookieverf, reply);
667667
} else {
668668
resfail = new msg.Nfsv3ReaddirResFail(dirAttributes);
669669
}
@@ -677,7 +677,7 @@ export class Nfsv3Decoder {
677677
const cookieverf = xdr.readOpaque(8);
678678
const dircount = xdr.readUnsignedInt();
679679
const maxcount = xdr.readUnsignedInt();
680-
return new msg.Nfsv3ReaddirplusRequest(dir, cookie, new Reader(cookieverf), dircount, maxcount);
680+
return new msg.Nfsv3ReaddirplusRequest(dir, cookie, cookieverf, dircount, maxcount);
681681
}
682682

683683
private decodeReaddirplusResponse(): msg.Nfsv3ReaddirplusResponse {
@@ -689,7 +689,7 @@ export class Nfsv3Decoder {
689689
if (status === 0) {
690690
const cookieverf = xdr.readOpaque(8);
691691
const reply = this.readDirListPlus();
692-
resok = new msg.Nfsv3ReaddirplusResOk(dirAttributes, new Reader(cookieverf), reply);
692+
resok = new msg.Nfsv3ReaddirplusResOk(dirAttributes, cookieverf, reply);
693693
} else {
694694
resfail = new msg.Nfsv3ReaddirplusResFail(dirAttributes);
695695
}
@@ -812,7 +812,7 @@ export class Nfsv3Decoder {
812812
const fileWcc = this.readWccData();
813813
if (status === 0) {
814814
const verf = xdr.readOpaque(8);
815-
resok = new msg.Nfsv3CommitResOk(fileWcc, new Reader(verf));
815+
resok = new msg.Nfsv3CommitResOk(fileWcc, verf);
816816
} else {
817817
resfail = new msg.Nfsv3CommitResFail(fileWcc);
818818
}

src/nfs/v3/Nfsv3Encoder.ts

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
123123
}
124124

125125
private writeFh(fh: structs.Nfsv3Fh): void {
126-
const data = fh.data.uint8;
127-
this.xdr.writeVarlenOpaque(data);
126+
this.xdr.writeVarlenOpaque(fh.data);
128127
}
129128

130129
private writeFilename(filename: string): void {
@@ -273,8 +272,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
273272
break;
274273
case Nfsv3CreateMode.EXCLUSIVE:
275274
if (how.verf) {
276-
const verfData = how.verf.uint8;
277-
xdr.writeOpaque(verfData);
275+
xdr.writeOpaque(how.verf);
278276
}
279277
break;
280278
}
@@ -431,8 +429,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
431429
this.writePostOpAttr(res.resok.fileAttributes);
432430
xdr.writeUnsignedInt(res.resok.count);
433431
xdr.writeBoolean(res.resok.eof);
434-
const data = res.resok.data.uint8;
435-
xdr.writeVarlenOpaque(data);
432+
xdr.writeVarlenOpaque(res.resok.data);
436433
} else if (res.resfail) {
437434
this.writePostOpAttr(res.resfail.fileAttributes);
438435
}
@@ -444,8 +441,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
444441
xdr.writeUnsignedHyper(req.offset);
445442
xdr.writeUnsignedInt(req.count);
446443
xdr.writeUnsignedInt(req.stable);
447-
const data = req.data.uint8;
448-
xdr.writeVarlenOpaque(data);
444+
xdr.writeVarlenOpaque(req.data);
449445
}
450446

451447
private writeWriteResponse(res: msg.Nfsv3WriteResponse): void {
@@ -455,8 +451,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
455451
this.writeWccData(res.resok.fileWcc);
456452
xdr.writeUnsignedInt(res.resok.count);
457453
xdr.writeUnsignedInt(res.resok.committed);
458-
const verf = res.resok.verf.uint8;
459-
xdr.writeOpaque(verf);
454+
xdr.writeOpaque(res.resok.verf);
460455
} else if (res.resfail) {
461456
this.writeWccData(res.resfail.fileWcc);
462457
}
@@ -589,8 +584,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
589584
this.writeFh(req.dir);
590585
const xdr = this.xdr;
591586
xdr.writeUnsignedHyper(req.cookie);
592-
const cookieverf = req.cookieverf.uint8;
593-
xdr.writeOpaque(cookieverf);
587+
xdr.writeOpaque(req.cookieverf);
594588
xdr.writeUnsignedInt(req.count);
595589
}
596590

@@ -599,8 +593,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
599593
xdr.writeUnsignedInt(res.status);
600594
if (res.status === 0 && res.resok) {
601595
this.writePostOpAttr(res.resok.dirAttributes);
602-
const cookieverf = res.resok.cookieverf.uint8;
603-
xdr.writeOpaque(cookieverf);
596+
xdr.writeOpaque(res.resok.cookieverf);
604597
this.writeDirList(res.resok.reply);
605598
} else if (res.resfail) {
606599
this.writePostOpAttr(res.resfail.dirAttributes);
@@ -611,8 +604,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
611604
this.writeFh(req.dir);
612605
const xdr = this.xdr;
613606
xdr.writeUnsignedHyper(req.cookie);
614-
const cookieverf = req.cookieverf.uint8;
615-
xdr.writeOpaque(cookieverf);
607+
xdr.writeOpaque(req.cookieverf);
616608
xdr.writeUnsignedInt(req.dircount);
617609
xdr.writeUnsignedInt(req.maxcount);
618610
}
@@ -622,8 +614,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
622614
xdr.writeUnsignedInt(res.status);
623615
if (res.status === 0 && res.resok) {
624616
this.writePostOpAttr(res.resok.dirAttributes);
625-
const cookieverf = res.resok.cookieverf.uint8;
626-
xdr.writeOpaque(cookieverf);
617+
xdr.writeOpaque(res.resok.cookieverf);
627618
this.writeDirListPlus(res.resok.reply);
628619
} else if (res.resfail) {
629620
this.writePostOpAttr(res.resfail.dirAttributes);
@@ -708,8 +699,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
708699
xdr.writeUnsignedInt(res.status);
709700
if (res.status === 0 && res.resok) {
710701
this.writeWccData(res.resok.fileWcc);
711-
const verf = res.resok.verf.uint8;
712-
xdr.writeOpaque(verf);
702+
xdr.writeOpaque(res.resok.verf);
713703
} else if (res.resfail) {
714704
this.writeWccData(res.resfail.fileWcc);
715705
}

src/nfs/v3/__demos__/tcp-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const HOST = '127.0.0.1';
1212

1313
const createTestRequest = (): Nfsv3GetattrRequest => {
1414
const fhData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
15-
return new Nfsv3GetattrRequest(new Nfsv3Fh(new Reader(fhData)));
15+
return new Nfsv3GetattrRequest(new Nfsv3Fh(fhData));
1616
};
1717

1818
const createTestCred = () => {

src/nfs/v3/__tests__/FullNfsv3Encoder.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe('FullNfsv3Encoder', () => {
2222

2323
const createTestRequest = (): msg.Nfsv3GetattrRequest => {
2424
const fhData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
25-
return new msg.Nfsv3GetattrRequest(new structs.Nfsv3Fh(new Reader(fhData)));
25+
return new msg.Nfsv3GetattrRequest(new structs.Nfsv3Fh(fhData));
2626
};
2727

2828
const createTestCred = () => {
@@ -58,7 +58,7 @@ describe('FullNfsv3Encoder', () => {
5858
expect(call.proc).toBe(proc);
5959
const nfsRequest = nfsDecoder.decodeMessage(call.params!, proc, true);
6060
expect(nfsRequest).toBeInstanceOf(msg.Nfsv3GetattrRequest);
61-
expect((nfsRequest as msg.Nfsv3GetattrRequest).object.data.uint8).toEqual(request.object.data.uint8);
61+
expect((nfsRequest as msg.Nfsv3GetattrRequest).object.data).toEqual(request.object.data);
6262
});
6363

6464
test('produces same output as separate encoders', () => {
@@ -83,7 +83,7 @@ describe('FullNfsv3Encoder', () => {
8383
test('encodes LOOKUP request', () => {
8484
const fullEncoder = new FullNfsv3Encoder();
8585
const fhData = new Uint8Array([1, 2, 3, 4]);
86-
const dirOpArgs = new structs.Nfsv3DirOpArgs(new structs.Nfsv3Fh(new Reader(fhData)), 'test.txt');
86+
const dirOpArgs = new structs.Nfsv3DirOpArgs(new structs.Nfsv3Fh(fhData), 'test.txt');
8787
const request = new msg.Nfsv3LookupRequest(dirOpArgs);
8888
const xid = 54321;
8989
const proc = Nfsv3Proc.LOOKUP;
@@ -106,7 +106,7 @@ describe('FullNfsv3Encoder', () => {
106106
test('encodes READ request', () => {
107107
const fullEncoder = new FullNfsv3Encoder();
108108
const fhData = new Uint8Array([1, 2, 3, 4]);
109-
const request = new msg.Nfsv3ReadRequest(new structs.Nfsv3Fh(new Reader(fhData)), BigInt(0), 4096);
109+
const request = new msg.Nfsv3ReadRequest(new structs.Nfsv3Fh(fhData), BigInt(0), 4096);
110110
const xid = 99999;
111111
const proc = Nfsv3Proc.READ;
112112
const cred = createTestCred();
@@ -144,7 +144,7 @@ describe('FullNfsv3Encoder', () => {
144144
test('handles large file handles', () => {
145145
const fullEncoder = new FullNfsv3Encoder();
146146
const fhData = new Uint8Array(64).fill(0xff);
147-
const request = new msg.Nfsv3GetattrRequest(new structs.Nfsv3Fh(new Reader(fhData)));
147+
const request = new msg.Nfsv3GetattrRequest(new structs.Nfsv3Fh(fhData));
148148
const xid = 1;
149149
const proc = Nfsv3Proc.GETATTR;
150150
const cred = createTestCred();
@@ -156,7 +156,7 @@ describe('FullNfsv3Encoder', () => {
156156
const rpcMessage = rpcDecoder.decodeMessage(rmRecord!);
157157
const call = rpcMessage as RpcCallMessage;
158158
const nfsRequest = nfsDecoder.decodeMessage(call.params!, proc, true) as msg.Nfsv3GetattrRequest;
159-
expect(nfsRequest.object.data.uint8).toEqual(fhData);
159+
expect(nfsRequest.object.data).toEqual(fhData);
160160
});
161161
});
162162

@@ -205,7 +205,7 @@ describe('FullNfsv3Encoder', () => {
205205
const verf = createTestVerf();
206206
const data = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
207207
const postOpAttr = new structs.Nfsv3PostOpAttr(false);
208-
const resok = new msg.Nfsv3ReadResOk(postOpAttr, data.length, true, new Reader(data));
208+
const resok = new msg.Nfsv3ReadResOk(postOpAttr, data.length, true, data);
209209
const response = new msg.Nfsv3ReadResponse(Nfsv3Stat.NFS3_OK, resok);
210210
const encoded = fullEncoder.encodeAcceptedReply(xid, proc, verf, response);
211211
rmDecoder.push(encoded);
@@ -219,7 +219,7 @@ describe('FullNfsv3Encoder', () => {
219219
expect(nfsResponse).toBeInstanceOf(msg.Nfsv3ReadResponse);
220220
expect(nfsResponse.status).toBe(Nfsv3Stat.NFS3_OK);
221221
expect(nfsResponse.resok).toBeDefined();
222-
expect(nfsResponse.resok!.data.uint8).toEqual(data);
222+
expect(nfsResponse.resok!.data).toEqual(data);
223223
expect(nfsResponse.resok!.eof).toBe(true);
224224
});
225225

0 commit comments

Comments
 (0)