diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_file_info.c b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_file_info.c index 4d386228..dbb10427 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_file_info.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_file_info.c @@ -191,9 +191,24 @@ void guac_rdpdr_fs_process_set_allocation_info(guac_rdpdr_device* device, void guac_rdpdr_fs_process_set_disposition_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { - /* STUB */ - guac_client_log_error(device->rdpdr->client, - "Unimplemented stub: %s", __func__); + + wStream* output_stream; + + /* Delete file */ + int result = guac_rdp_fs_delete((guac_rdp_fs*) device->data, file_id); + if (result < 0) + output_stream = guac_rdpdr_new_io_completion(device, + completion_id, guac_rdp_fs_get_status(result), 4); + else + output_stream = guac_rdpdr_new_io_completion(device, + completion_id, STATUS_SUCCESS, 4); + + Stream_Write_UINT32(output_stream, length); + + svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); + GUAC_RDP_DEBUG(2, "Sent STATUS_SUCCESS for completion_id=%i", + completion_id); + } void guac_rdpdr_fs_process_set_end_of_file_info(guac_rdpdr_device* device, diff --git a/src/protocols/rdp/rdp_fs.c b/src/protocols/rdp/rdp_fs.c index 6da29209..e8e36e14 100644 --- a/src/protocols/rdp/rdp_fs.c +++ b/src/protocols/rdp/rdp_fs.c @@ -410,6 +410,25 @@ int guac_rdp_fs_rename(guac_rdp_fs* fs, int file_id, } +int guac_rdp_fs_delete(guac_rdp_fs* fs, int file_id) { + + /* Get file */ + guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); + if (file == NULL) { + GUAC_RDP_DEBUG(1, "Delete of bad file_id: %i", file_id); + return GUAC_RDP_FS_EINVAL; + } + + /* Attempt deletion */ + if (unlink(file->real_path)) { + GUAC_RDP_DEBUG(1, "unlink() failed: \"%s\"", file->real_path); + return guac_rdp_fs_get_errorcode(errno); + } + + return 0; + +} + void guac_rdp_fs_close(guac_rdp_fs* fs, int file_id) { guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); diff --git a/src/protocols/rdp/rdp_fs.h b/src/protocols/rdp/rdp_fs.h index 06a1d388..c9990b0e 100644 --- a/src/protocols/rdp/rdp_fs.h +++ b/src/protocols/rdp/rdp_fs.h @@ -341,6 +341,11 @@ int guac_rdp_fs_write(guac_rdp_fs* fs, int file_id, int offset, int guac_rdp_fs_rename(guac_rdp_fs* fs, int file_id, const char* new_path); +/** + * Deletes the gile with the given ID. + */ +int guac_rdp_fs_delete(guac_rdp_fs* fs, int file_id); + /** * Frees the given file ID, allowing future open operations to reuse it. */