From 6bb7ae5c4f11942840da2deef9ee367d591c3fb6 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Thu, 30 Jan 2025 18:11:32 +0100 Subject: [PATCH] treewide: refactor mkdir, write_file and read_file mkdir, read_file write_file augment the error case with the path in the error case. This is useful as we otherwise don't know which location failed. This commit refactors the functions to take any argument that coerces into a Path - which is implemented by many types. mkdir now uses create_dir_all as it is not meant to fail if the directory already exists. Signed-off-by: Stefan Kerkmann --- src/main.rs | 17 +++-------------- src/mount.rs | 3 ++- src/systemd.rs | 3 ++- src/usbg_9pfs.rs | 9 +++------ src/util.rs | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 src/util.rs diff --git a/src/main.rs b/src/main.rs index 60c41bf..8d499e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ use std::env; use std::env::current_exe; use std::ffi::CString; use std::fmt::Write as _; -use std::fs::{create_dir, read_to_string, File, OpenOptions}; +use std::fs::{File, OpenOptions}; use std::io; use std::io::Write as _; use std::os::fd::{AsFd, AsRawFd, RawFd}; @@ -25,6 +25,7 @@ use nix::unistd::{chdir, chroot, dup2, execv, unlink}; use systemd::{mount_systemd, shutdown}; #[cfg(feature = "usb9pfs")] use usbg_9pfs::prepare_9pfs_gadget; +use util::read_file; mod cmdline; #[cfg(feature = "dmverity")] @@ -34,22 +35,10 @@ mod mount; mod systemd; #[cfg(feature = "usb9pfs")] mod usbg_9pfs; +mod util; type Result = std::result::Result>; -pub fn mkdir(dir: &str) -> Result<()> { - if let Err(e) = create_dir(dir) { - if e.kind() != io::ErrorKind::AlreadyExists { - return Err(format!("Failed to create {dir}: {e}",).into()); - } - } - Ok(()) -} - -fn read_file(filename: &str) -> std::result::Result { - read_to_string(filename).map_err(|e| format!("Failed to read {filename}: {e}")) -} - /* * Setup stdout/stderr. The kernel will create /dev/console in the * initramfs, so we can use that. diff --git a/src/mount.rs b/src/mount.rs index 43a55f8..65a0caf 100644 --- a/src/mount.rs +++ b/src/mount.rs @@ -7,7 +7,8 @@ use log::debug; use nix::mount::{mount, MsFlags}; use crate::cmdline::CmdlineOptions; -use crate::{mkdir, Result}; +use crate::util::mkdir; +use crate::Result; pub fn do_mount( src: Option<&str>, diff --git a/src/systemd.rs b/src/systemd.rs index 8469a09..1a295f1 100644 --- a/src/systemd.rs +++ b/src/systemd.rs @@ -10,7 +10,8 @@ use nix::sys::reboot::{reboot, RebootMode}; use crate::cmdline::CmdlineOptions; use crate::mount::do_mount; -use crate::{mkdir, Result}; +use crate::util::mkdir; +use crate::Result; pub fn mount_systemd(options: &mut CmdlineOptions) -> Result<()> { do_mount( diff --git a/src/usbg_9pfs.rs b/src/usbg_9pfs.rs index 601a925..fe96c90 100644 --- a/src/usbg_9pfs.rs +++ b/src/usbg_9pfs.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only -use std::fs::{read_dir, write}; +use std::fs::read_dir; use std::os::unix::ffi::OsStrExt; use std::os::unix::fs::symlink; use std::{thread, time}; @@ -9,11 +9,8 @@ use log::debug; use crate::cmdline::CmdlineOptions; use crate::mount::mount_apivfs; -use crate::{mkdir, Result}; - -fn write_file>(path: &str, content: C) -> Result<()> { - write(path, content).map_err(|e| format!("Failed to write to {path}: {e}").into()) -} +use crate::util::{mkdir, write_file}; +use crate::Result; fn setup_9pfs_gadget(device: &String) -> Result<()> { debug!("Initializing USB 9pfs gadget ..."); diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..575f94e --- /dev/null +++ b/src/util.rs @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0-only + +use std::{ + fs::{create_dir_all, read_to_string, write}, + path::Path, +}; + +use crate::Result; + +pub(crate) fn mkdir(dir: impl AsRef) -> Result<()> { + create_dir_all(dir.as_ref()).map_err(|e| { + format!( + "Failed to create directory {}: {e}", + dir.as_ref().to_string_lossy() + ) + .into() + }) +} + +pub(crate) fn read_file(filename: impl AsRef) -> Result { + read_to_string(filename.as_ref()).map_err(|e| { + format!( + "Failed to read {}: {e}", + filename.as_ref().to_string_lossy() + ) + .into() + }) +} + +pub(crate) fn write_file>(path: impl AsRef, content: C) -> Result<()> { + write(&path, content).map_err(|e| { + format!( + "Failed to write to {}: {e}", + path.as_ref().to_string_lossy() + ) + .into() + }) +}