Add guac_rdpdr_fs_read_dir(). Bump _POSIX_C_SOURCE value as necessary for fdopendir().

This commit is contained in:
Michael Jumper 2013-08-01 17:44:39 -07:00
parent 9773f348e2
commit 52f9bac805
3 changed files with 76 additions and 18 deletions

View File

@ -37,6 +37,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
#ifdef ENABLE_WINPR
@ -251,24 +252,53 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, const char* path,
void guac_rdpdr_fs_close(guac_rdpdr_device* device, int file_id) {
guac_rdpdr_fs_data* data = (guac_rdpdr_fs_data*) device->data;
guac_rdpdr_fs_file* file;
/* Only close if file ID is valid */
if (file_id >= 0 && file_id <= GUAC_RDPDR_FS_MAX_FILES-1) {
if (file_id < 0 || file_id >= GUAC_RDPDR_FS_MAX_FILES)
return;
guac_rdpdr_fs_file* file = &(data->files[file_id]);
file = &(data->files[file_id]);
/* Close directory, if open */
if (file->dir != NULL)
closedir(file->dir);
/* Close directory, if open */
if (file->dir != NULL)
closedir(file->dir);
/* Close file */
close(file->fd);
/* Close file */
close(file->fd);
/* Free ID back to pool */
guac_pool_free_int(data->file_id_pool, file_id);
data->open_files--;
}
/* Free ID back to pool */
guac_pool_free_int(data->file_id_pool, file_id);
data->open_files--;
}
const char* guac_rdpdr_fs_read_dir(guac_rdpdr_device* device, int file_id) {
guac_rdpdr_fs_data* data = (guac_rdpdr_fs_data*) device->data;
guac_rdpdr_fs_file* file;
struct dirent* result;
/* Only read if file ID is valid */
if (file_id < 0 || file_id >= GUAC_RDPDR_FS_MAX_FILES)
return NULL;
file = &(data->files[file_id]);
/* Open directory if not yet open, stop if error */
if (file->dir == NULL) {
file->dir = fdopendir(file->fd);
if (file->dir == NULL)
return NULL;
}
/* Read next entry, stop if error */
if (readdir_r(file->dir, &(file->__dirent), &result))
return NULL;
/* Return filename */
return file->__dirent.d_name;
}

View File

@ -176,6 +176,12 @@ typedef struct guac_rdpdr_fs_file {
*/
DIR* dir;
/**
* The last read dirent structure. This is used if traversing the contents
* of a directory.
*/
struct dirent __dirent;
/**
* The size of this file, in bytes.
*/
@ -238,5 +244,11 @@ int guac_rdpdr_fs_open(guac_rdpdr_device* device, const char* path,
*/
void guac_rdpdr_fs_close(guac_rdpdr_device* device, int file_id);
/**
* Returns the next filename within the directory having the given file ID,
* or NULL if no more files.
*/
const char* guac_rdpdr_fs_read_dir(guac_rdpdr_device* device, int file_id);
#endif

View File

@ -275,6 +275,9 @@ void guac_rdpdr_fs_process_notify_change_directory(guac_rdpdr_device* device,
void guac_rdpdr_fs_process_query_directory(guac_rdpdr_device* device, wStream* input_stream,
int file_id, int completion_id) {
/*guac_rdpdr_fs_data* data = (guac_rdpdr_fs_data*) device->data;
guac_rdpdr_fs_file* file = &(data->files[file_id]);*/
int fs_information_class, initial_query;
int path_length;
@ -285,13 +288,26 @@ void guac_rdpdr_fs_process_query_directory(guac_rdpdr_device* device, wStream* i
/* If this is the first query, the path is included after padding */
if (initial_query) {
Stream_Seek(input_stream, 23); /* Padding */
/* Path here */
}
guac_client_log_info(device->rdpdr->client,
"Received dir query - class=0x%x, path_length=%i",
fs_information_class, path_length);
unsigned char* path;
Stream_Seek(input_stream, 23); /* Padding */
path = Stream_Pointer(input_stream); /* Path */
guac_client_log_info(device->rdpdr->client,
"Received initial dir query - class=0x%x, path_length=%i, path=%s",
fs_information_class, path_length, path);
/* Open directory */
/*file->dir = fdopendir(file->fd);*/
/* FIXME: Handle error */
}
else
guac_client_log_info(device->rdpdr->client,
"Received continued dir query - class=0x%x",
fs_information_class);
/* Dispatch to appropriate class-specific handler */
switch (fs_information_class) {