]> Savannah Git Hosting - gnulib.git/commitdiff
renameat2: port better to macOS
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 16 Aug 2017 00:09:35 +0000 (17:09 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 16 Aug 2017 00:10:04 +0000 (17:10 -0700)
* lib/renameat2.c (renameat2): Use renameatx_np if available.

ChangeLog
lib/renameat2.c

index bc0c169911a65983190aa4642c7ea1fa6bee9d4e..e4fe8dd61aa65e2de4c0c2fd1638befd7225370b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2017-08-15  Paul Eggert  <eggert@cs.ucla.edu>
 
+       renameat2: port better to macOS
+       * lib/renameat2.c (renameat2): Use renameatx_np if available.
+
        futimens: don’t assume struct timespec layout
        * m4/futimens.m4 (gl_FUNC_FUTIMENS):
        * m4/utimensat.m4 (gl_FUNC_UTIMENSAT):
index fd38a71e7fb822c22e40d9e5cad73d3b6256f01b..1e107fc50063990f692cc20a68117a0c4399c4da 100644 (file)
@@ -74,12 +74,25 @@ int
 renameat2 (int fd1, char const *src, int fd2, char const *dst,
            unsigned int flags)
 {
+  int ret_val = -1;
+  int err = EINVAL;
+
 #ifdef SYS_renameat2
-  int r = syscall (SYS_renameat2, fd1, src, fd2, dst, flags);
-  if (! (r < 0 && (errno == ENOSYS || errno == EINVAL)))
-    return r;
+  ret_val = syscall (SYS_renameat2, fd1, src, fd2, dst, flags);
+  err = errno;
+#elif defined RENAME_EXCL
+  if (! (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE)))
+    {
+      ret_val = renameatx_np (fd1, src, fd2, dst,
+                             ((flags & RENAME_EXCHANGE ? RENAME_SWAP : 0)
+                              | (flags & RENAME_NOREPLACE ? RENAME_EXCL : 0)));
+      err = errno;
+    }
 #endif
 
+  if (! (ret_val < 0 && (err == EINVAL || err == ENOSYS || err == ENOTSUP)))
+    return ret_val;
+
 #if HAVE_RENAMEAT
   {
   size_t src_len;
@@ -88,7 +101,6 @@ renameat2 (int fd1, char const *src, int fd2, char const *dst,
   char *dst_temp = (char *) dst;
   bool src_slash;
   bool dst_slash;
-  int ret_val;
   int rename_errno = ENOTDIR;
   struct stat src_st;
   struct stat dst_st;