blob: 77f4cce829468c996e4b7531335dc521d273909b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "config.h"
#include "channels/rdpdr/rdpdr-messages.h"
#include "channels/rdpdr/rdpdr.h"
#include "fs.h"
#include <guacamole/unicode.h>
#include <winpr/file.h>
#include <winpr/stream.h>
#include <winpr/wtypes.h>
void guac_rdpdr_fs_process_query_volume_info(guac_rdp_common_svc* svc,
guac_rdpdr_device* device, wStream* input_stream, int file_id,
int completion_id) {
wStream* output_stream = guac_rdpdr_new_io_completion(device,
completion_id, STATUS_SUCCESS, 21 + GUAC_FILESYSTEM_LABEL_LENGTH);
guac_client_log(svc->client, GUAC_LOG_DEBUG,
"%s: [file_id=%i]",
__func__, file_id);
Stream_Write_UINT32(output_stream, 17 + GUAC_FILESYSTEM_LABEL_LENGTH);
Stream_Write_UINT64(output_stream, 0); /* VolumeCreationTime */
Stream_Write_UINT32(output_stream, 0); /* VolumeSerialNumber */
Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_LABEL_LENGTH);
Stream_Write_UINT8(output_stream, FALSE); /* SupportsObjects */
/* Reserved field must not be sent */
Stream_Write(output_stream, GUAC_FILESYSTEM_LABEL, GUAC_FILESYSTEM_LABEL_LENGTH);
guac_rdp_common_svc_write(svc, output_stream);
}
void guac_rdpdr_fs_process_query_size_info(guac_rdp_common_svc* svc,
guac_rdpdr_device* device, wStream* input_stream, int file_id,
int completion_id) {
guac_rdp_fs_info info = {0};
guac_rdp_fs_get_info((guac_rdp_fs*) device->data, &info);
wStream* output_stream = guac_rdpdr_new_io_completion(device,
completion_id, STATUS_SUCCESS, 28);
guac_client_log(svc->client, GUAC_LOG_DEBUG,
"%s: [file_id=%i]",
__func__, file_id);
Stream_Write_UINT32(output_stream, 24);
Stream_Write_UINT64(output_stream, info.blocks_total); /* TotalAllocationUnits */
Stream_Write_UINT64(output_stream, info.blocks_available); /* AvailableAllocationUnits */
Stream_Write_UINT32(output_stream, 1); /* SectorsPerAllocationUnit */
Stream_Write_UINT32(output_stream, info.block_size); /* BytesPerSector */
guac_rdp_common_svc_write(svc, output_stream);
}
void guac_rdpdr_fs_process_query_device_info(guac_rdp_common_svc* svc,
guac_rdpdr_device* device, wStream* input_stream, int file_id,
int completion_id) {
wStream* output_stream = guac_rdpdr_new_io_completion(device,
completion_id, STATUS_SUCCESS, 12);
guac_client_log(svc->client, GUAC_LOG_DEBUG,
"%s: [file_id=%i]",
__func__, file_id);
Stream_Write_UINT32(output_stream, 8);
Stream_Write_UINT32(output_stream, FILE_DEVICE_DISK); /* DeviceType */
Stream_Write_UINT32(output_stream, 0); /* Characteristics */
guac_rdp_common_svc_write(svc, output_stream);
}
void guac_rdpdr_fs_process_query_attribute_info(guac_rdp_common_svc* svc,
guac_rdpdr_device* device, wStream* input_stream, int file_id,
int completion_id) {
int name_len = guac_utf8_strlen(device->device_name);
wStream* output_stream = guac_rdpdr_new_io_completion(device,
completion_id, STATUS_SUCCESS, 16 + name_len);
guac_client_log(svc->client, GUAC_LOG_DEBUG,
"%s: [file_id=%i]",
__func__, file_id);
Stream_Write_UINT32(output_stream, 12 + name_len);
Stream_Write_UINT32(output_stream,
FILE_UNICODE_ON_DISK
| FILE_CASE_SENSITIVE_SEARCH
| FILE_CASE_PRESERVED_NAMES); /* FileSystemAttributes */
Stream_Write_UINT32(output_stream, GUAC_RDP_FS_MAX_PATH ); /* MaximumComponentNameLength */
Stream_Write_UINT32(output_stream, name_len);
Stream_Write(output_stream, device->device_name, name_len);
guac_rdp_common_svc_write(svc, output_stream);
}
void guac_rdpdr_fs_process_query_full_size_info(guac_rdp_common_svc* svc,
guac_rdpdr_device* device, wStream* input_stream, int file_id,
int completion_id) {
guac_rdp_fs_info info = {0};
guac_rdp_fs_get_info((guac_rdp_fs*) device->data, &info);
wStream* output_stream = guac_rdpdr_new_io_completion(device,
completion_id, STATUS_SUCCESS, 36);
guac_client_log(svc->client, GUAC_LOG_DEBUG,
"%s: [file_id=%i]",
__func__, file_id);
Stream_Write_UINT32(output_stream, 32);
Stream_Write_UINT64(output_stream, info.blocks_total); /* TotalAllocationUnits */
Stream_Write_UINT64(output_stream, info.blocks_available); /* CallerAvailableAllocationUnits */
Stream_Write_UINT64(output_stream, info.blocks_available); /* ActualAvailableAllocationUnits */
Stream_Write_UINT32(output_stream, 1); /* SectorsPerAllocationUnit */
Stream_Write_UINT32(output_stream, info.block_size); /* BytesPerSector */
guac_rdp_common_svc_write(svc, output_stream);
}