Skip to content

Commit 8d0bf73

Browse files
committed
kernel_cmdline: Add remove_exact method
Signed-off-by: John Eckersberg <jeckersb@redhat.com>
1 parent d596a32 commit 8d0bf73

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

crates/kernel_cmdline/src/bytes.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,29 @@ impl<'a> Cmdline<'a> {
294294
removed
295295
}
296296

297+
/// Remove all parameters that exactly match the given parameter
298+
/// from the command line
299+
///
300+
/// Returns `true` if parameter(s) were removed.
301+
pub fn remove_exact(&mut self, param: &Parameter) -> bool {
302+
let mut removed = false;
303+
let mut new_params = Vec::new();
304+
305+
for p in self.iter() {
306+
if p == *param {
307+
removed = true;
308+
} else {
309+
new_params.push(p.parameter);
310+
}
311+
}
312+
313+
if removed {
314+
self.0 = Cow::Owned(new_params.join(b" ".as_slice()));
315+
}
316+
317+
removed
318+
}
319+
297320
#[cfg(test)]
298321
pub(crate) fn is_owned(&self) -> bool {
299322
matches!(self.0, Cow::Owned(_))
@@ -904,6 +927,25 @@ mod tests {
904927
assert_eq!(iter.next(), None);
905928
}
906929

930+
#[test]
931+
fn test_remove_exact() {
932+
let mut kargs = Cmdline::from(b"foo foo=bar foo=baz");
933+
934+
// remove existing
935+
assert!(kargs.remove_exact(&param("foo=bar")));
936+
let mut iter = kargs.iter();
937+
assert_eq!(iter.next(), Some(param("foo")));
938+
assert_eq!(iter.next(), Some(param("foo=baz")));
939+
assert_eq!(iter.next(), None);
940+
941+
// doesn't exist? returns false and doesn't modify anything
942+
assert!(!kargs.remove_exact(&param("foo=wuz")));
943+
iter = kargs.iter();
944+
assert_eq!(iter.next(), Some(param("foo")));
945+
assert_eq!(iter.next(), Some(param("foo=baz")));
946+
assert_eq!(iter.next(), None);
947+
}
948+
907949
#[test]
908950
fn test_extend() {
909951
let mut kargs = Cmdline::from(b"foo=bar baz");

crates/kernel_cmdline/src/utf8.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,14 @@ impl<'a> Cmdline<'a> {
191191
self.0.remove(&key.0)
192192
}
193193

194+
/// Remove all parameters that exactly match the given parameter
195+
/// from the command line
196+
///
197+
/// Returns `true` if parameter(s) were removed.
198+
pub fn remove_exact(&mut self, param: &Parameter) -> bool {
199+
self.0.remove_exact(&param.0)
200+
}
201+
194202
#[cfg(test)]
195203
pub(crate) fn is_owned(&self) -> bool {
196204
self.0.is_owned()
@@ -829,6 +837,25 @@ mod tests {
829837
assert_eq!(iter.next(), None);
830838
}
831839

840+
#[test]
841+
fn test_remove_exact() {
842+
let mut kargs = Cmdline::from("foo foo=bar foo=baz");
843+
844+
// remove existing
845+
assert!(kargs.remove_exact(&param("foo=bar")));
846+
let mut iter = kargs.iter();
847+
assert_eq!(iter.next(), Some(param("foo")));
848+
assert_eq!(iter.next(), Some(param("foo=baz")));
849+
assert_eq!(iter.next(), None);
850+
851+
// doesn't exist? returns false and doesn't modify anything
852+
assert!(!kargs.remove_exact(&param("foo=wuz")));
853+
iter = kargs.iter();
854+
assert_eq!(iter.next(), Some(param("foo")));
855+
assert_eq!(iter.next(), Some(param("foo=baz")));
856+
assert_eq!(iter.next(), None);
857+
}
858+
832859
#[test]
833860
fn test_extend() {
834861
let mut kargs = Cmdline::from("foo=bar baz");

0 commit comments

Comments
 (0)