diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index ca42b56ed..8aa272487 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -14,6 +14,7 @@ mod table; use blocks::HumanReadable; use table::HeaderMode; use uucore::display::Quotable; +use uucore::error::FromIo; use uucore::error::{UError, UResult, USimpleError}; use uucore::fsext::{read_fs_list, MountInfo}; use uucore::parse_size::ParseSizeError; @@ -333,7 +334,7 @@ fn filter_mount_list(vmi: Vec, opt: &Options) -> Vec { /// `opt` excludes certain filesystems from consideration and allows for the synchronization of filesystems before running; see /// [`Options`] for more information. -fn get_all_filesystems(opt: &Options) -> Vec { +fn get_all_filesystems(opt: &Options) -> Result, std::io::Error> { // Run a sync call before any operation if so instructed. if opt.sync { #[cfg(not(windows))] @@ -349,19 +350,19 @@ fn get_all_filesystems(opt: &Options) -> Vec { // // Filesystems excluded by the command-line options are // not considered. - let mounts: Vec = filter_mount_list(read_fs_list(), opt); + let mounts: Vec = filter_mount_list(read_fs_list()?, opt); // Convert each `MountInfo` into a `Filesystem`, which contains // both the mount information and usage information. - mounts + Ok(mounts .into_iter() .filter_map(|m| Filesystem::new(m, None)) .filter(|fs| opt.show_all_fs || fs.usage.blocks > 0) - .collect() + .collect()) } /// For each path, get the filesystem that contains that path. -fn get_named_filesystems

(paths: &[P], opt: &Options) -> Vec +fn get_named_filesystems

(paths: &[P], opt: &Options) -> Result, std::io::Error> where P: AsRef, { @@ -371,7 +372,7 @@ where // considered. The "lofs" filesystem is a loopback // filesystem present on Solaris and FreeBSD systems. It // is similar to a symbolic link. - let mounts: Vec = filter_mount_list(read_fs_list(), opt) + let mounts: Vec = filter_mount_list(read_fs_list()?, opt) .into_iter() .filter(|mi| mi.fs_type != "lofs" && !mi.dummy) .collect(); @@ -381,7 +382,7 @@ where // this happens if the file system type doesn't exist if mounts.is_empty() { show!(USimpleError::new(1, "no file systems processed")); - return result; + return Ok(result); } // Convert each path into a `Filesystem`, which contains @@ -402,7 +403,7 @@ where } } } - result + Ok(result) } #[derive(Debug)] @@ -443,7 +444,8 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { // Get the list of filesystems to display in the output table. let filesystems: Vec = match matches.values_of(OPT_PATHS) { None => { - let filesystems = get_all_filesystems(&opt); + let filesystems = get_all_filesystems(&opt) + .map_err_context(|| "cannot read table of mounted file systems".into())?; if filesystems.is_empty() { return Err(USimpleError::new(1, "no file systems processed")); @@ -453,7 +455,8 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } Some(paths) => { let paths: Vec<&str> = paths.collect(); - let filesystems = get_named_filesystems(&paths, &opt); + let filesystems = get_named_filesystems(&paths, &opt) + .map_err_context(|| "cannot read table of mounted file systems".into())?; // This can happen if paths are given as command-line arguments // but none of the paths exist. diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index 71960903c..c26bca394 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -8,7 +8,7 @@ #[macro_use] extern crate uucore; use uucore::display::Quotable; -use uucore::error::{UResult, USimpleError}; +use uucore::error::{FromIo, UResult, USimpleError}; use uucore::fs::display_permissions; use uucore::fsext::{ pretty_filetype, pretty_fstype, pretty_time, read_fs_list, statfs, BirthTime, FsMeta, @@ -502,6 +502,7 @@ impl Stater { None } else { let mut mount_list = read_fs_list() + .map_err_context(|| "cannot read table of mounted file systems".into())? .iter() .map(|mi| mi.mount_dir.clone()) .collect::>(); diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index 787684e93..8f2047355 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -405,22 +405,21 @@ use std::ptr; ))] use std::slice; /// Read file system list. -pub fn read_fs_list() -> Vec { +pub fn read_fs_list() -> Result, std::io::Error> { #[cfg(any(target_os = "linux", target_os = "android"))] { let (file_name, f) = File::open(LINUX_MOUNTINFO) .map(|f| (LINUX_MOUNTINFO, f)) - .or_else(|_| File::open(LINUX_MTAB).map(|f| (LINUX_MTAB, f))) - .expect("failed to find mount list files"); + .or_else(|_| File::open(LINUX_MTAB).map(|f| (LINUX_MTAB, f)))?; let reader = BufReader::new(f); - reader + Ok(reader .lines() .filter_map(|line| line.ok()) .filter_map(|line| { let raw_data = line.split_whitespace().collect::>(); MountInfo::new(file_name, &raw_data) }) - .collect::>() + .collect::>()) } #[cfg(any( target_os = "freebsd", @@ -435,10 +434,10 @@ pub fn read_fs_list() -> Vec { crash!(1, "get_mount_info() failed"); } let mounts = unsafe { slice::from_raw_parts(mount_buffer_ptr, len as usize) }; - mounts + Ok(mounts .iter() .map(|m| MountInfo::from(*m)) - .collect::>() + .collect::>()) } #[cfg(windows)] { @@ -482,12 +481,12 @@ pub fn read_fs_list() -> Vec { unsafe { FindVolumeClose(find_handle); } - mounts + Ok(mounts) } #[cfg(any(target_os = "redox", target_os = "illumos", target_os = "solaris"))] { // No method to read mounts, yet - Vec::new() + Ok(Vec::new()) } }