1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
crate::ix!();

/**
  | Ensure file contents are fully committed
  | to disk, using a platform-specific
  | feature analogous to fsync().
  |
  */
pub fn file_commit(file: *mut libc::FILE) -> bool {

    unsafe {

        if libc::fflush(file) != 0 {

            // harmless if redundantly called
            log_printf!{
                "{}: fflush failed: {}\n",
                func,
                errno
            };

            return false;
        }

        #[cfg(WIN32)]
        {
            let h_file: HANDLE = get_osfhandle(fileno(file)) as HANDLE;

            if flush_file_buffers(h_file) == 0 {

                log_printf!{
                    "{}: FlushFileBuffers failed: {}\n", 
                    func, 
                    get_last_error()
                };

                return false;
            }

            return true;
        }

        #[cfg(all(MAC_OSX,F_FULLFSYNC))]
        {
            if fcntl(fileno(file),fullfsync,0) == -1 {

                // Manpage says "value other than -1"
                // is returned on success
                log_printf!{
                    "{}: fcntl F_FULLFSYNC failed: {}\n",
                    func,
                    errno
                };

                return false;
            }

            return true;
        }

        #[cfg(HAVE_FDATASYNC)]
        {
            if fdatasync(fileno(file)) != 0 && errno != einval {

                // Ignore EINVAL for filesystems that
                // don't support sync
                log_printf!{
                    "{}: fdatasync failed: {}\n",
                    func,
                    errno
                };

                return false;
            }

            return true;
        }

        if libc::fsync(libc::fileno(file)) != 0 && errno().0 != libc::EINVAL {

            log_printf!{
                "{}: fsync failed: {}\n", 
                func, 
                errno
            };

            return false;
        }
    }

    true
}