about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorDavid Vázquez Púa <davazp@gmail.com>2019-04-19 20:42:52 +0200
committerDavid Vázquez Púa <davazp@gmail.com>2019-04-19 20:42:52 +0200
commitd602a6b942e32f4f9a36b6c44471cfcd80a81bb6 (patch)
tree196c3242a6a6a4bcf96e525aac5e5927b197c32b /src/libstd
parenta2bbf7debaab60be33bd8008a71bca69576945a0 (diff)
downloadrust-d602a6b942e32f4f9a36b6c44471cfcd80a81bb6.tar.gz
rust-d602a6b942e32f4f9a36b6c44471cfcd80a81bb6.zip
Fix sync_all on macos/ios
sync_all should flush all metadata in macos/ios, so it should call
fcntl with the F_FULLFSYNC flag as sync_data does.

Fixes #55920
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sys/unix/fs.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs
index a14db108c34..761f1d8c673 100644
--- a/src/libstd/sys/unix/fs.rs
+++ b/src/libstd/sys/unix/fs.rs
@@ -526,8 +526,15 @@ impl File {
     }
 
     pub fn fsync(&self) -> io::Result<()> {
-        cvt_r(|| unsafe { libc::fsync(self.0.raw()) })?;
-        Ok(())
+        cvt_r(|| unsafe { os_fsync(self.0.raw()) })?;
+        return Ok(());
+
+        #[cfg(any(target_os = "macos", target_os = "ios"))]
+        unsafe fn os_fsync(fd: c_int) -> c_int {
+            libc::fcntl(fd, libc::F_FULLFSYNC)
+        }
+        #[cfg(not(any(target_os = "macos", target_os = "ios")))]
+        unsafe fn os_fsync(fd: c_int) -> c_int { libc::fsync(fd) }
     }
 
     pub fn datasync(&self) -> io::Result<()> {