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);