From b8383e4c673f8650e0864c8336fbbe9ae9a0815e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sat, 3 Nov 2012 23:54:54 -0400 Subject: [PATCH] channels/drive: use new improved pattern matcher --- channels/drive/client/CMakeLists.txt | 4 +- channels/drive/client/drive_file.c | 64 ++++++-------- include/freerdp/channels/rdpdr.h | 119 +++++++++++++-------------- 3 files changed, 82 insertions(+), 105 deletions(-) diff --git a/channels/drive/client/CMakeLists.txt b/channels/drive/client/CMakeLists.txt index 051a12f5f..d2e41598d 100644 --- a/channels/drive/client/CMakeLists.txt +++ b/channels/drive/client/CMakeLists.txt @@ -41,7 +41,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE winpr - MODULES winpr-crt winpr-synch winpr-thread winpr-interlocked) + MODULES winpr-crt winpr-file winpr-synch winpr-thread winpr-interlocked) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) @@ -50,5 +50,3 @@ if(NOT STATIC_CHANNELS) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") - - diff --git a/channels/drive/client/drive_file.c b/channels/drive/client/drive_file.c index bc5384226..d9907a08e 100644 --- a/channels/drive/client/drive_file.c +++ b/channels/drive/client/drive_file.c @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -61,35 +62,6 @@ #pragma warning(disable: 4244) #endif -static BOOL drive_file_wildcard_match(const char* pattern, const char* filename) -{ - const char *p = pattern, *f = filename; - char c; - - /* - * TODO: proper wildcard rules per msft's File System Behavior Overview - * Simple cases for now. - */ - f = filename; - while ((c = *p++)) - { - if (c == '*') - { - c = *p++; - if (!c) /* shortcut */ - return TRUE; - /* TODO: skip to tail comparison */ - } - if (c != *f++) - return FALSE; - } - - if (!*f) - return TRUE; - - return FALSE; -} - static void drive_file_fix_path(char* path) { int i; @@ -222,8 +194,8 @@ static BOOL drive_file_init(DRIVE_FILE* file, UINT32 DesiredAccess, UINT32 Creat { file->is_dir = (S_ISDIR(st.st_mode) ? TRUE : FALSE); #ifndef WIN32 - if (st.st_size > (unsigned long)0x07fffffff) - largeFile = TRUE; + if (st.st_size > (unsigned long) 0x07FFFFFFF) + largeFile = TRUE; #endif exists = TRUE; } @@ -232,14 +204,14 @@ static BOOL drive_file_init(DRIVE_FILE* file, UINT32 DesiredAccess, UINT32 Creat file->is_dir = ((CreateOptions & FILE_DIRECTORY_FILE) ? TRUE : FALSE); if (file->is_dir) { - //Should only create the directory if the disposition allows for it + /* Should only create the directory if the disposition allows for it */ if ((CreateDisposition == FILE_OPEN_IF) || (CreateDisposition == FILE_CREATE)) { - if (mkdir(file->fullpath, mode) != 0) - { - file->err = errno; - return TRUE; - } + if (mkdir(file->fullpath, mode) != 0) + { + file->err = errno; + return TRUE; + } } } exists = FALSE; @@ -248,6 +220,7 @@ static BOOL drive_file_init(DRIVE_FILE* file, UINT32 DesiredAccess, UINT32 Creat if (file->is_dir) { file->dir = opendir(file->fullpath); + if (file->dir == NULL) { file->err = errno; @@ -279,7 +252,7 @@ static BOOL drive_file_init(DRIVE_FILE* file, UINT32 DesiredAccess, UINT32 Creat break; } - if (CreateOptions & FILE_DELETE_ON_CLOSE && DesiredAccess & DELETE) + if ((CreateOptions & FILE_DELETE_ON_CLOSE) && (DesiredAccess & DELETE)) { file->delete_pending = TRUE; } @@ -302,6 +275,7 @@ static BOOL drive_file_init(DRIVE_FILE* file, UINT32 DesiredAccess, UINT32 Creat } #endif file->fd = OPEN(file->fullpath, oflag, mode); + if (file->fd == -1) { file->err = errno; @@ -336,6 +310,7 @@ void drive_file_free(DRIVE_FILE* file) { if (file->fd != -1) close(file->fd); + if (file->dir != NULL) closedir(file->dir); @@ -371,9 +346,11 @@ BOOL drive_file_read(DRIVE_FILE* file, BYTE* buffer, UINT32* Length) return FALSE; r = read(file->fd, buffer, *Length); + if (r < 0) return FALSE; - *Length = (UINT32)r; + + *Length = (UINT32) r; return TRUE; } @@ -388,8 +365,10 @@ BOOL drive_file_write(DRIVE_FILE* file, BYTE* buffer, UINT32 Length) while (Length > 0) { r = write(file->fd, buffer, Length); + if (r == -1) return FALSE; + Length -= r; buffer += r; } @@ -406,6 +385,7 @@ BOOL drive_file_query_information(DRIVE_FILE* file, UINT32 FsInformationClass, S stream_write_UINT32(output, 0); /* Length */ return FALSE; } + switch (FsInformationClass) { case FileBasicInformation: @@ -587,9 +567,11 @@ BOOL drive_file_query_directory(DRIVE_FILE* file, UINT32 FsInformationClass, BYT if (ent == NULL) continue; - if (drive_file_wildcard_match(file->pattern, ent->d_name)) + if (FilePatternMatchA(ent->d_name, file->pattern)) break; - } while (ent); + + } + while (ent); } else { diff --git a/include/freerdp/channels/rdpdr.h b/include/freerdp/channels/rdpdr.h index 01de5f07e..983033b9c 100644 --- a/include/freerdp/channels/rdpdr.h +++ b/include/freerdp/channels/rdpdr.h @@ -22,6 +22,7 @@ #define FREERDP_CHANNEL_RDPDR_H #include +#include #include #include #include @@ -135,28 +136,30 @@ enum FILE_CREATE_OPTION /* DR_CREATE_REQ.DesiredAccess [MS-SMB2] */ #ifndef _WIN32 -enum FILE_ACCESS -{ - FILE_READ_DATA = 0x00000001, - FILE_WRITE_DATA = 0x00000002, - FILE_APPEND_DATA = 0x00000004, - FILE_READ_EA = 0x00000008, - FILE_WRITE_EA = 0x00000010, - FILE_EXECUTE = 0x00000020, - FILE_READ_ATTRIBUTES = 0x00000080, - FILE_WRITE_ATTRIBUTES = 0x00000100, - DELETE = 0x00010000, - READ_CONTROL = 0x00020000, - WRITE_DAC = 0x00040000, - WRITE_OWNER = 0x00080000, - SYNCHRONIZE = 0x00100000, - ACCESS_SYSTEM_SECURITY = 0x01000000, - MAXIMUM_ALLOWED = 0x02000000, - GENERIC_ALL = 0x10000000, - GENERIC_EXECUTE = 0x20000000, - GENERIC_WRITE = 0x40000000, - GENERIC_READ = 0x80000000 -}; + +#if 0 +#define FILE_READ_DATA 0x00000001 +#define FILE_WRITE_DATA 0x00000002 +#define FILE_APPEND_DATA 0x00000004 +#define FILE_READ_EA 0x00000008 +#define FILE_WRITE_EA 0x00000010 +#define FILE_EXECUTE 0x00000020 +#define FILE_READ_ATTRIBUTES 0x00000080 +#define FILE_WRITE_ATTRIBUTES 0x00000100 +#endif + +#define DELETE 0x00010000 +#define READ_CONTROL 0x00020000 +#define WRITE_DAC 0x00040000 +#define WRITE_OWNER 0x00080000 +#define SYNCHRONIZE 0x00100000 +#define ACCESS_SYSTEM_SECURITY 0x01000000 +#define MAXIMUM_ALLOWED 0x02000000 +#define GENERIC_ALL 0x10000000 +#define GENERIC_EXECUTE 0x20000000 +#define GENERIC_WRITE 0x40000000 +#define GENERIC_READ 0x80000000 + #endif /* DR_CREATE_RSP.Information */ @@ -308,22 +311,19 @@ enum RDPDR_PRINTER_ANNOUNCE_FLAG #ifndef _WIN32 -enum FILE_ATTRIBUTE -{ - FILE_ATTRIBUTE_ARCHIVE = 0x00000020, - FILE_ATTRIBUTE_COMPRESSED = 0x00000800, - FILE_ATTRIBUTE_DIRECTORY = 0x00000010, - FILE_ATTRIBUTE_ENCRYPTED = 0x00004000, - FILE_ATTRIBUTE_HIDDEN = 0x00000002, - FILE_ATTRIBUTE_NORMAL = 0x00000080, - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000, - FILE_ATTRIBUTE_OFFLINE = 0x00001000, - FILE_ATTRIBUTE_READONLY = 0x00000001, - FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400, - FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200, - FILE_ATTRIBUTE_SYSTEM = 0x00000004, - FILE_ATTRIBUTE_TEMPORARY = 0x00000100 -}; +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +#define FILE_ATTRIBUTE_OFFLINE 0x00001000 +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 #endif @@ -361,29 +361,26 @@ enum FSCTL_STRUCTURE #ifndef _WIN32 -enum FILE_FS_ATTRIBUTE_INFORMATION -{ - FILE_SUPPORTS_USN_JOURNAL = 0x02000000, - FILE_SUPPORTS_OPEN_BY_FILE_ID = 0x01000000, - FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000, - FILE_SUPPORTS_HARD_LINKS = 0x00400000, - FILE_SUPPORTS_TRANSACTIONS = 0x00200000, - FILE_SEQUENTIAL_WRITE_ONCE = 0x00100000, - FILE_READ_ONLY_VOLUME = 0x00080000, - FILE_NAMED_STREAMS = 0x00040000, - FILE_SUPPORTS_ENCRYPTION = 0x00020000, - FILE_SUPPORTS_OBJECT_IDS = 0x00010000, - FILE_VOLUME_IS_COMPRESSED = 0x00008000, - FILE_SUPPORTS_REMOTE_STORAGE = 0x00000100, - FILE_SUPPORTS_REPARSE_POINTS = 0x00000080, - FILE_SUPPORTS_SPARSE_FILES = 0x00000040, - FILE_VOLUME_QUOTAS = 0x00000020, - FILE_FILE_COMPRESSION = 0x00000010, - FILE_PERSISTENT_ACLS = 0x00000008, - FILE_UNICODE_ON_DISK = 0x00000004, - FILE_CASE_PRESERVED_NAMES = 0x00000002, - FILE_CASE_SENSITIVE_SEARCH = 0x00000001 -}; +#define FILE_SUPPORTS_USN_JOURNAL 0x02000000 +#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000 +#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000 +#define FILE_SUPPORTS_HARD_LINKS 0x00400000 +#define FILE_SUPPORTS_TRANSACTIONS 0x00200000 +#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000 +#define FILE_READ_ONLY_VOLUME 0x00080000 +#define FILE_NAMED_STREAMS 0x00040000 +#define FILE_SUPPORTS_ENCRYPTION 0x00020000 +#define FILE_SUPPORTS_OBJECT_IDS 0x00010000 +#define FILE_VOLUME_IS_COMPRESSED 0x00008000 +#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100 +#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080 +#define FILE_SUPPORTS_SPARSE_FILES 0x00000040 +#define FILE_VOLUME_QUOTAS 0x00000020 +#define FILE_FILE_COMPRESSION 0x00000010 +#define FILE_PERSISTENT_ACLS 0x00000008 +#define FILE_UNICODE_ON_DISK 0x00000004 +#define FILE_CASE_PRESERVED_NAMES 0x00000002 +#define FILE_CASE_SENSITIVE_SEARCH 0x00000001 #endif