Move to attributes rather than type.

This commit is contained in:
Michael Jumper 2013-08-02 17:23:09 -07:00
parent 32fdcdc660
commit 439cd7c903
5 changed files with 48 additions and 52 deletions

View File

@ -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;
char real_path[GUAC_RDPDR_FS_MAX_PATH];
char normalized_path[GUAC_RDPDR_FS_MAX_PATH];
char* filename;
struct stat file_stat;
int fd;
@ -193,14 +194,17 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, const char* path,
/* Translate normalized path to 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 */
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;
}
else
guac_client_log_info(device->rdpdr->client,
"Opened real file: \"%s\"", real_path);
/* Get file ID, init file */
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->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 */
if (fstat(fd, &file_stat) == 0) {
/* Load size and times */
file->size = file_stat.st_size;
file->ctime = file_stat.st_ctime;
file->mtime = file_stat.st_mtime;
file->atime = file_stat.st_atime;
file->ctime = WINDOWS_TIME(file_stat.st_ctime);
file->mtime = WINDOWS_TIME(file_stat.st_mtime);
file->atime = WINDOWS_TIME(file_stat.st_atime);
/* Set type */
if (S_ISDIR(file_stat.st_mode))
file->type = GUAC_RDPDR_FS_DIRECTORY;
file->attributes = FILE_ATTRIBUTE_DIRECTORY;
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->mtime = 0;
file->atime = 0;
file->type = GUAC_RDPDR_FS_FILE;
file->attributes = FILE_ATTRIBUTE_NORMAL;
}

View File

@ -138,38 +138,22 @@
*/
#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.
*/
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.
*/
char* absolute_path;
/**
* The type of this file.
*/
guac_rdpdr_fs_file_type type;
/**
* Associated local file descriptor.
*/
@ -187,25 +171,30 @@ typedef struct guac_rdpdr_fs_file {
*/
struct dirent __dirent;
/**
* Bitwise OR of all associated Windows file attributes.
*/
int attributes;
/**
* 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;

View 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, 18 + GUAC_FILESYSTEM_NAME_LENGTH);
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->ctime)); /* CreationTime */
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->atime)); /* LastAccessTime */
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->mtime)); /* LastWriteTime */
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->mtime)); /* ChangeTime */
/* 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 */
Stream_Write_UINT64(output_stream, file->ctime); /* CreationTime */
Stream_Write_UINT64(output_stream, file->atime); /* LastAccessTime */
Stream_Write_UINT64(output_stream, file->mtime); /* LastWriteTime */
Stream_Write_UINT64(output_stream, file->mtime); /* ChangeTime */
Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */
/* Reserved */
Stream_Write_UINT32(output_stream, 0);

View File

@ -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, 18 + GUAC_FILESYSTEM_NAME_LENGTH);
Stream_Write_UINT64(output_stream, WINDOWS_TIME(file->ctime)); /* VolumeCreationTime */
Stream_Write(output_stream, "GUAC", 4); /* VolumeSerialNumber */
Stream_Write_UINT64(output_stream, file->ctime); /* VolumeCreationTime */
Stream_Write(output_stream, "GUAC", 4); /* VolumeSerialNumber */
Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_NAME_LENGTH);
Stream_Write_UINT8(output_stream, FALSE); /* SupportsObjects */
Stream_Write_UINT8(output_stream, 0); /* Reserved */

View File

@ -196,6 +196,7 @@
* Status constants.
*/
#define STATUS_SUCCESS 0x00000000
#define STATUS_NO_MORE_FILES 0x80000006
#define STATUS_DEVICE_OFF_LINE 0x80000010
#define STATUS_NO_SUCH_FILE 0xC000000F
#define STATUS_END_OF_FILE 0xC0000011