* 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.
This commit is contained in:
parent
ed8dd3c858
commit
43b2d5bace
|
@ -1,3 +1,11 @@
|
|||
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
|
||||
|
|
|
@ -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 ())
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;}
|
||||
|
|
Loading…
Reference in New Issue