(Fcopy_file): Rearrange the code that calls fchown and
authorEli Zaretskii <eliz@gnu.org>
Sat, 2 Jul 2005 08:16:24 +0000 (08:16 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sat, 2 Jul 2005 08:16:24 +0000 (08:16 +0000)
fchmod so that chmod doesn't get called on MSDOS before the file
is closed.

src/ChangeLog
src/fileio.c

index 950a041..81610b5 100644 (file)
@@ -1,3 +1,9 @@
+2005-07-02  Eli Zaretskii  <eliz@gnu.org>
+
+       * fileio.c (Fcopy_file): Rearrange the code that calls fchown and
+       fchmod so that chmod doesn't get called on MSDOS before the file
+       is closed.
+
 2005-07-01  Jason Rumney  <jasonr@gnu.org>
 
        * w32term.c (cleartype_active): New flag for enabling sub-pixel
index c4a267f..898dc07 100644 (file)
@@ -2521,7 +2521,7 @@ uid and gid of FILE to NEWNAME.  */)
      copyable by us. */
   input_file_statable_p = (fstat (ifd, &st) >= 0);
 
-#if !defined (DOS_NT) || __DJGPP__ > 1
+#if !defined (MSDOS) || __DJGPP__ > 1
   if (out_st.st_mode != 0
       && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
     {
@@ -2574,25 +2574,16 @@ uid and gid of FILE to NEWNAME.  */)
       report_file_error ("I/O error", Fcons (newname, Qnil));
   immediate_quit = 0;
 
-  /* Preserve the owner and group, if requested.  */
-  if (input_file_statable_p && ! NILP (preserve_uid_gid))
-    fchown (ofd, st.st_uid, st.st_gid);
-
+#ifndef MSDOS
+  /* Preserve the original file modes, and if requested, also its
+     owner and group.  */
   if (input_file_statable_p)
     {
-#ifndef MSDOS
+      if (! NILP (preserve_uid_gid))
+       fchown (ofd, st.st_uid, st.st_gid);
       fchmod (ofd, st.st_mode & 07777);
-#else /* MSDOS */
-#if defined (__DJGPP__) && __DJGPP__ > 1
-      /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
-         and if it can't, it tells so.  Otherwise, under MSDOS we usually
-         get only the READ bit, which will make the copied file read-only,
-         so it's better not to chmod at all.  */
-      if ((_djstat_flags & _STFAIL_WRITEBIT) == 0)
-       chmod (SDATA (encoded_newname), st.st_mode & 07777);
-#endif /* DJGPP version 2 or newer */
-#endif /* MSDOS */
     }
+#endif /* not MSDOS */
 
   /* Closing the output clobbers the file times on some systems.  */
   if (emacs_close (ofd) < 0)
@@ -2614,7 +2605,19 @@ uid and gid of FILE to NEWNAME.  */)
     }
 
   emacs_close (ifd);
-#endif /* WINDOWSNT */
+
+#if defined (__DJGPP__) && __DJGPP__ > 1
+  if (input_file_statable_p)
+    {
+      /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
+         and if it can't, it tells so.  Otherwise, under MSDOS we usually
+         get only the READ bit, which will make the copied file read-only,
+         so it's better not to chmod at all.  */
+      if ((_djstat_flags & _STFAIL_WRITEBIT) == 0)
+       chmod (SDATA (encoded_newname), st.st_mode & 07777);
+    }
+#endif /* DJGPP version 2 or newer */
+#endif /* not WINDOWSNT */
 
   /* Discard the unwind protects.  */
   specpdl_ptr = specpdl + count;