aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2016-02-09 15:00:30 +0100
committerCorinna Vinschen <corinna@vinschen.de>2016-02-09 15:00:30 +0100
commit8b83da2d55b2a61f22b8b330f966d06e3092b079 (patch)
tree208f9ec5a3795dfbb66db34c90971be07cfa56e2
parent9676aeef0d672fea93310df14d36c1c9904d0179 (diff)
downloadnewlib-8b83da2d55b2a61f22b8b330f966d06e3092b079.zip
newlib-8b83da2d55b2a61f22b8b330f966d06e3092b079.tar.gz
newlib-8b83da2d55b2a61f22b8b330f966d06e3092b079.tar.bz2
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.h4
-rw-r--r--winsup/cygwin/mount.cc3
-rw-r--r--winsup/cygwin/mount.h4
-rw-r--r--winsup/cygwin/path.cc6
4 files changed, 12 insertions, 5 deletions
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h
index 6c720e0..5b7da58 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 569328f..961d34b 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 172a0b0..7219461 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 e49f180..20391bf 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);