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() + }) +}