# HG changeset patch # User Eli Zaretskii # Date 1120292151 0 # Node ID 2e6177253f281ad8d5f3e3718f436123fe73762e # Parent 6e92df884ee6e6b58ec1a1f83d4ea052ae2430a0 (Fcopy_file): Rearrange the code that calls fchown and fchmod so that chmod doesn't get called on MSDOS before the file is closed. diff -r 6e92df884ee6 -r 2e6177253f28 src/fileio.c --- a/src/fileio.c Sat Jul 02 02:53:20 2005 +0000 +++ b/src/fileio.c Sat Jul 02 08:15:51 2005 +0000 @@ -2521,7 +2521,7 @@ 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 @@ 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 @@ } 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;