From 0e3ad481706ff2f1e83487517415d251179ce3c3 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Tue, 15 Aug 2023 14:09:23 +0200 Subject: boost modify_cmdline speed by starting replacement at its offset on disk --- src/error.rs | 2 ++ src/main.rs | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/error.rs b/src/error.rs index 6f8e217..97fa882 100644 --- a/src/error.rs +++ b/src/error.rs @@ -4,6 +4,8 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum Error { + #[error("can't find cmdline (/cmdline.txt) on boot partition")] + NoCmdline, #[error("can't find disk device")] NoDiskDev, #[error("no private keys found in file")] diff --git a/src/main.rs b/src/main.rs index 89db44c..f72da42 100644 --- a/src/main.rs +++ b/src/main.rs @@ -279,12 +279,21 @@ where fn modify_cmdline(old: &str, new: &str) -> Result<()> { let boot = boot_dev()?; + let mut buf = fs::read(boot)?; - let mut cmdline = fs::read(boot)?; - replace_slice(&mut cmdline, old.as_bytes(), new.as_bytes()); - fs::write(boot, cmdline)?; + let cmdline_buf = fs::read("/boot/cmdline.txt")?; + let cmdline_offset = buf + .windows(cmdline_buf.len()) + .position(|window| window == cmdline_buf) + .ok_or(Error::NoCmdline)? + / 512 + + 1; + replace_slice(&mut buf[cmdline_offset..], old.as_bytes(), new.as_bytes()); + + fs::write(boot, buf)?; nix::unistd::sync(); + Ok(()) } -- cgit v1.2.3