OSDN Git Service

* fhandler.cc (fhandler_base::open): Call path_conv::get_nt_native_path
authorcorinna <corinna>
Fri, 30 Apr 2004 17:36:36 +0000 (17:36 +0000)
committercorinna <corinna>
Fri, 30 Apr 2004 17:36:36 +0000 (17:36 +0000)
for evaluating NT path.
* path.cc (normalize_posix_path): Remove trailing dots and spaces.
(path_conv::get_nt_native_path): New function.
* path.h (class path_conv): Declare get_nt_native_path method.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler.cc
winsup/cygwin/path.cc
winsup/cygwin/path.h

index c18f174..e57e521 100644 (file)
@@ -1,5 +1,13 @@
 2004-04-30  Corinna Vinschen  <corinna@vinschen.de>
 
+       * fhandler.cc (fhandler_base::open): Call path_conv::get_nt_native_path
+       for evaluating NT path.
+       * path.cc (normalize_posix_path): Remove trailing dots and spaces.
+       (path_conv::get_nt_native_path): New function.
+       * path.h (class path_conv): Declare get_nt_native_path method.
+
+2004-04-30  Corinna Vinschen  <corinna@vinschen.de>
+
        * fhandler.cc (fhandler_base::open): Fix NT native path evaluation
        to allow opening serial ports.
 
index 2dc3eec..ae9bd8a 100644 (file)
@@ -555,26 +555,8 @@ fhandler_base::open (int flags, mode_t mode)
       goto done;
     }
 
-  if (get_win32_name ()[0] != '\\')            /* X:\...  or NUL, etc. */
-    {
-      str2buf2uni (upath, wpath, "\\??\\");
-      str2buf2uni_cat (upath, get_win32_name ());
-    }
-  else if (get_win32_name ()[1] != '\\')       /* \Device\... */
-    str2buf2uni (upath, wpath, get_win32_name ());
-  else if (get_win32_name ()[2] != '.'
-          || get_win32_name ()[3] != '\\')     /* \\server\share\... */
-    {
-      str2buf2uni (upath, wpath, "\\??\\UNC\\");
-      str2buf2uni_cat (upath, get_win32_name () + 2);
-    }
-  else                                         /* \\.\device */
-    {
-      str2buf2uni (upath, wpath, "\\??\\");
-      str2buf2uni_cat (upath, get_win32_name () + 4);
-    }
-
-  InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
+  InitializeObjectAttributes (&attr, pc.get_nt_native_path (upath, wpath),
+                             OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
                              sa.lpSecurityDescriptor, NULL);
 
   switch (query_open ())
index 341f826..59e454b 100644 (file)
@@ -286,6 +286,10 @@ normalize_posix_path (const char *src, char *dst, char **tail)
     }
 
 done:
+  /* Remove trailing dots and spaces which are ignored by Win32 functions but
+     not by native NT functions. */
+  while (dst[-1] == '.' || dst[-1] == ' ')
+    --dst;
   *dst = '\0';
   *tail = dst;
 
@@ -458,6 +462,30 @@ path_conv::set_normalized_path (const char *path_copy)
   memcpy (normalized_path, path_copy, n);
 }
 
+PUNICODE_STRING
+path_conv::get_nt_native_path (UNICODE_STRING &upath, WCHAR *wpath)
+{
+  if (path[0] != '\\')             /* X:\...  or NUL, etc. */
+    {
+      str2buf2uni (upath, wpath, "\\??\\");
+      str2buf2uni_cat (upath, path);
+    }
+  else if (path[1] != '\\')        /* \Device\... */
+    str2buf2uni (upath, wpath, path);
+  else if (path[2] != '.' 
+          || path[3] != '\\')     /* \\server\share\... */
+    {
+      str2buf2uni (upath, wpath, "\\??\\UNC\\");
+      str2buf2uni_cat (upath, path + 2);
+    }        
+  else                                          /* \\.\device */
+    {
+      str2buf2uni (upath, wpath, "\\??\\");
+      str2buf2uni_cat (upath, path + 4);
+    }
+  return &upath;
+}
+
 /* Convert an arbitrary path SRC to a pure Win32 path, suitable for
    passing to Win32 API routines.
 
index 150799d..c043660 100644 (file)
@@ -12,6 +12,7 @@ details. */
 
 #include <sys/ioctl.h>
 #include <fcntl.h>
+#include <ntdef.h>
 
 enum executable_states
 {
@@ -191,6 +192,7 @@ class path_conv
 
   ~path_conv ();
   inline char *get_win32 () { return path; }
+  PUNICODE_STRING get_nt_native_path (UNICODE_STRING &upath, WCHAR *wpath);
   operator char *() {return path;}
   operator const char *() {return path;}
   operator DWORD &() {return fileattr;}