diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2016-02-09 15:00:30 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2016-02-09 15:00:30 +0100 |
commit | 8b83da2d55b2a61f22b8b330f966d06e3092b079 (patch) | |
tree | 208f9ec5a3795dfbb66db34c90971be07cfa56e2 | |
parent | 9676aeef0d672fea93310df14d36c1c9904d0179 (diff) | |
download | cygnal-8b83da2d55b2a61f22b8b330f966d06e3092b079.tar.gz cygnal-8b83da2d55b2a61f22b8b330f966d06e3092b079.tar.bz2 cygnal-8b83da2d55b2a61f22b8b330f966d06e3092b079.zip |
cygwin_conv_path: Always preserve trailing backslashes in conversion to POSIX paths
* include/sys/cygwin.h (CCP_CONVFLAGS_MASK): Define.
* mount.h (__CCP_APP_SLASH): Define.
* mount.cc (mount_info::conv_to_posix_path): Handle __CCP_APP_SLASH
flag.
* path.cc (cygwin_conv_path): Use CCP_CONVFLAGS_MASK to evaluate
"how" flag values. Always add __CCP_APP_SLASH flag when calling
mount_info::conv_to_posix_path.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/include/sys/cygwin.h | 4 | ||||
-rw-r--r-- | winsup/cygwin/mount.cc | 3 | ||||
-rw-r--r-- | winsup/cygwin/mount.h | 4 | ||||
-rw-r--r-- | winsup/cygwin/path.cc | 6 |
4 files changed, 12 insertions, 5 deletions
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h index 6c720e0dd..5b7da5897 100644 --- a/winsup/cygwin/include/sys/cygwin.h +++ b/winsup/cygwin/include/sys/cygwin.h @@ -59,8 +59,10 @@ enum /* Or these values to the above as needed. */ CCP_ABSOLUTE = 0, /* Request absolute path (default). */ CCP_RELATIVE = 0x100, /* Request to keep path relative. */ - CCP_PROC_CYGDRIVE = 0x200 /* Request to return /proc/cygdrive + CCP_PROC_CYGDRIVE = 0x200, /* Request to return /proc/cygdrive path (only with CCP_*_TO_POSIX). */ + + CCP_CONVFLAGS_MASK = 0x300, }; typedef unsigned int cygwin_conv_path_t; diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc index 569328fd7..961d34b44 100644 --- a/winsup/cygwin/mount.cc +++ b/winsup/cygwin/mount.cc @@ -899,7 +899,8 @@ mount_info::conv_to_posix_path (const char *src_path, char *posix_path, else { const char *lastchar = src_path + src_path_len - 1; - append_slash = isdirsep (*lastchar) && lastchar[-1] != ':'; + append_slash = isdirsep (*lastchar) + && ((ccp_flags & __CCP_APP_SLASH) || lastchar[-1] != ':'); } debug_printf ("conv_to_posix_path (%s, 0x%x, %s)", src_path, ccp_flags, diff --git a/winsup/cygwin/mount.h b/winsup/cygwin/mount.h index 172a0b03b..7219461ac 100644 --- a/winsup/cygwin/mount.h +++ b/winsup/cygwin/mount.h @@ -12,6 +12,10 @@ details. */ #ifndef _MOUNT_H #define _MOUNT_H +#define __CCP_APP_SLASH 0x10000000 /* Internal flag for conv_to_posix_path. + always append slash, even if path + is "X:\\" only. */ + enum disk_type { DT_NODISK, diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index e49f18043..20391bf98 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -3318,7 +3318,7 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to, char *buf = NULL; PWCHAR path = NULL; int error = 0; - int how = what & ~CCP_CONVTYPE_MASK; + int how = what & CCP_CONVFLAGS_MASK; what &= CCP_CONVTYPE_MASK; int ret = -1; @@ -3444,7 +3444,7 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to, case CCP_WIN_A_TO_POSIX: buf = tp.c_get (); error = mount_table->conv_to_posix_path ((const char *) from, buf, - how); + how | __CCP_APP_SLASH); if (error) { set_errno (p.error); @@ -3455,7 +3455,7 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to, case CCP_WIN_W_TO_POSIX: buf = tp.c_get (); error = mount_table->conv_to_posix_path ((const PWCHAR) from, buf, - how); + how | __CCP_APP_SLASH); if (error) { set_errno (error); |