From 86025aa30b6505235e259ac8ce9c2fc756ac1b91 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 16 Feb 2017 16:53:06 -0800 Subject: [PATCH] dll: fuse: fuse_mount: now also accepts cygwin paths --- inc/fuse/winfsp_fuse.h | 13 ++++++++++- src/dll/fuse/fuse.c | 50 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/inc/fuse/winfsp_fuse.h b/inc/fuse/winfsp_fuse.h index 8867ab7f..5fc2efb4 100644 --- a/inc/fuse/winfsp_fuse.h +++ b/inc/fuse/winfsp_fuse.h @@ -177,6 +177,7 @@ struct fuse_flock MemAlloc, MemFree, \ fsp_fuse_daemonize, \ fsp_fuse_set_signal_handlers, \ + 0/*conv_to_win_path*/, \ } #else #define FSP_FUSE_ENV_INIT \ @@ -185,6 +186,7 @@ struct fuse_flock malloc, free, \ fsp_fuse_daemonize, \ fsp_fuse_set_signal_handlers, \ + 0/*conv_to_win_path*/, \ } #endif @@ -226,6 +228,7 @@ struct fuse_flock malloc, free, \ fsp_fuse_daemonize, \ fsp_fuse_set_signal_handlers, \ + fsp_fuse_conv_to_win_path, \ } /* @@ -244,7 +247,8 @@ struct fsp_fuse_env void (*memfree)(void *); int (*daemonize)(int); int (*set_signal_handlers)(void *); - void (*reserved[4])(); + char *(*conv_to_win_path)(const char *); + void (*reserved[3])(); }; FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse_signal_handler)(int sig); @@ -348,6 +352,13 @@ static inline int fsp_fuse_set_signal_handlers(void *se) #undef FSP_FUSE_SET_SIGNAL_HANDLER } +static inline char *fsp_fuse_conv_to_win_path(const char *path) +{ + void *cygwin_create_path(unsigned, const void *); + return cygwin_create_path( + 0/*CCP_POSIX_TO_WIN_A*/ | 0x100/*CCP_RELATIVE*/, + path); +} #endif diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index 8c422960..31bc7ab6 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -177,23 +177,55 @@ FSP_FUSE_API struct fuse_chan *fsp_fuse_mount(struct fsp_fuse_env *env, const char *mountpoint, struct fuse_args *args) { struct fuse_chan *ch = 0; + WCHAR TempMountPointBuf[MAX_PATH], MountPointBuf[MAX_PATH]; int Size; - if (0 == mountpoint) - mountpoint = ""; + if (0 == mountpoint || '\0' == mountpoint[0] || + ('*' == mountpoint[0] && '\0' == mountpoint[1])) + { + MountPointBuf[0] = L'*'; + MountPointBuf[1] = L'\0'; + Size = 2 * sizeof(WCHAR); + } + else if ( + ( + ('A' <= mountpoint[0] && mountpoint[0] <= 'Z') || + ('a' <= mountpoint[0] && mountpoint[0] <= 'z') + ) && + ':' == mountpoint[1] && '\0' == mountpoint[2]) + { + MountPointBuf[0] = mountpoint[0]; + MountPointBuf[1] = ':'; + MountPointBuf[2] = '\0'; + Size = 3 * sizeof(WCHAR); + } + else + { + char *win_mountpoint = 0; - Size = MultiByteToWideChar(CP_UTF8, 0, mountpoint, -1, 0, 0); - if (0 == Size) - goto fail; + if (0 != env->conv_to_win_path) + mountpoint = win_mountpoint = env->conv_to_win_path(mountpoint); - ch = fsp_fuse_obj_alloc(env, sizeof *ch + Size * sizeof(WCHAR)); + Size = 0; + if (0 != mountpoint && + 0 != MultiByteToWideChar(CP_UTF8, 0, mountpoint, -1, TempMountPointBuf, MAX_PATH)) + Size = GetFullPathNameW(TempMountPointBuf, MAX_PATH, MountPointBuf, 0); + + env->memfree(win_mountpoint); + + if (0 == Size || MAX_PATH <= Size) + goto fail; + + mountpoint = 0; + Size = (Size + 1) * sizeof(WCHAR); + } + + ch = fsp_fuse_obj_alloc(env, sizeof *ch + Size); if (0 == ch) goto fail; ch->MountPoint = (PVOID)ch->Buffer; - Size = MultiByteToWideChar(CP_UTF8, 0, mountpoint, -1, ch->MountPoint, Size); - if (0 == Size) - goto fail; + memcpy(ch->MountPoint, MountPointBuf, Size); return ch;