Alexandre Julliard : ntdll: Cleanup the path with collapse_path() in unix_to_nt_file_name().

Alexandre Julliard julliard at winehq.org
Mon Apr 12 16:11:24 CDT 2021


Module: wine
Branch: master
Commit: cdb1f3ae55f37318e99590b5f5ae8917ce826bc8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cdb1f3ae55f37318e99590b5f5ae8917ce826bc8

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr 12 10:27:53 2021 +0200

ntdll: Cleanup the path with collapse_path() in unix_to_nt_file_name().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/file.c | 116 ++++++++++++++++++++++++-------------------------
 1 file changed, 57 insertions(+), 59 deletions(-)

diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index 9ee5e84ee43..0ba0ee7b586 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -3431,64 +3431,6 @@ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, char *nam
 }
 
 
-/******************************************************************
- *           unix_to_nt_file_name
- */
-NTSTATUS unix_to_nt_file_name( const char *name, WCHAR **nt )
-{
-    static const WCHAR unix_prefixW[] = {'\\','?','?','\\','u','n','i','x',0};
-    WCHAR dos_prefixW[] = {'\\','?','?','\\','A',':','\\',0};
-    const WCHAR *prefix = unix_prefixW;
-    unsigned int lenW, lenA = strlen(name);
-    const char *path = name;
-    NTSTATUS status;
-    WCHAR *p, *buffer;
-    int drive;
-
-    status = find_drive_rootA( &path, lenA, &drive );
-    lenA -= path - name;
-
-    if (status == STATUS_SUCCESS)
-    {
-        while (lenA && path[0] == '/') { lenA--; path++; }
-        dos_prefixW[4] += drive;
-        prefix = dos_prefixW;
-    }
-    else if (status != STATUS_OBJECT_PATH_NOT_FOUND) return status;
-
-    lenW = wcslen( prefix );
-    if (!(buffer = malloc( (lenA + lenW + 1) * sizeof(WCHAR) ))) return STATUS_NO_MEMORY;
-    memcpy( buffer, prefix, lenW * sizeof(WCHAR) );
-    lenW += ntdll_umbstowcs( path, lenA, buffer + lenW, lenA );
-    buffer[lenW] = 0;
-    for (p = buffer; *p; p++) if (*p == '/') *p = '\\';
-    *nt = buffer;
-    return STATUS_SUCCESS;
-}
-
-
-/******************************************************************
- *           wine_unix_to_nt_file_name
- */
-NTSTATUS CDECL wine_unix_to_nt_file_name( const char *name, WCHAR *buffer, SIZE_T *size )
-{
-    WCHAR *nt_name = NULL;
-    NTSTATUS status;
-
-    if (name[0] != '/') return STATUS_INVALID_PARAMETER;  /* relative paths are not supported */
-
-    status = unix_to_nt_file_name( name, &nt_name );
-    if (nt_name)
-    {
-        if (*size > wcslen(nt_name)) wcscpy( buffer, nt_name );
-        else status = STATUS_BUFFER_TOO_SMALL;
-        *size = wcslen(nt_name) + 1;
-        free( nt_name );
-    }
-    return status;
-}
-
-
 /******************************************************************
  *		collapse_path
  *
@@ -3567,7 +3509,63 @@ static void collapse_path( WCHAR *path )
 }
 
 
-#define IS_SEPARATOR(ch)   ((ch) == '\\' || (ch) == '/')
+/******************************************************************
+ *           unix_to_nt_file_name
+ */
+NTSTATUS unix_to_nt_file_name( const char *name, WCHAR **nt )
+{
+    static const WCHAR unix_prefixW[] = {'\\','?','?','\\','u','n','i','x',0};
+    WCHAR dos_prefixW[] = {'\\','?','?','\\','A',':','\\',0};
+    const WCHAR *prefix = unix_prefixW;
+    unsigned int lenW, lenA = strlen(name);
+    const char *path = name;
+    NTSTATUS status;
+    WCHAR *buffer;
+    int drive;
+
+    status = find_drive_rootA( &path, lenA, &drive );
+    lenA -= path - name;
+
+    if (status == STATUS_SUCCESS)
+    {
+        while (lenA && path[0] == '/') { lenA--; path++; }
+        dos_prefixW[4] += drive;
+        prefix = dos_prefixW;
+    }
+    else if (status != STATUS_OBJECT_PATH_NOT_FOUND) return status;
+
+    lenW = wcslen( prefix );
+    if (!(buffer = malloc( (lenA + lenW + 1) * sizeof(WCHAR) ))) return STATUS_NO_MEMORY;
+    memcpy( buffer, prefix, lenW * sizeof(WCHAR) );
+    lenW += ntdll_umbstowcs( path, lenA, buffer + lenW, lenA );
+    buffer[lenW] = 0;
+    collapse_path( buffer );
+    *nt = buffer;
+    return STATUS_SUCCESS;
+}
+
+
+/******************************************************************
+ *           wine_unix_to_nt_file_name
+ */
+NTSTATUS CDECL wine_unix_to_nt_file_name( const char *name, WCHAR *buffer, SIZE_T *size )
+{
+    WCHAR *nt_name = NULL;
+    NTSTATUS status;
+
+    if (name[0] != '/') return STATUS_INVALID_PARAMETER;  /* relative paths are not supported */
+
+    status = unix_to_nt_file_name( name, &nt_name );
+    if (nt_name)
+    {
+        if (*size > wcslen(nt_name)) wcscpy( buffer, nt_name );
+        else status = STATUS_BUFFER_TOO_SMALL;
+        *size = wcslen(nt_name) + 1;
+        free( nt_name );
+    }
+    return status;
+}
+
 
 /***********************************************************************
  *           get_full_path




More information about the wine-cvs mailing list