aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2017-08-14 15:25:13 -0700
committerPaul Eggert2017-08-14 15:53:28 -0700
commit13a846823a92447d5cf0c2ce2bb401c5cdcb9ee4 (patch)
tree5c7f07e83772c76357fc56145ef8cd96ea4eb460 /src
parent4fe9a9efcfdd39c5751d4506e94afaf28fcbcaef (diff)
downloademacs-13a846823a92447d5cf0c2ce2bb401c5cdcb9ee4.tar.gz
emacs-13a846823a92447d5cf0c2ce2bb401c5cdcb9ee4.zip
Improve rename-file behavior on macOS
Problem reported by Philipp Stephani (Bug#27986). * src/fileio.c (Frename_file): Worry about file name case sensitivity only if CYGWIN or DOS_NT. * src/sysdep.c (renameat_noreplace): Use renameatx_np on macOS, since this provides the necessary atomicity guarantees.
Diffstat (limited to 'src')
-rw-r--r--src/fileio.c2
-rw-r--r--src/sysdep.c6
2 files changed, 6 insertions, 2 deletions
diff --git a/src/fileio.c b/src/fileio.c
index 69079c6ae49..9f6de5b6ca7 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2259,12 +2259,14 @@ This is what happens in interactive use with M-x. */)
2259 not worry whether NEWNAME exists or whether it is a directory, as 2259 not worry whether NEWNAME exists or whether it is a directory, as
2260 it is already another name for FILE. */ 2260 it is already another name for FILE. */
2261 bool case_only_rename = false; 2261 bool case_only_rename = false;
2262#if defined CYGWIN || defined DOS_NT
2262 if (!NILP (Ffile_name_case_insensitive_p (file))) 2263 if (!NILP (Ffile_name_case_insensitive_p (file)))
2263 { 2264 {
2264 newname = Fexpand_file_name (newname, Qnil); 2265 newname = Fexpand_file_name (newname, Qnil);
2265 case_only_rename = !NILP (Fstring_equal (Fdowncase (file), 2266 case_only_rename = !NILP (Fstring_equal (Fdowncase (file),
2266 Fdowncase (newname))); 2267 Fdowncase (newname)));
2267 } 2268 }
2269#endif
2268 2270
2269 if (!case_only_rename) 2271 if (!case_only_rename)
2270 newname = expand_cp_target (Fdirectory_file_name (file), newname); 2272 newname = expand_cp_target (Fdirectory_file_name (file), newname);
diff --git a/src/sysdep.c b/src/sysdep.c
index 35f499c1853..2e18a419e3f 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -2693,11 +2693,13 @@ renameat_noreplace (int srcfd, char const *src, int dstfd, char const *dst)
2693{ 2693{
2694#if defined SYS_renameat2 && defined RENAME_NOREPLACE 2694#if defined SYS_renameat2 && defined RENAME_NOREPLACE
2695 return syscall (SYS_renameat2, srcfd, src, dstfd, dst, RENAME_NOREPLACE); 2695 return syscall (SYS_renameat2, srcfd, src, dstfd, dst, RENAME_NOREPLACE);
2696#elif defined RENAME_EXCL
2697 return renameatx_np (srcfd, src, dstfd, dst, RENAME_EXCL);
2696#else 2698#else
2697#ifdef WINDOWSNT 2699# ifdef WINDOWSNT
2698 if (srcfd == AT_FDCWD && dstfd == AT_FDCWD) 2700 if (srcfd == AT_FDCWD && dstfd == AT_FDCWD)
2699 return sys_rename_replace (src, dst, 0); 2701 return sys_rename_replace (src, dst, 0);
2700#endif 2702# endif
2701 errno = ENOSYS; 2703 errno = ENOSYS;
2702 return -1; 2704 return -1;
2703#endif 2705#endif