From 1a23312c77b74e0e896700733a189f8ecfdcbc1f Mon Sep 17 00:00:00 2001 From: Tom Boland Date: Thu, 8 Jul 2021 22:08:48 +0100 Subject: Adding linux specific renameat2() --- src/fcntl.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src/fcntl.rs') diff --git a/src/fcntl.rs b/src/fcntl.rs index ec6db00a..f8f1372a 100644 --- a/src/fcntl.rs +++ b/src/fcntl.rs @@ -210,6 +210,43 @@ pub fn renameat( Errno::result(res).map(drop) } +#[cfg(all( + target_os = "linux", + target_env = "gnu", +))] +libc_bitflags! { + pub struct RenameFlags: u32 { + RENAME_EXCHANGE; + RENAME_NOREPLACE; + RENAME_WHITEOUT; + } +} + +#[cfg(all( + target_os = "linux", + target_env = "gnu", +))] +pub fn renameat2( + old_dirfd: Option, + old_path: &P1, + new_dirfd: Option, + new_path: &P2, + flags: RenameFlags, +) -> Result<()> { + let res = old_path.with_nix_path(|old_cstr| { + new_path.with_nix_path(|new_cstr| unsafe { + libc::renameat2( + at_rawfd(old_dirfd), + old_cstr.as_ptr(), + at_rawfd(new_dirfd), + new_cstr.as_ptr(), + flags.bits(), + ) + }) + })??; + Errno::result(res).map(drop) +} + fn wrap_readlink_result(mut v: Vec, len: ssize_t) -> Result { unsafe { v.set_len(len as usize) } v.shrink_to_fit(); -- cgit v1.2.3