Port better to glibc 2.28+ renameat2

* configure.ac: Check for renameat2.
* src/sysdep.c (renameat_noreplace): Prefer renameat2 (supplied by
glibc 2.28 and later) to doing the syscall by hand.
This commit is contained in:
Paul Eggert 2022-12-17 21:40:02 -08:00
parent 0dddf9849e
commit 5a344d90c5
2 changed files with 5 additions and 3 deletions

View file

@ -4997,6 +4997,7 @@ pthread_sigmask strsignal setitimer \
sendto recvfrom getsockname getifaddrs freeifaddrs \
gai_strerror sync \
getpwent endpwent getgrent endgrent \
renameat2 \
cfmakeraw cfsetspeed __executable_start log2 pthread_setname_np \
pthread_set_name_np])
LIBS=$OLD_LIBS

View file

@ -2653,10 +2653,11 @@ emacs_perror (char const *message)
int
renameat_noreplace (int srcfd, char const *src, int dstfd, char const *dst)
{
#if defined SYS_renameat2 && defined RENAME_NOREPLACE
return syscall (SYS_renameat2, srcfd, src, dstfd, dst, RENAME_NOREPLACE);
#elif defined CYGWIN && defined RENAME_NOREPLACE
#if HAVE_RENAMEAT2 && defined RENAME_NOREPLACE
return renameat2 (srcfd, src, dstfd, dst, RENAME_NOREPLACE);
#elif defined SYS_renameat2 && defined RENAME_NOREPLACE
/* Linux kernel 3.15 (2014) or later, with glibc 2.27 (2018) or earlier. */
return syscall (SYS_renameat2, srcfd, src, dstfd, dst, RENAME_NOREPLACE);
#elif defined RENAME_EXCL
return renameatx_np (srcfd, src, dstfd, dst, RENAME_EXCL);
#else