aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--include/stdio.h2
-rw-r--r--stdio-common/renameat2.c4
-rw-r--r--sysdeps/mach/hurd/renameat.c21
-rw-r--r--sysdeps/mach/hurd/renameat2.c56
-rw-r--r--sysdeps/unix/sysv/linux/renameat2.c4
6 files changed, 73 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index de34cdd005..efe62c1dbe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2019-02-27 Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+ * include/stdio.h (__renameat2): New hidden prototype.
+ * stdio-common/renameat2.c (__renameat2): Add hidden definition.
+ * sysdeps/mach/hurd/renameat.c (__renameat): Move implementation to...
+ * sysdeps/mach/hurd/renameat2.c (__renameat2): ... new function.
+ * sysdeps/unix/sysv/linux/renameat2.c (__renameat2): Add hidden definition.
+
2019-02-27 Joseph Myers <joseph@codesourcery.com>
* hurd/hurdinit.c (_hurd_init): Use braces around empty body of an
diff --git a/include/stdio.h b/include/stdio.h
index 7d1877ea5e..5302e61024 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -261,6 +261,8 @@ __putc_unlocked (int __c, FILE *__stream)
extern __typeof (renameat) __renameat;
libc_hidden_proto (__renameat)
+extern __typeof (renameat2) __renameat2;
+libc_hidden_proto (__renameat2)
# endif /* not _ISOMAC */
#endif /* stdio.h */
diff --git a/stdio-common/renameat2.c b/stdio-common/renameat2.c
index ce60173455..00cb2ec6c5 100644
--- a/stdio-common/renameat2.c
+++ b/stdio-common/renameat2.c
@@ -20,7 +20,7 @@
#include <stdio.h>
int
-renameat2 (int oldfd, const char *old, int newfd, const char *new,
+__renameat2 (int oldfd, const char *old, int newfd, const char *new,
unsigned int flags)
{
if (flags == 0)
@@ -28,3 +28,5 @@ renameat2 (int oldfd, const char *old, int newfd, const char *new,
__set_errno (EINVAL);
return -1;
}
+libc_hidden_def (__renameat2)
+weak_alias (__renameat2, renameat2)
diff --git a/sysdeps/mach/hurd/renameat.c b/sysdeps/mach/hurd/renameat.c
index 9aa231091c..a05f550a57 100644
--- a/sysdeps/mach/hurd/renameat.c
+++ b/sysdeps/mach/hurd/renameat.c
@@ -24,26 +24,7 @@
int
__renameat (int oldfd, const char *old, int newfd, const char *new)
{
- error_t err;
- file_t olddir, newdir;
- const char *oldname, *newname;
-
- olddir = __directory_name_split_at (oldfd, old, (char **) &oldname);
- if (olddir == MACH_PORT_NULL)
- return -1;
- newdir = __directory_name_split_at (newfd, new, (char **) &newname);
- if (newdir == MACH_PORT_NULL)
- {
- __mach_port_deallocate (__mach_task_self (), olddir);
- return -1;
- }
-
- err = __dir_rename (olddir, oldname, newdir, newname, 0);
- __mach_port_deallocate (__mach_task_self (), olddir);
- __mach_port_deallocate (__mach_task_self (), newdir);
- if (err)
- return __hurd_fail (err);
- return 0;
+ return __renameat2 (oldfd, old, newfd, new, 0);
}
libc_hidden_def (__renameat)
weak_alias (__renameat, renameat)
diff --git a/sysdeps/mach/hurd/renameat2.c b/sysdeps/mach/hurd/renameat2.c
new file mode 100644
index 0000000000..2ed49cbac9
--- /dev/null
+++ b/sysdeps/mach/hurd/renameat2.c
@@ -0,0 +1,56 @@
+/* Rename a file using relative source and destination names. Hurd version.
+ Copyright (C) 1991-2019 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+/* Rename the file OLD relative to OLDFD to NEW relative to NEWFD. */
+int
+__renameat2 (int oldfd, const char *old, int newfd, const char *new,
+ unsigned int flags)
+{
+ error_t err;
+ file_t olddir, newdir;
+ const char *oldname, *newname;
+ int excl = 0;
+
+ if (flags & (RENAME_EXCHANGE | RENAME_WHITEOUT))
+ return __hurd_fail (ENOSYS);
+ if (flags & RENAME_NOREPLACE)
+ excl = 1;
+
+ olddir = __directory_name_split_at (oldfd, old, (char **) &oldname);
+ if (olddir == MACH_PORT_NULL)
+ return -1;
+ newdir = __directory_name_split_at (newfd, new, (char **) &newname);
+ if (newdir == MACH_PORT_NULL)
+ {
+ __mach_port_deallocate (__mach_task_self (), olddir);
+ return -1;
+ }
+
+ err = __dir_rename (olddir, oldname, newdir, newname, excl);
+ __mach_port_deallocate (__mach_task_self (), olddir);
+ __mach_port_deallocate (__mach_task_self (), newdir);
+ if (err)
+ return __hurd_fail (err);
+ return 0;
+}
+libc_hidden_def (__renameat2)
+weak_alias (__renameat2, renameat2)
diff --git a/sysdeps/unix/sysv/linux/renameat2.c b/sysdeps/unix/sysv/linux/renameat2.c
index 566868cc93..a9cc2ea6b8 100644
--- a/sysdeps/unix/sysv/linux/renameat2.c
+++ b/sysdeps/unix/sysv/linux/renameat2.c
@@ -21,7 +21,7 @@
#include <sysdep.h>
int
-renameat2 (int oldfd, const char *old, int newfd, const char *new,
+__renameat2 (int oldfd, const char *old, int newfd, const char *new,
unsigned int flags)
{
#if !defined (__NR_renameat) || defined (__ASSUME_RENAMEAT2)
@@ -42,3 +42,5 @@ renameat2 (int oldfd, const char *old, int newfd, const char *new,
return -1;
#endif
}
+libc_hidden_def (__renameat2)
+weak_alias (__renameat2, renameat2)