From b016179b58efb59ba177cafdaea6bdee2d23e0e0 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 2 Jul 2005 08:16:24 +0000 Subject: [PATCH] (Fcopy_file): Rearrange the code that calls fchown and fchmod so that chmod doesn't get called on MSDOS before the file is closed. --- src/ChangeLog | 6 ++++++ src/fileio.c | 37 ++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 950a0414047..81610b5e646 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2005-07-02 Eli Zaretskii + + * 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 * w32term.c (cleartype_active): New flag for enabling sub-pixel diff --git a/src/fileio.c b/src/fileio.c index c4a267f4ea1..898dc0705d2 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -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; -- 2.39.2