Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-11-05 17:44:12 +0300
committerCorinna Vinschen <corinna@vinschen.de>2009-11-05 17:44:12 +0300
commitac4ad8bffcb1358c593b327ae1f1354ec26fee90 (patch)
tree1b0f5ddefd4beff240ecaa1fb7e2f043e3ba9b13 /winsup/cygwin/syscalls.cc
parente807aacea9cbee44774f3686fb05caffe119a917 (diff)
* syscalls.cc (nt_path_has_suffix): New function.
(rename): Don't append .exe suffix if binary target name has any suffix at all.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r--winsup/cygwin/syscalls.cc33
1 files changed, 28 insertions, 5 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index d9c9d596f..f2c646480 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -1643,6 +1643,30 @@ stop_transaction (NTSTATUS status, HANDLE old_trans, HANDLE trans)
return status;
}
+/* This function tests if a filename has *any* suffix. In order to
+ make this quick and simple, we define a suffix as being not longer
+ than 4 chars, plus the leading dot. */
+static inline bool
+nt_path_has_suffix (PUNICODE_STRING upath)
+{
+ USHORT pos = upath->Length / sizeof (WCHAR);
+ const PWCHAR path = upath->Buffer;
+ USHORT upto;
+
+ /* Too short for a native path? */
+ if (pos < 8)
+ return false;
+ upto = pos - 5;
+ while (--pos >= upto)
+ {
+ if (path[pos] == L'.')
+ return true;
+ if (path[pos] == L'\\')
+ break;
+ }
+ return false;
+}
+
extern "C" int
rename (const char *oldpath, const char *newpath)
{
@@ -1841,9 +1865,8 @@ rename (const char *oldpath, const char *newpath)
&ro_u_lnk, TRUE))
rename_append_suffix (newpc, newpath, nlen, ".lnk");
else if (oldpc.is_binary () && !old_explicit_suffix
- && !RtlEqualUnicodePathSuffix (newpc.get_nt_native_path (),
- &ro_u_exe, TRUE))
- /* To rename an executable foo.exe to bar-without-exe-suffix, the
+ && !nt_path_has_suffix (newpc.get_nt_native_path ()))
+ /* To rename an executable foo.exe to bar-without-suffix, the
.exe suffix must be given explicitly in oldpath. */
rename_append_suffix (newpc, newpath, nlen, ".exe");
}
@@ -1872,8 +1895,8 @@ rename (const char *oldpath, const char *newpath)
}
else if (oldpc.is_binary ())
{
- if (!RtlEqualUnicodePathSuffix (newpc.get_nt_native_path (),
- &ro_u_exe, TRUE))
+ /* Never append .exe suffix if file has any suffix already. */
+ if (!nt_path_has_suffix (newpc.get_nt_native_path ()))
{
rename_append_suffix (new2pc, newpath, nlen, ".exe");
removepc = &newpc;