From 5ed93a9d9e7d35ab680ba763aa0c2e8302ef6b08 Mon Sep 17 00:00:00 2001 From: Jeremie Guichard Date: Fri, 24 Feb 2017 14:06:48 +0700 Subject: Fix "Load/Save to cloudstorage" for non-ASCII user names On Windows that would fail because stat() doesn't deal well with our utf8 strings. Added new subsurface_stat() portability function to replace stat(). Added Windows implementation of subsurface_stat() using wstat(), with conversion to ut16 of the inputed path. Other platform implementations (linux, android) make use of the normal stat(). Added non ASCII test case in TestGitStorage::testGitStorageLocal() Signed-off-by: Jeremie Guichard --- core/android.cpp | 5 +++++ core/dive.h | 2 ++ core/git-access.c | 4 ++-- core/linux.c | 5 +++++ core/windows.c | 12 ++++++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) (limited to 'core') diff --git a/core/android.cpp b/core/android.cpp index bb9dc5cd8..103f18866 100644 --- a/core/android.cpp +++ b/core/android.cpp @@ -176,6 +176,11 @@ int subsurface_access(const char *path, int mode) return access(path, mode); } +int subsurface_stat(const char* path, struct stat* buf) +{ + return stat(path, buf); +} + struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp) { return zip_open(path, flags, errorp); diff --git a/core/dive.h b/core/dive.h index ecb3240c1..ba92e1083 100644 --- a/core/dive.h +++ b/core/dive.h @@ -8,6 +8,7 @@ #include #include #include +#include #include "divesite.h" /* Windows has no MIN/MAX macros - so let's just roll our own */ @@ -728,6 +729,7 @@ extern int subsurface_open(const char *path, int oflags, mode_t mode); extern FILE *subsurface_fopen(const char *path, const char *mode); extern void *subsurface_opendir(const char *path); extern int subsurface_access(const char *path, int mode); +extern int subsurface_stat(const char* path, struct stat* buf); extern struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp); extern int subsurface_zip_close(struct zip *zip); extern void subsurface_console_init(bool dedicated, bool logfile); diff --git a/core/git-access.c b/core/git-access.c index 458a7dd9a..b95606d86 100644 --- a/core/git-access.c +++ b/core/git-access.c @@ -768,7 +768,7 @@ static struct git_repository *get_remote_repo(const char *localdir, const char * } git_storage_update_progress(false, "start git interaction"); /* Do we already have a local cache? */ - if (!stat(localdir, &st)) { + if (!subsurface_stat(localdir, &st)) { if (!S_ISDIR(st.st_mode)) { if (is_subsurface_cloud) (void)cleanup_local_cache(remote, branch); @@ -934,7 +934,7 @@ struct git_repository *is_git_repository(const char *filename, const char **bran return repo; } - if (stat(loc, &st) < 0 || !S_ISDIR(st.st_mode)) { + if (subsurface_stat(loc, &st) < 0 || !S_ISDIR(st.st_mode)) { free(loc); free(branch); return dummy_git_repository; diff --git a/core/linux.c b/core/linux.c index bd6bbe2ab..5c9726750 100644 --- a/core/linux.c +++ b/core/linux.c @@ -204,6 +204,11 @@ int subsurface_access(const char *path, int mode) return access(path, mode); } +int subsurface_stat(const char* path, struct stat* buf) +{ + return stat(path, buf); +} + struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp) { return zip_open(path, flags, errorp); diff --git a/core/windows.c b/core/windows.c index a94d7dda5..c767cbeda 100644 --- a/core/windows.c +++ b/core/windows.c @@ -346,6 +346,18 @@ int subsurface_access(const char *path, int mode) return ret; } +int subsurface_stat(const char* path, struct stat* buf) +{ + int ret = -1; + if (!path) + return ret; + wchar_t *wpath = utf8_to_utf16(path); + if (wpath) + ret = wstat(wpath, buf); + free((void *)wpath); + return ret; +} + #ifndef O_BINARY #define O_BINARY 0 #endif -- cgit v1.2.3-70-g09d2