Move to attributes rather than type.
This commit is contained in:
parent
32fdcdc660
commit
439cd7c903
@ -115,6 +115,7 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, const char* path,
|
|||||||
guac_rdpdr_fs_data* data = (guac_rdpdr_fs_data*) device->data;
|
guac_rdpdr_fs_data* data = (guac_rdpdr_fs_data*) device->data;
|
||||||
char real_path[GUAC_RDPDR_FS_MAX_PATH];
|
char real_path[GUAC_RDPDR_FS_MAX_PATH];
|
||||||
char normalized_path[GUAC_RDPDR_FS_MAX_PATH];
|
char normalized_path[GUAC_RDPDR_FS_MAX_PATH];
|
||||||
|
char* filename;
|
||||||
|
|
||||||
struct stat file_stat;
|
struct stat file_stat;
|
||||||
int fd;
|
int fd;
|
||||||
@ -193,14 +194,17 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, const char* path,
|
|||||||
/* Translate normalized path to real path */
|
/* Translate normalized path to real path */
|
||||||
__guac_rdpdr_fs_translate_path(device, normalized_path, real_path);
|
__guac_rdpdr_fs_translate_path(device, normalized_path, real_path);
|
||||||
|
|
||||||
guac_client_log_info(device->rdpdr->client,
|
|
||||||
"Path virtual=\"%s\" -> normalized=\"%s\", real=\"%s\"",
|
|
||||||
path, normalized_path, real_path);
|
|
||||||
|
|
||||||
/* Open file */
|
/* Open file */
|
||||||
fd = open(real_path, flags, mode);
|
fd = open(real_path, flags, mode);
|
||||||
if (fd == -1)
|
if (fd == -1) {
|
||||||
|
guac_client_log_error(device->rdpdr->client,
|
||||||
|
"Open of real file failed: \"%s\"", real_path);
|
||||||
return GUAC_RDPDR_FS_ENOENT;
|
return GUAC_RDPDR_FS_ENOENT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
guac_client_log_info(device->rdpdr->client,
|
||||||
|
"Opened real file: \"%s\"", real_path);
|
||||||
|
|
||||||
|
|
||||||
/* Get file ID, init file */
|
/* Get file ID, init file */
|
||||||
file_id = guac_pool_next_int(data->file_id_pool);
|
file_id = guac_pool_next_int(data->file_id_pool);
|
||||||
@ -209,20 +213,27 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, const char* path,
|
|||||||
file->dir = NULL;
|
file->dir = NULL;
|
||||||
file->absolute_path = strdup(normalized_path);
|
file->absolute_path = strdup(normalized_path);
|
||||||
|
|
||||||
|
/* Parse out filename */
|
||||||
|
filename = file->absolute_path;
|
||||||
|
while (*filename != '\\' && *filename != '/' && *filename != 0)
|
||||||
|
filename++;
|
||||||
|
|
||||||
|
file->name = filename;
|
||||||
|
|
||||||
/* Attempt to pull file information */
|
/* Attempt to pull file information */
|
||||||
if (fstat(fd, &file_stat) == 0) {
|
if (fstat(fd, &file_stat) == 0) {
|
||||||
|
|
||||||
/* Load size and times */
|
/* Load size and times */
|
||||||
file->size = file_stat.st_size;
|
file->size = file_stat.st_size;
|
||||||
file->ctime = file_stat.st_ctime;
|
file->ctime = WINDOWS_TIME(file_stat.st_ctime);
|
||||||
file->mtime = file_stat.st_mtime;
|
file->mtime = WINDOWS_TIME(file_stat.st_mtime);
|
||||||
file->atime = file_stat.st_atime;
|
file->atime = WINDOWS_TIME(file_stat.st_atime);
|
||||||
|
|
||||||
/* Set type */
|
/* Set type */
|
||||||
if (S_ISDIR(file_stat.st_mode))
|
if (S_ISDIR(file_stat.st_mode))
|
||||||
file->type = GUAC_RDPDR_FS_DIRECTORY;
|
file->attributes = FILE_ATTRIBUTE_DIRECTORY;
|
||||||
else
|
else
|
||||||
file->type = GUAC_RDPDR_FS_FILE;
|
file->attributes = FILE_ATTRIBUTE_NORMAL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,7 +248,7 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, const char* path,
|
|||||||
file->ctime = 0;
|
file->ctime = 0;
|
||||||
file->mtime = 0;
|
file->mtime = 0;
|
||||||
file->atime = 0;
|
file->atime = 0;
|
||||||
file->type = GUAC_RDPDR_FS_FILE;
|
file->attributes = FILE_ATTRIBUTE_NORMAL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,38 +138,22 @@
|
|||||||
*/
|
*/
|
||||||
#define WINDOWS_TIME(t) ((t - ((uint64_t) 11644473600)) * 10000000)
|
#define WINDOWS_TIME(t) ((t - ((uint64_t) 11644473600)) * 10000000)
|
||||||
|
|
||||||
/**
|
|
||||||
* Enumeration of all supported file types.
|
|
||||||
*/
|
|
||||||
typedef enum guac_rdpdr_fs_file_type {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A regular file.
|
|
||||||
*/
|
|
||||||
GUAC_RDPDR_FS_FILE,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A directory.
|
|
||||||
*/
|
|
||||||
GUAC_RDPDR_FS_DIRECTORY
|
|
||||||
|
|
||||||
} guac_rdpdr_fs_file_type;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An arbitrary file on the virtual filesystem of the Guacamole drive.
|
* An arbitrary file on the virtual filesystem of the Guacamole drive.
|
||||||
*/
|
*/
|
||||||
typedef struct guac_rdpdr_fs_file {
|
typedef struct guac_rdpdr_fs_file {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The filename of this file. The data of this name is actually stored
|
||||||
|
* within the absolute_path.
|
||||||
|
*/
|
||||||
|
char* name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The absolute path, including filename, of this file.
|
* The absolute path, including filename, of this file.
|
||||||
*/
|
*/
|
||||||
char* absolute_path;
|
char* absolute_path;
|
||||||
|
|
||||||
/**
|
|
||||||
* The type of this file.
|
|
||||||
*/
|
|
||||||
guac_rdpdr_fs_file_type type;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Associated local file descriptor.
|
* Associated local file descriptor.
|
||||||
*/
|
*/
|
||||||
@ -187,25 +171,30 @@ typedef struct guac_rdpdr_fs_file {
|
|||||||
*/
|
*/
|
||||||
struct dirent __dirent;
|
struct dirent __dirent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bitwise OR of all associated Windows file attributes.
|
||||||
|
*/
|
||||||
|
int attributes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The size of this file, in bytes.
|
* The size of this file, in bytes.
|
||||||
*/
|
*/
|
||||||
off_t size;
|
int size;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The time this file was created, as a UNIX timestamp.
|
* The time this file was created, as a Windows timestamp.
|
||||||
*/
|
*/
|
||||||
time_t ctime;
|
uint64_t ctime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The time this file was last modified, as a UNIX timestamp.
|
* The time this file was last modified, as a Windows timestamp.
|
||||||
*/
|
*/
|
||||||
time_t mtime;
|
uint64_t mtime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The time this file was last accessed, as a UNIX timestamp.
|
* The time this file was last accessed, as a Windows timestamp.
|
||||||
*/
|
*/
|
||||||
time_t atime;
|
uint64_t atime;
|
||||||
|
|
||||||
} guac_rdpdr_fs_file;
|
} guac_rdpdr_fs_file;
|
||||||
|
|
||||||
|
@ -69,16 +69,11 @@ void guac_rdpdr_fs_process_query_basic_info(guac_rdpdr_device* device, wStream*
|
|||||||
Stream_Write_UINT32(output_stream, STATUS_SUCCESS);
|
Stream_Write_UINT32(output_stream, STATUS_SUCCESS);
|
||||||
|
|
||||||
Stream_Write_UINT32(output_stream, 18 + GUAC_FILESYSTEM_NAME_LENGTH);
|
Stream_Write_UINT32(output_stream, 18 + GUAC_FILESYSTEM_NAME_LENGTH);
|
||||||
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->ctime)); /* CreationTime */
|
Stream_Write_UINT64(output_stream, file->ctime); /* CreationTime */
|
||||||
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->atime)); /* LastAccessTime */
|
Stream_Write_UINT64(output_stream, file->atime); /* LastAccessTime */
|
||||||
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->mtime)); /* LastWriteTime */
|
Stream_Write_UINT64(output_stream, file->mtime); /* LastWriteTime */
|
||||||
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->mtime)); /* ChangeTime */
|
Stream_Write_UINT64(output_stream, file->mtime); /* ChangeTime */
|
||||||
|
Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */
|
||||||
/* FileAttributes */
|
|
||||||
if (file->type == GUAC_RDPDR_FS_DIRECTORY)
|
|
||||||
Stream_Write_UINT32(output_stream, FILE_ATTRIBUTE_DIRECTORY);
|
|
||||||
else
|
|
||||||
Stream_Write_UINT32(output_stream, FILE_ATTRIBUTE_NORMAL); /* FileAttributes */
|
|
||||||
|
|
||||||
/* Reserved */
|
/* Reserved */
|
||||||
Stream_Write_UINT32(output_stream, 0);
|
Stream_Write_UINT32(output_stream, 0);
|
||||||
|
@ -68,8 +68,8 @@ void guac_rdpdr_fs_process_query_volume_info(guac_rdpdr_device* device, wStream*
|
|||||||
Stream_Write_UINT32(output_stream, STATUS_SUCCESS);
|
Stream_Write_UINT32(output_stream, STATUS_SUCCESS);
|
||||||
|
|
||||||
Stream_Write_UINT32(output_stream, 18 + GUAC_FILESYSTEM_NAME_LENGTH);
|
Stream_Write_UINT32(output_stream, 18 + GUAC_FILESYSTEM_NAME_LENGTH);
|
||||||
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->ctime)); /* VolumeCreationTime */
|
Stream_Write_UINT64(output_stream, file->ctime); /* VolumeCreationTime */
|
||||||
Stream_Write(output_stream, "GUAC", 4); /* VolumeSerialNumber */
|
Stream_Write(output_stream, "GUAC", 4); /* VolumeSerialNumber */
|
||||||
Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_NAME_LENGTH);
|
Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_NAME_LENGTH);
|
||||||
Stream_Write_UINT8(output_stream, FALSE); /* SupportsObjects */
|
Stream_Write_UINT8(output_stream, FALSE); /* SupportsObjects */
|
||||||
Stream_Write_UINT8(output_stream, 0); /* Reserved */
|
Stream_Write_UINT8(output_stream, 0); /* Reserved */
|
||||||
|
@ -196,6 +196,7 @@
|
|||||||
* Status constants.
|
* Status constants.
|
||||||
*/
|
*/
|
||||||
#define STATUS_SUCCESS 0x00000000
|
#define STATUS_SUCCESS 0x00000000
|
||||||
|
#define STATUS_NO_MORE_FILES 0x80000006
|
||||||
#define STATUS_DEVICE_OFF_LINE 0x80000010
|
#define STATUS_DEVICE_OFF_LINE 0x80000010
|
||||||
#define STATUS_NO_SUCH_FILE 0xC000000F
|
#define STATUS_NO_SUCH_FILE 0xC000000F
|
||||||
#define STATUS_END_OF_FILE 0xC0000011
|
#define STATUS_END_OF_FILE 0xC0000011
|
||||||
|
Loading…
Reference in New Issue
Block a user