int guac_rdp_upload_blob_handler(guac_client* client, guac_stream* stream, void* data, int length) { int bytes_written; guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; /* Get filesystem, return error if no filesystem 0*/ guac_rdp_fs* fs = ((rdp_guac_client_data*) client->data)->filesystem; if (fs == NULL) { guac_protocol_send_ack(client->socket, stream, "FAIL (NO FS)", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); return 0; } /* Write entire block */ while (length > 0) { /* Attempt write */ bytes_written = guac_rdp_fs_write(fs, rdp_stream->upload_status.file_id, rdp_stream->upload_status.offset, data, length); /* On error, abort */ if (bytes_written < 0) { guac_protocol_send_ack(client->socket, stream, "FAIL (BAD WRITE)", GUAC_PROTOCOL_STATUS_CLIENT_FORBIDDEN); guac_socket_flush(client->socket); return 0; } /* Update counters */ rdp_stream->upload_status.offset += bytes_written; data += bytes_written; length -= bytes_written; } guac_protocol_send_ack(client->socket, stream, "OK (DATA RECEIVED)", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); return 0; }
void guac_rdpdr_fs_process_write(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { UINT32 length; UINT64 offset; int bytes_written; wStream* output_stream; /* Read packet */ Stream_Read_UINT32(input_stream, length); Stream_Read_UINT64(input_stream, offset); Stream_Seek(input_stream, 20); /* Padding */ guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] length=%i, offset=%" PRIu64, __func__, file_id, length, (uint64_t) offset); /* Attempt write */ bytes_written = guac_rdp_fs_write((guac_rdp_fs*) device->data, file_id, offset, Stream_Pointer(input_stream), length); /* If error, return invalid parameter */ if (bytes_written < 0) { output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(bytes_written), 5); Stream_Write_UINT32(output_stream, 0); /* Length */ Stream_Write_UINT8(output_stream, 0); /* Padding */ } /* Otherwise, send success */ else { output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 5); Stream_Write_UINT32(output_stream, bytes_written); /* Length */ Stream_Write_UINT8(output_stream, 0); /* Padding */ } svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }