@@ -1847,47 +1847,17 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> {
18471847pub fn copy ( from : & Path , to : & Path ) -> io:: Result < u64 > {
18481848 use crate :: sync:: atomic:: { AtomicBool , Ordering } ;
18491849
1850- const COPYFILE_ACL : u32 = 1 << 0 ;
1851- const COPYFILE_STAT : u32 = 1 << 1 ;
1852- const COPYFILE_XATTR : u32 = 1 << 2 ;
1853- const COPYFILE_DATA : u32 = 1 << 3 ;
1854-
1855- const COPYFILE_SECURITY : u32 = COPYFILE_STAT | COPYFILE_ACL ;
1856- const COPYFILE_METADATA : u32 = COPYFILE_SECURITY | COPYFILE_XATTR ;
1857- const COPYFILE_ALL : u32 = COPYFILE_METADATA | COPYFILE_DATA ;
1858-
1859- const COPYFILE_STATE_COPIED : u32 = 8 ;
1860-
1861- #[ allow( non_camel_case_types) ]
1862- type copyfile_state_t = * mut libc:: c_void ;
1863- #[ allow( non_camel_case_types) ]
1864- type copyfile_flags_t = u32 ;
1865-
1866- extern "C" {
1867- fn fcopyfile (
1868- from : libc:: c_int ,
1869- to : libc:: c_int ,
1870- state : copyfile_state_t ,
1871- flags : copyfile_flags_t ,
1872- ) -> libc:: c_int ;
1873- fn copyfile_state_alloc ( ) -> copyfile_state_t ;
1874- fn copyfile_state_free ( state : copyfile_state_t ) -> libc:: c_int ;
1875- fn copyfile_state_get (
1876- state : copyfile_state_t ,
1877- flag : u32 ,
1878- dst : * mut libc:: c_void ,
1879- ) -> libc:: c_int ;
1880- }
1881-
1882- struct FreeOnDrop ( copyfile_state_t ) ;
1850+ const COPYFILE_ALL : libc:: copyfile_flags_t = libc:: COPYFILE_METADATA | libc:: COPYFILE_DATA ;
1851+
1852+ struct FreeOnDrop ( libc:: copyfile_state_t ) ;
18831853 impl Drop for FreeOnDrop {
18841854 fn drop ( & mut self ) {
18851855 // The code below ensures that `FreeOnDrop` is never a null pointer
18861856 unsafe {
18871857 // `copyfile_state_free` returns -1 if the `to` or `from` files
18881858 // cannot be closed. However, this is not considered this an
18891859 // error.
1890- copyfile_state_free ( self . 0 ) ;
1860+ libc :: copyfile_state_free ( self . 0 ) ;
18911861 }
18921862 }
18931863 }
@@ -1896,6 +1866,7 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> {
18961866 // We store the availability in a global to avoid unnecessary syscalls
18971867 static HAS_FCLONEFILEAT : AtomicBool = AtomicBool :: new ( true ) ;
18981868 syscall ! {
1869+ // Mirrors `libc::fclonefileat`
18991870 fn fclonefileat(
19001871 srcfd: libc:: c_int,
19011872 dst_dirfd: libc:: c_int,
@@ -1932,22 +1903,22 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> {
19321903 // We ensure that `FreeOnDrop` never contains a null pointer so it is
19331904 // always safe to call `copyfile_state_free`
19341905 let state = unsafe {
1935- let state = copyfile_state_alloc ( ) ;
1906+ let state = libc :: copyfile_state_alloc ( ) ;
19361907 if state. is_null ( ) {
19371908 return Err ( crate :: io:: Error :: last_os_error ( ) ) ;
19381909 }
19391910 FreeOnDrop ( state)
19401911 } ;
19411912
1942- let flags = if writer_metadata. is_file ( ) { COPYFILE_ALL } else { COPYFILE_DATA } ;
1913+ let flags = if writer_metadata. is_file ( ) { COPYFILE_ALL } else { libc :: COPYFILE_DATA } ;
19431914
1944- cvt ( unsafe { fcopyfile ( reader. as_raw_fd ( ) , writer. as_raw_fd ( ) , state. 0 , flags) } ) ?;
1915+ cvt ( unsafe { libc :: fcopyfile ( reader. as_raw_fd ( ) , writer. as_raw_fd ( ) , state. 0 , flags) } ) ?;
19451916
19461917 let mut bytes_copied: libc:: off_t = 0 ;
19471918 cvt ( unsafe {
1948- copyfile_state_get (
1919+ libc :: copyfile_state_get (
19491920 state. 0 ,
1950- COPYFILE_STATE_COPIED ,
1921+ libc :: COPYFILE_STATE_COPIED as u32 ,
19511922 core:: ptr:: addr_of_mut!( bytes_copied) as * mut libc:: c_void ,
19521923 )
19531924 } ) ?;
0 commit comments