[newlib-cygwin] cygwin_conv_path: Always preserve trailing backslashes in conversion to POSIX paths

Corinna Vinschen corinna@sourceware.org
Tue Feb 9 14:00:00 GMT 2016


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=8b83da2d55b2a61f22b8b330f966d06e3092b079

commit 8b83da2d55b2a61f22b8b330f966d06e3092b079
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Tue Feb 9 15:00:30 2016 +0100

    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>

Diff:
---
 winsup/cygwin/include/sys/cygwin.h | 4 +++-
 winsup/cygwin/mount.cc             | 3 ++-
 winsup/cygwin/mount.h              | 4 ++++
 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 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);



More information about the Cygwin-cvs mailing list