From: corinna Date: Fri, 30 Apr 2004 17:36:36 +0000 (+0000) Subject: * fhandler.cc (fhandler_base::open): Call path_conv::get_nt_native_path X-Git-Tag: reparent-point~2750 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=4cbf493389173e345e488b762b68a5ac14261427;p=pf3gnuchains%2Fpf3gnuchains4x.git * 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. --- diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c18f174b4e..e57e521031 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,13 @@ 2004-04-30 Corinna Vinschen + * 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 + * fhandler.cc (fhandler_base::open): Fix NT native path evaluation to allow opening serial ports. diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 2dc3eece0a..ae9bd8a04e 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -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 ()) diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 341f8268c8..59e454bfc8 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -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. diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index 150799d595..c043660145 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -12,6 +12,7 @@ details. */ #include #include +#include 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;}