]> sourceware.org Git - newlib-cygwin.git/commitdiff
* syscalls.cc (nt_path_has_suffix): New function.
authorCorinna Vinschen <corinna@vinschen.de>
Thu, 5 Nov 2009 14:44:12 +0000 (14:44 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Thu, 5 Nov 2009 14:44:12 +0000 (14:44 +0000)
(rename): Don't append .exe suffix if binary target name has any suffix
at all.

winsup/cygwin/ChangeLog
winsup/cygwin/syscalls.cc

index a7ed3fed623d70dfa1c299a67c9d5b1b206665b0..88dc8594297b6726e7ade97d49e90241819c110d 100644 (file)
@@ -1,3 +1,9 @@
+2009-11-05  Corinna Vinschen  <corinna@vinschen.de>
+
+       * syscalls.cc (nt_path_has_suffix): New function.
+       (rename): Don't append .exe suffix if binary target name has any suffix
+       at all.
+
 2009-11-05  Corinna Vinschen  <corinna@vinschen.de>
 
        * spawn.cc (dll_suffixes): Disable.  Explain why.
index d9c9d596fbafd71153c4412d721d1955952e39fc..f2c646480ba36e9d546f2e146db97e2362fb7999 100644 (file)
@@ -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;
This page took 0.040662 seconds and 5 git commands to generate.