+2024-03-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ renameatu: support RENAME_EXCHANGE on macOS
+ * lib/renameatu.c (renameat2ish, renameatu) [RENAME_SWAP]:
+ Use macOS RENAME_SWAP to implement GNU/Linux RENAME_EXCHANGE.
+ * tests/test-renameatu.c (main): Add a test for RENAME_EXCHANGE.
+
2024-03-16 Collin Funk <collin.funk1@gmail.com>
gnulib-tool.py: Follow gnulib-tool changes, part 59.
missing on many platforms:
glibc 2.27, macOS 11.1, FreeBSD 14.0, NetBSD 9.0, OpenBSD 6.7, Minix 3.1.8, AIX 7.1, HP-UX 11.31, IRIX 6.5, Solaris 11.4, Cygwin 1.7.x, mingw, MSVC 14, Android API level 29.
@end itemize
+
+The @code{renameatu} module addresses some of these portability issues.
renameat2ish (int fd1, char const *src, int fd2, char const *dst,
unsigned int flags)
{
+# ifdef RENAME_SWAP
+ if (flags & RENAME_EXCHANGE)
+ return renameatx_np (fd1, src, fd2, dst, RENAME_SWAP);
+# endif
# ifdef RENAME_EXCL
if (flags)
{
dst_found_nonexistent = true;
break;
+ case RENAME_EXCHANGE:
+#ifdef RENAME_SWAP
+ break;
+#endif
default:
return errno_fail (ENOTSUP);
}
== -1)
&& errno == EEXIST);
+ errno = 0;
+ ASSERT (renameatu (dfd, BASE "sub2", dfd, BASE "sub1", RENAME_EXCHANGE) < 0
+ ? errno == EINVAL || errno == ENOSYS || errno == ENOTSUP
+ : (renameatu (dfd, BASE "sub1/file", dfd, BASE "sub2/file",
+ RENAME_NOREPLACE)
+ == 0));
+
/* Cleanup. */
ASSERT (close (dfd) == 0);
ASSERT (unlink (BASE "sub2/file") == 0);