When renaming a file, ask only if EEXIST or ENOSYS
commit1f9f514e7c2ba41b0954d0141f99652f6a53a107
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 2 Aug 2017 08:53:46 +0000 (2 01:53 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 2 Aug 2017 08:59:32 +0000 (2 01:59 -0700)
tree37d6a253a4db4b6ff2a46e9a7ac512cbe1938c71
parent5656492d04aa1a82747ff167d8063bbd7950597e
When renaming a file, ask only if EEXIST or ENOSYS

* src/fileio.c (Frename_file): Avoid calling Ffile_directory_p
more than once on FILE.  Use renameat_noreplace, so that we can
ask the user (and unlink and retry) only if this fails with errno
== EEXIST or ENOSYS.  This avoids the need to ask the user for
permission to do an operation that will fail anyway.  Simplify
computation of ok_if_already_exists for subsidiary functions.
* src/filelock.c (rename_lock_file): Prefer renameat_noreplace
if it works, as this avoids the need to link and unlink.
* src/lisp.h (renameat_noreplace): New decl.
* src/sysdep.c [HAVE_LINUX_FS_H]: Include linux/fs.h and sys/syscall.h.
(renameat_noreplace): New function.
src/fileio.c
src/filelock.c
src/lisp.h
src/sysdep.c