Skip to content

Commit 2609db6

Browse files
committed
kargs: parser cleanups
- Accept &str vs owned String, allowing dropping unnecessary `clone` - It isn't parsing a file necessarily, just a string buffer, so rename it - Drop unnecessary `pub` - Add doc comment - Add error context to callers to be clear *which* file we failed to parse Signed-off-by: Colin Walters <[email protected]>
1 parent 5e9279d commit 2609db6

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

lib/src/kargs.rs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
use anyhow::Ok;
2-
use anyhow::Result;
1+
use anyhow::{Context, Result};
32
use ostree::gio;
43
use ostree_ext::ostree;
54
use ostree_ext::ostree::Deployment;
@@ -41,9 +40,10 @@ pub(crate) fn get_kargs(
4140
// Get the kargs in kargs.d of the booted system
4241
let mut existing_kargs: Vec<String> = vec![];
4342
let fragments = liboverdrop::scan(&["/usr/lib"], "bootc/kargs.d", &["toml"], true);
44-
for (_name, path) in fragments {
43+
for (name, path) in fragments {
4544
let s = std::fs::read_to_string(&path)?;
46-
let mut parsed_kargs = parse_file(s.clone(), sys_arch.clone())?;
45+
let mut parsed_kargs =
46+
parse_kargs_toml(&s, &sys_arch).with_context(|| format!("Parsing {name:?}"))?;
4747
existing_kargs.append(&mut parsed_kargs);
4848
}
4949

@@ -79,7 +79,8 @@ pub(crate) fn get_kargs(
7979
let mut reader =
8080
ostree_ext::prelude::InputStreamExtManual::into_read(file_content.unwrap());
8181
let s = std::io::read_to_string(&mut reader)?;
82-
let mut parsed_kargs = parse_file(s.clone(), sys_arch.clone())?;
82+
let mut parsed_kargs =
83+
parse_kargs_toml(&s, &sys_arch).with_context(|| format!("Parsing {name}"))?;
8384
remote_kargs.append(&mut parsed_kargs);
8485
}
8586
}
@@ -110,15 +111,18 @@ pub(crate) fn get_kargs(
110111
Ok(kargs)
111112
}
112113

113-
pub fn parse_file(file_content: String, sys_arch: String) -> Result<Vec<String>> {
114-
let mut de: Config = toml::from_str(&file_content)?;
114+
/// This parses a bootc kargs.d toml file, returning the resulting
115+
/// vector of kernel arguments. Architecture matching is performed using
116+
/// `sys_arch`.
117+
fn parse_kargs_toml(contents: &str, sys_arch: &str) -> Result<Vec<String>> {
118+
let mut de: Config = toml::from_str(contents)?;
115119
let mut parsed_kargs: Vec<String> = vec![];
116120
// if arch specified, apply kargs only if the arch matches
117121
// if arch not specified, apply kargs unconditionally
118122
match de.match_architectures {
119123
None => parsed_kargs = de.kargs,
120124
Some(match_architectures) => {
121-
if match_architectures.contains(&sys_arch) {
125+
if match_architectures.iter().any(|s| s == sys_arch) {
122126
parsed_kargs.append(&mut de.kargs);
123127
}
124128
}
@@ -132,10 +136,10 @@ fn test_arch() {
132136
// no arch specified, kargs ensure that kargs are applied unconditionally
133137
let sys_arch = "x86_64".to_string();
134138
let file_content = r##"kargs = ["console=tty0", "nosmt"]"##.to_string();
135-
let parsed_kargs = parse_file(file_content.clone(), sys_arch.clone()).unwrap();
139+
let parsed_kargs = parse_kargs_toml(&file_content, &sys_arch).unwrap();
136140
assert_eq!(parsed_kargs, ["console=tty0", "nosmt"]);
137141
let sys_arch = "aarch64".to_string();
138-
let parsed_kargs = parse_file(file_content.clone(), sys_arch.clone()).unwrap();
142+
let parsed_kargs = parse_kargs_toml(&file_content, &sys_arch).unwrap();
139143
assert_eq!(parsed_kargs, ["console=tty0", "nosmt"]);
140144

141145
// one arch matches and one doesn't, ensure that kargs are only applied for the matching arch
@@ -144,13 +148,13 @@ fn test_arch() {
144148
match-architectures = ["x86_64"]
145149
"##
146150
.to_string();
147-
let parsed_kargs = parse_file(file_content.clone(), sys_arch.clone()).unwrap();
151+
let parsed_kargs = parse_kargs_toml(&file_content, &sys_arch).unwrap();
148152
assert_eq!(parsed_kargs, [] as [String; 0]);
149153
let file_content = r##"kargs = ["console=tty0", "nosmt"]
150154
match-architectures = ["aarch64"]
151155
"##
152156
.to_string();
153-
let parsed_kargs = parse_file(file_content.clone(), sys_arch.clone()).unwrap();
157+
let parsed_kargs = parse_kargs_toml(&file_content, &sys_arch).unwrap();
154158
assert_eq!(parsed_kargs, ["console=tty0", "nosmt"]);
155159

156160
// multiple arch specified, ensure that kargs are applied to both archs
@@ -159,9 +163,9 @@ match-architectures = ["aarch64"]
159163
match-architectures = ["x86_64", "aarch64"]
160164
"##
161165
.to_string();
162-
let parsed_kargs = parse_file(file_content.clone(), sys_arch.clone()).unwrap();
166+
let parsed_kargs = parse_kargs_toml(&file_content, &sys_arch).unwrap();
163167
assert_eq!(parsed_kargs, ["console=tty0", "nosmt"]);
164168
std::env::set_var("ARCH", "aarch64");
165-
let parsed_kargs = parse_file(file_content.clone(), sys_arch.clone()).unwrap();
169+
let parsed_kargs = parse_kargs_toml(&file_content, &sys_arch).unwrap();
166170
assert_eq!(parsed_kargs, ["console=tty0", "nosmt"]);
167171
}

0 commit comments

Comments
 (0)