private int ReadFile(uint requestId, byte[] handle, ulong offset, int length, byte[] buffer)
{
SFTPPacket packet =
new SFTPPacket(SFTPPacketType.SSH_FXP_READ)
.WriteUInt32(requestId)
.WriteAsString(handle)
.WriteUInt64(offset)
.WriteInt32(length);
int? readLength = null;
_eventHandler.ClearResponseBuffer();
Transmit(packet);
_eventHandler.WaitResponse(
(packetType, dataReader) => {
if (packetType == SFTPPacketType.SSH_FXP_STATUS) {
SFTPClientErrorException exception = SFTPClientErrorException.Create(dataReader);
if (exception.ID == requestId) {
if (exception.Code == SFTPStatusCode.SSH_FX_EOF) {
readLength = 0;
return true; // processed
}
else {
throw exception;
}
}
}
else if (packetType == SFTPPacketType.SSH_FXP_DATA) {
uint id = dataReader.ReadUInt32();
if (id == requestId) {
readLength = dataReader.ReadByteStringInto(buffer);
return true; // processed
}
}
return false; // ignored
},
_protocolTimeout
);
// sanity check
Thread.MemoryBarrier();
if (!readLength.HasValue) {
throw new SFTPClientException("Missing SSH_FXP_DATA");
}
return readLength.Value;
}