fixes blocksize error in get_blocksize().

Under Linux, MetadataExt::st_blocks() returns then number of 512B
blocks.

https://doc.rust-lang.org/1.23.0/std/os/linux/fs/trait.MetadataExt.html#tymethod.st_blocks
This commit is contained in:
Joe Ardent
2018-03-22 00:34:14 -07:00
parent eb69ad19a0
commit aa3f411974
+17 -8
View File
@@ -1,22 +1,25 @@
use std; use std;
#[cfg(not(target_os = "macos"))] #[cfg(not(any(target_os = "macos", target_os = "linux")))]
pub fn get_block_size() -> u64 { pub fn get_block_size() -> u64 {
1024 1024
} }
#[cfg(target_os = "macos")] #[cfg(any(target_os = "macos", target_os = "linux"))]
pub fn get_block_size() -> u64 { pub fn get_block_size() -> u64 {
512 512
} }
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
pub fn get_metadata(d: &std::fs::DirEntry, s: bool) -> Option<(u64, Option<(u64, u64)>)> { pub fn get_metadata(
d: &std::fs::DirEntry,
use_apparent_size: bool,
) -> Option<(u64, Option<(u64, u64)>)> {
use std::os::linux::fs::MetadataExt; use std::os::linux::fs::MetadataExt;
match d.metadata().ok() { match d.metadata().ok() {
Some(md) => { Some(md) => {
let inode = Some((md.st_ino(), md.st_dev())); let inode = Some((md.st_ino(), md.st_dev()));
if s { if use_apparent_size {
Some((md.len(), inode)) Some((md.len(), inode))
} else { } else {
Some((md.st_blocks() * get_block_size(), inode)) Some((md.st_blocks() * get_block_size(), inode))
@@ -27,12 +30,15 @@ pub fn get_metadata(d: &std::fs::DirEntry, s: bool) -> Option<(u64, Option<(u64,
} }
#[cfg(target_os = "unix")] #[cfg(target_os = "unix")]
pub fn get_metadata(d: &std::fs::DirEntry, s: bool) -> Option<(u64, Option<(u64, u64)>)> { pub fn get_metadata(
d: &std::fs::DirEntry,
use_apparent_size: bool,
) -> Option<(u64, Option<(u64, u64)>)> {
use std::os::unix::fs::MetadataExt; use std::os::unix::fs::MetadataExt;
match d.metadata().ok() { match d.metadata().ok() {
Some(md) => { Some(md) => {
let inode = Some((md.ino(), md.dev())); let inode = Some((md.ino(), md.dev()));
if s { if use_apparent_size {
Some((md.len(), inode)) Some((md.len(), inode))
} else { } else {
Some((md.blocks() * get_block_size(), inode)) Some((md.blocks() * get_block_size(), inode))
@@ -43,12 +49,15 @@ pub fn get_metadata(d: &std::fs::DirEntry, s: bool) -> Option<(u64, Option<(u64,
} }
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
pub fn get_metadata(d: &std::fs::DirEntry, s: bool) -> Option<(u64, Option<(u64, u64)>)> { pub fn get_metadata(
d: &std::fs::DirEntry,
use_apparent_size: bool,
) -> Option<(u64, Option<(u64, u64)>)> {
use std::os::macos::fs::MetadataExt; use std::os::macos::fs::MetadataExt;
match d.metadata().ok() { match d.metadata().ok() {
Some(md) => { Some(md) => {
let inode = Some((md.st_ino(), md.st_dev())); let inode = Some((md.st_ino(), md.st_dev()));
if s { if use_apparent_size {
Some((md.len(), inode)) Some((md.len(), inode))
} else { } else {
Some((md.st_blocks() * get_block_size(), inode)) Some((md.st_blocks() * get_block_size(), inode))