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>
This commit is contained in:
Corinna Vinschen 2016-02-09 15:00:30 +01:00
parent 9676aeef0d
commit 8b83da2d55
4 changed files with 12 additions and 5 deletions

View File

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

View File

@ -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,

View File

@ -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,

View File

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