// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

//! This module contains all the unsafe code necessary for this crate.

extern crate libc;

use std::ffi::CString;
use std::mem::zeroed;
use std::os::unix::ffi::OsStrExt;
use std::path::Path;

use self::libc::{__errno_location, statvfs64, EINTR, EINVAL};

/// Gets free disk space in bytes on the filesystem that contains `path`. Returns a positive `errno`
/// on failure.
pub fn get_free_disk_space<P: AsRef<Path>>(path: P) -> Result<u64, i32> {
    let path_cstr = CString::new(path.as_ref().as_os_str().as_bytes()).or(Err(EINVAL))?;

    // Safe because `stats` is never accessed until after being initialized by the `statvfs64` call
    // returns successfully.
    let mut stats: statvfs64 = unsafe { zeroed() };
    let mut errno = EINTR;
    while errno == EINTR {
        // Safe because a valid C-style string is passed in, along with the correct type of mutable
        // pointer for returned data. The return value is also checked for errors.
        unsafe {
            if statvfs64(path_cstr.as_ptr(), &mut stats) == 0 {
                // This clippy override is needed because the type of `stats.f_frsize` is sometimes
                // `u64` depending on the target architecture.
                #[cfg_attr(feature = "cargo-clippy", allow(identity_conversion))]
                return Ok(stats.f_bavail.saturating_mul(u64::from(stats.f_frsize)));
            }
            errno = *__errno_location();
        }
    }

    Err(errno)
}

#[cfg(test)]
mod tests {
    use super::*;
    use std::process::Command;
    use unsafe_misc::libc::ENOENT;

    #[test]
    #[ignore]
    fn same_as_df() {
        let free_bytes = get_free_disk_space(".").expect("failed to get free disk space");
        let df_free_bytes = String::from_utf8(
            Command::new("df")
                .args(&["--output=avail", "--block-size=1", "."])
                .output()
                .unwrap()
                .stdout,
        )
        .unwrap();
        println!("get_free_disk_space reports {}", free_bytes);
        println!("df reports {}", df_free_bytes);
        assert!(df_free_bytes.trim().ends_with(&format!("{}", free_bytes)));
    }

    #[test]
    fn invalid_nul() {
        assert_eq!(get_free_disk_space("./\0"), Err(EINVAL));
    }

    #[test]
    fn no_such_path() {
        assert_eq!(
            get_free_disk_space("/this/path/should/not/exist"),
            Err(ENOENT)
        );
    }
}
