aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2019-02-27 07:53:13 -0800
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2019-02-27 09:42:44 -0800
commit1b2184177553ce4ef8458034927ef50854be2af6 (patch)
treeb91ea628502ebbb23a2c9beae90917262cede379 /sysdeps
parentf627dd4da804c00b5e89e5e2c488c2bad6205262 (diff)
downloadglibc-1b2184177553ce4ef8458034927ef50854be2af6.tar
glibc-1b2184177553ce4ef8458034927ef50854be2af6.tar.gz
glibc-1b2184177553ce4ef8458034927ef50854be2af6.tar.bz2
glibc-1b2184177553ce4ef8458034927ef50854be2af6.zip
hurd: Add renameat2 support for RENAME_NOREPLACE
* 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, and add support for RENAME_NOREPLACE. * sysdeps/unix/sysv/linux/renameat2.c (__renameat2): Add hidden definition.
Diffstat (limited to 'sysdeps')
-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
3 files changed, 60 insertions, 21 deletions
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)