Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/nfs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
## Resources

- [NFSv3 RFC 1813](./v3/__tests__/rfc1813.txt)
- [NFSv4 RFC 7530](./v4/__tests__/rfc7530.txt)
22 changes: 11 additions & 11 deletions src/nfs/v3/Nfsv3Decoder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export class Nfsv3Decoder {

private readFh(): structs.Nfsv3Fh {
const data = this.xdr.readVarlenOpaque();
return new structs.Nfsv3Fh(new Reader(data));
return new structs.Nfsv3Fh(data);
}

private readFilename(): string {
Expand Down Expand Up @@ -262,13 +262,13 @@ export class Nfsv3Decoder {
const xdr = this.xdr;
const mode = xdr.readUnsignedInt() as Nfsv3CreateMode;
let objAttributes: structs.Nfsv3Sattr | undefined;
let verf: Reader | undefined;
let verf: Uint8Array | undefined;
// tslint:disable-next-line
if (mode === Nfsv3CreateMode.UNCHECKED || mode === Nfsv3CreateMode.GUARDED) {
objAttributes = this.readSattr();
} else if (mode === Nfsv3CreateMode.EXCLUSIVE) {
const verfData = xdr.readOpaque(8);
verf = new Reader(verfData);
verf = verfData;
}
return new structs.Nfsv3CreateHow(mode, objAttributes, verf);
}
Expand Down Expand Up @@ -446,7 +446,7 @@ export class Nfsv3Decoder {
const count = xdr.readUnsignedInt();
const eof = xdr.readBoolean();
const data = xdr.readVarlenOpaque();
resok = new msg.Nfsv3ReadResOk(fileAttributes, count, eof, new Reader(data));
resok = new msg.Nfsv3ReadResOk(fileAttributes, count, eof, data);
} else {
resfail = new msg.Nfsv3ReadResFail(fileAttributes);
}
Expand All @@ -460,7 +460,7 @@ export class Nfsv3Decoder {
const count = xdr.readUnsignedInt();
const stable = xdr.readUnsignedInt();
const data = xdr.readVarlenOpaque();
return new msg.Nfsv3WriteRequest(file, offset, count, stable, new Reader(data));
return new msg.Nfsv3WriteRequest(file, offset, count, stable, data);
}

private decodeWriteResponse(): msg.Nfsv3WriteResponse {
Expand All @@ -473,7 +473,7 @@ export class Nfsv3Decoder {
const count = xdr.readUnsignedInt();
const committed = xdr.readUnsignedInt();
const verf = xdr.readOpaque(8);
resok = new msg.Nfsv3WriteResOk(fileWcc, count, committed, new Reader(verf));
resok = new msg.Nfsv3WriteResOk(fileWcc, count, committed, verf);
} else {
resfail = new msg.Nfsv3WriteResFail(fileWcc);
}
Expand Down Expand Up @@ -651,7 +651,7 @@ export class Nfsv3Decoder {
const cookie = xdr.readUnsignedHyper();
const cookieverf = xdr.readOpaque(8);
const count = xdr.readUnsignedInt();
return new msg.Nfsv3ReaddirRequest(dir, cookie, new Reader(cookieverf), count);
return new msg.Nfsv3ReaddirRequest(dir, cookie, cookieverf, count);
}

private decodeReaddirResponse(): msg.Nfsv3ReaddirResponse {
Expand All @@ -663,7 +663,7 @@ export class Nfsv3Decoder {
if (status === 0) {
const cookieverf = xdr.readOpaque(8);
const reply = this.readDirList();
resok = new msg.Nfsv3ReaddirResOk(dirAttributes, new Reader(cookieverf), reply);
resok = new msg.Nfsv3ReaddirResOk(dirAttributes, cookieverf, reply);
} else {
resfail = new msg.Nfsv3ReaddirResFail(dirAttributes);
}
Expand All @@ -677,7 +677,7 @@ export class Nfsv3Decoder {
const cookieverf = xdr.readOpaque(8);
const dircount = xdr.readUnsignedInt();
const maxcount = xdr.readUnsignedInt();
return new msg.Nfsv3ReaddirplusRequest(dir, cookie, new Reader(cookieverf), dircount, maxcount);
return new msg.Nfsv3ReaddirplusRequest(dir, cookie, cookieverf, dircount, maxcount);
}

private decodeReaddirplusResponse(): msg.Nfsv3ReaddirplusResponse {
Expand All @@ -689,7 +689,7 @@ export class Nfsv3Decoder {
if (status === 0) {
const cookieverf = xdr.readOpaque(8);
const reply = this.readDirListPlus();
resok = new msg.Nfsv3ReaddirplusResOk(dirAttributes, new Reader(cookieverf), reply);
resok = new msg.Nfsv3ReaddirplusResOk(dirAttributes, cookieverf, reply);
} else {
resfail = new msg.Nfsv3ReaddirplusResFail(dirAttributes);
}
Expand Down Expand Up @@ -812,7 +812,7 @@ export class Nfsv3Decoder {
const fileWcc = this.readWccData();
if (status === 0) {
const verf = xdr.readOpaque(8);
resok = new msg.Nfsv3CommitResOk(fileWcc, new Reader(verf));
resok = new msg.Nfsv3CommitResOk(fileWcc, verf);
} else {
resfail = new msg.Nfsv3CommitResFail(fileWcc);
}
Expand Down
30 changes: 10 additions & 20 deletions src/nfs/v3/Nfsv3Encoder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
}

private writeFh(fh: structs.Nfsv3Fh): void {
const data = fh.data.uint8;
this.xdr.writeVarlenOpaque(data);
this.xdr.writeVarlenOpaque(fh.data);
}

private writeFilename(filename: string): void {
Expand Down Expand Up @@ -273,8 +272,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
break;
case Nfsv3CreateMode.EXCLUSIVE:
if (how.verf) {
const verfData = how.verf.uint8;
xdr.writeOpaque(verfData);
xdr.writeOpaque(how.verf);
}
break;
}
Expand Down Expand Up @@ -431,8 +429,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
this.writePostOpAttr(res.resok.fileAttributes);
xdr.writeUnsignedInt(res.resok.count);
xdr.writeBoolean(res.resok.eof);
const data = res.resok.data.uint8;
xdr.writeVarlenOpaque(data);
xdr.writeVarlenOpaque(res.resok.data);
} else if (res.resfail) {
this.writePostOpAttr(res.resfail.fileAttributes);
}
Expand All @@ -444,8 +441,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
xdr.writeUnsignedHyper(req.offset);
xdr.writeUnsignedInt(req.count);
xdr.writeUnsignedInt(req.stable);
const data = req.data.uint8;
xdr.writeVarlenOpaque(data);
xdr.writeVarlenOpaque(req.data);
}

private writeWriteResponse(res: msg.Nfsv3WriteResponse): void {
Expand All @@ -455,8 +451,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
this.writeWccData(res.resok.fileWcc);
xdr.writeUnsignedInt(res.resok.count);
xdr.writeUnsignedInt(res.resok.committed);
const verf = res.resok.verf.uint8;
xdr.writeOpaque(verf);
xdr.writeOpaque(res.resok.verf);
} else if (res.resfail) {
this.writeWccData(res.resfail.fileWcc);
}
Expand Down Expand Up @@ -589,8 +584,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
this.writeFh(req.dir);
const xdr = this.xdr;
xdr.writeUnsignedHyper(req.cookie);
const cookieverf = req.cookieverf.uint8;
xdr.writeOpaque(cookieverf);
xdr.writeOpaque(req.cookieverf);
xdr.writeUnsignedInt(req.count);
}

Expand All @@ -599,8 +593,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.dirAttributes);
const cookieverf = res.resok.cookieverf.uint8;
xdr.writeOpaque(cookieverf);
xdr.writeOpaque(res.resok.cookieverf);
this.writeDirList(res.resok.reply);
} else if (res.resfail) {
this.writePostOpAttr(res.resfail.dirAttributes);
Expand All @@ -611,8 +604,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
this.writeFh(req.dir);
const xdr = this.xdr;
xdr.writeUnsignedHyper(req.cookie);
const cookieverf = req.cookieverf.uint8;
xdr.writeOpaque(cookieverf);
xdr.writeOpaque(req.cookieverf);
xdr.writeUnsignedInt(req.dircount);
xdr.writeUnsignedInt(req.maxcount);
}
Expand All @@ -622,8 +614,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writePostOpAttr(res.resok.dirAttributes);
const cookieverf = res.resok.cookieverf.uint8;
xdr.writeOpaque(cookieverf);
xdr.writeOpaque(res.resok.cookieverf);
this.writeDirListPlus(res.resok.reply);
} else if (res.resfail) {
this.writePostOpAttr(res.resfail.dirAttributes);
Expand Down Expand Up @@ -708,8 +699,7 @@ export class Nfsv3Encoder<W extends IWriter & IWriterGrowable = IWriter & IWrite
xdr.writeUnsignedInt(res.status);
if (res.status === 0 && res.resok) {
this.writeWccData(res.resok.fileWcc);
const verf = res.resok.verf.uint8;
xdr.writeOpaque(verf);
xdr.writeOpaque(res.resok.verf);
} else if (res.resfail) {
this.writeWccData(res.resfail.fileWcc);
}
Expand Down
2 changes: 1 addition & 1 deletion src/nfs/v3/__demos__/tcp-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const HOST = '127.0.0.1';

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

const createTestCred = () => {
Expand Down
16 changes: 8 additions & 8 deletions src/nfs/v3/__tests__/FullNfsv3Encoder.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ describe('FullNfsv3Encoder', () => {

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

const createTestCred = () => {
Expand Down Expand Up @@ -58,7 +58,7 @@ describe('FullNfsv3Encoder', () => {
expect(call.proc).toBe(proc);
const nfsRequest = nfsDecoder.decodeMessage(call.params!, proc, true);
expect(nfsRequest).toBeInstanceOf(msg.Nfsv3GetattrRequest);
expect((nfsRequest as msg.Nfsv3GetattrRequest).object.data.uint8).toEqual(request.object.data.uint8);
expect((nfsRequest as msg.Nfsv3GetattrRequest).object.data).toEqual(request.object.data);
});

test('produces same output as separate encoders', () => {
Expand All @@ -83,7 +83,7 @@ describe('FullNfsv3Encoder', () => {
test('encodes LOOKUP request', () => {
const fullEncoder = new FullNfsv3Encoder();
const fhData = new Uint8Array([1, 2, 3, 4]);
const dirOpArgs = new structs.Nfsv3DirOpArgs(new structs.Nfsv3Fh(new Reader(fhData)), 'test.txt');
const dirOpArgs = new structs.Nfsv3DirOpArgs(new structs.Nfsv3Fh(fhData), 'test.txt');
const request = new msg.Nfsv3LookupRequest(dirOpArgs);
const xid = 54321;
const proc = Nfsv3Proc.LOOKUP;
Expand All @@ -106,7 +106,7 @@ describe('FullNfsv3Encoder', () => {
test('encodes READ request', () => {
const fullEncoder = new FullNfsv3Encoder();
const fhData = new Uint8Array([1, 2, 3, 4]);
const request = new msg.Nfsv3ReadRequest(new structs.Nfsv3Fh(new Reader(fhData)), BigInt(0), 4096);
const request = new msg.Nfsv3ReadRequest(new structs.Nfsv3Fh(fhData), BigInt(0), 4096);
const xid = 99999;
const proc = Nfsv3Proc.READ;
const cred = createTestCred();
Expand Down Expand Up @@ -144,7 +144,7 @@ describe('FullNfsv3Encoder', () => {
test('handles large file handles', () => {
const fullEncoder = new FullNfsv3Encoder();
const fhData = new Uint8Array(64).fill(0xff);
const request = new msg.Nfsv3GetattrRequest(new structs.Nfsv3Fh(new Reader(fhData)));
const request = new msg.Nfsv3GetattrRequest(new structs.Nfsv3Fh(fhData));
const xid = 1;
const proc = Nfsv3Proc.GETATTR;
const cred = createTestCred();
Expand All @@ -156,7 +156,7 @@ describe('FullNfsv3Encoder', () => {
const rpcMessage = rpcDecoder.decodeMessage(rmRecord!);
const call = rpcMessage as RpcCallMessage;
const nfsRequest = nfsDecoder.decodeMessage(call.params!, proc, true) as msg.Nfsv3GetattrRequest;
expect(nfsRequest.object.data.uint8).toEqual(fhData);
expect(nfsRequest.object.data).toEqual(fhData);
});
});

Expand Down Expand Up @@ -205,7 +205,7 @@ describe('FullNfsv3Encoder', () => {
const verf = createTestVerf();
const data = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
const postOpAttr = new structs.Nfsv3PostOpAttr(false);
const resok = new msg.Nfsv3ReadResOk(postOpAttr, data.length, true, new Reader(data));
const resok = new msg.Nfsv3ReadResOk(postOpAttr, data.length, true, data);
const response = new msg.Nfsv3ReadResponse(Nfsv3Stat.NFS3_OK, resok);
const encoded = fullEncoder.encodeAcceptedReply(xid, proc, verf, response);
rmDecoder.push(encoded);
Expand All @@ -219,7 +219,7 @@ describe('FullNfsv3Encoder', () => {
expect(nfsResponse).toBeInstanceOf(msg.Nfsv3ReadResponse);
expect(nfsResponse.status).toBe(Nfsv3Stat.NFS3_OK);
expect(nfsResponse.resok).toBeDefined();
expect(nfsResponse.resok!.data.uint8).toEqual(data);
expect(nfsResponse.resok!.data).toEqual(data);
expect(nfsResponse.resok!.eof).toBe(true);
});

Expand Down
Loading