1
- use anyhow:: Ok ;
2
- use anyhow:: Result ;
1
+ use anyhow:: { Context , Result } ;
3
2
use ostree:: gio;
4
3
use ostree_ext:: ostree;
5
4
use ostree_ext:: ostree:: Deployment ;
@@ -41,9 +40,10 @@ pub(crate) fn get_kargs(
41
40
// Get the kargs in kargs.d of the booted system
42
41
let mut existing_kargs: Vec < String > = vec ! [ ] ;
43
42
let fragments = liboverdrop:: scan ( & [ "/usr/lib" ] , "bootc/kargs.d" , & [ "toml" ] , true ) ;
44
- for ( _name , path) in fragments {
43
+ for ( name , path) in fragments {
45
44
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:?}" ) ) ?;
47
47
existing_kargs. append ( & mut parsed_kargs) ;
48
48
}
49
49
@@ -79,7 +79,8 @@ pub(crate) fn get_kargs(
79
79
let mut reader =
80
80
ostree_ext:: prelude:: InputStreamExtManual :: into_read ( file_content. unwrap ( ) ) ;
81
81
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}" ) ) ?;
83
84
remote_kargs. append ( & mut parsed_kargs) ;
84
85
}
85
86
}
@@ -110,15 +111,18 @@ pub(crate) fn get_kargs(
110
111
Ok ( kargs)
111
112
}
112
113
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) ?;
115
119
let mut parsed_kargs: Vec < String > = vec ! [ ] ;
116
120
// if arch specified, apply kargs only if the arch matches
117
121
// if arch not specified, apply kargs unconditionally
118
122
match de. match_architectures {
119
123
None => parsed_kargs = de. kargs ,
120
124
Some ( match_architectures) => {
121
- if match_architectures. contains ( & sys_arch) {
125
+ if match_architectures. iter ( ) . any ( |s| s == sys_arch) {
122
126
parsed_kargs. append ( & mut de. kargs ) ;
123
127
}
124
128
}
@@ -132,10 +136,10 @@ fn test_arch() {
132
136
// no arch specified, kargs ensure that kargs are applied unconditionally
133
137
let sys_arch = "x86_64" . to_string ( ) ;
134
138
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 ( ) ;
136
140
assert_eq ! ( parsed_kargs, [ "console=tty0" , "nosmt" ] ) ;
137
141
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 ( ) ;
139
143
assert_eq ! ( parsed_kargs, [ "console=tty0" , "nosmt" ] ) ;
140
144
141
145
// one arch matches and one doesn't, ensure that kargs are only applied for the matching arch
@@ -144,13 +148,13 @@ fn test_arch() {
144
148
match-architectures = ["x86_64"]
145
149
"##
146
150
. 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 ( ) ;
148
152
assert_eq ! ( parsed_kargs, [ ] as [ String ; 0 ] ) ;
149
153
let file_content = r##"kargs = ["console=tty0", "nosmt"]
150
154
match-architectures = ["aarch64"]
151
155
"##
152
156
. 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 ( ) ;
154
158
assert_eq ! ( parsed_kargs, [ "console=tty0" , "nosmt" ] ) ;
155
159
156
160
// multiple arch specified, ensure that kargs are applied to both archs
@@ -159,9 +163,9 @@ match-architectures = ["aarch64"]
159
163
match-architectures = ["x86_64", "aarch64"]
160
164
"##
161
165
. 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 ( ) ;
163
167
assert_eq ! ( parsed_kargs, [ "console=tty0" , "nosmt" ] ) ;
164
168
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 ( ) ;
166
170
assert_eq ! ( parsed_kargs, [ "console=tty0" , "nosmt" ] ) ;
167
171
}
0 commit comments