Implement read.
This commit is contained in:
parent
3217b97f26
commit
65c5ed379e
@ -127,8 +127,70 @@ void guac_rdpdr_fs_process_create(guac_rdpdr_device* device,
|
|||||||
|
|
||||||
void guac_rdpdr_fs_process_read(guac_rdpdr_device* device,
|
void guac_rdpdr_fs_process_read(guac_rdpdr_device* device,
|
||||||
wStream* input_stream, int file_id, int completion_id) {
|
wStream* input_stream, int file_id, int completion_id) {
|
||||||
/* STUB */
|
|
||||||
guac_client_log_error(device->rdpdr->client, "read: %i", file_id);
|
UINT32 length;
|
||||||
|
UINT64 offset;
|
||||||
|
wStream* output_stream;
|
||||||
|
guac_rdpdr_fs_file* file;
|
||||||
|
|
||||||
|
/* Get file */
|
||||||
|
file = guac_rdpdr_fs_get_file(device, file_id);
|
||||||
|
if (file == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Read packet */
|
||||||
|
Stream_Read_UINT32(input_stream, length);
|
||||||
|
Stream_Read_UINT64(input_stream, offset);
|
||||||
|
|
||||||
|
output_stream = Stream_New(NULL, 21);
|
||||||
|
|
||||||
|
/* Write header */
|
||||||
|
Stream_Write_UINT16(output_stream, RDPDR_CTYP_CORE);
|
||||||
|
Stream_Write_UINT16(output_stream, PAKID_CORE_DEVICE_IOCOMPLETION);
|
||||||
|
|
||||||
|
/* Write content */
|
||||||
|
Stream_Write_UINT32(output_stream, device->device_id);
|
||||||
|
Stream_Write_UINT32(output_stream, completion_id);
|
||||||
|
|
||||||
|
/* If file is a directory, fail */
|
||||||
|
if (file->attributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
|
guac_client_log_info(device->rdpdr->client,
|
||||||
|
"Attempt to read directory as a file");
|
||||||
|
Stream_Write_UINT32(output_stream, STATUS_FILE_IS_A_DIRECTORY);
|
||||||
|
Stream_Write_UINT32(output_stream, 0); /* Length */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, perform read */
|
||||||
|
else {
|
||||||
|
|
||||||
|
char buffer[4096];
|
||||||
|
int bytes_read;
|
||||||
|
|
||||||
|
/* Read no more than size of buffer */
|
||||||
|
if (length > sizeof(buffer))
|
||||||
|
length = sizeof(buffer);
|
||||||
|
|
||||||
|
/* Attempt read */
|
||||||
|
lseek(file->fd, offset, SEEK_SET);
|
||||||
|
bytes_read = read(file->fd, buffer, length);
|
||||||
|
|
||||||
|
/* If error, return invalid parameter */
|
||||||
|
if (bytes_read < 0) {
|
||||||
|
Stream_Write_UINT32(output_stream, STATUS_INVALID_PARAMETER);
|
||||||
|
Stream_Write_UINT32(output_stream, 0); /* Length */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, send bytes read */
|
||||||
|
else {
|
||||||
|
Stream_Write_UINT32(output_stream, STATUS_SUCCESS);
|
||||||
|
Stream_Write_UINT32(output_stream, bytes_read); /* Length */
|
||||||
|
Stream_Write(output_stream, buffer, bytes_read); /* ReadData */
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void guac_rdpdr_fs_process_write(guac_rdpdr_device* device,
|
void guac_rdpdr_fs_process_write(guac_rdpdr_device* device,
|
||||||
|
Loading…
Reference in New Issue
Block a user