From 2ae3392d32b62a4545cd2c464e161a8d9aaf30a1 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Thu, 2 Apr 2020 16:52:30 +0100 Subject: [PATCH] vmm: config: Port console parsing to OptionParser Signed-off-by: Rob Bradford --- vmm/src/config.rs | 68 ++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/vmm/src/config.rs b/vmm/src/config.rs index ef8fd5570..5e36f8161 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -45,8 +45,6 @@ pub enum Error { ParsePmemSizeMissing, /// Failed parsing size parameter. ParseSizeParam(std::num::ParseIntError), - /// Failed parsing console parameter. - ParseConsoleParam, /// Both console and serial are tty. ParseTTYParam, /// Failed parsing vsock context ID parameter. @@ -71,6 +69,12 @@ pub enum Error { ParseFileSystem(OptionParserError), /// Error parsing persistent memorry parameters ParsePersistentMemory(OptionParserError), + /// Failed parsing console + ParseConsole(OptionParserError), + /// Missing file value for console + ParseConsoleFileMissing, + /// No mode given for console + ParseConsoleInvalidModeGiven, } pub type Result = result::Result; @@ -926,46 +930,38 @@ fn default_consoleconfig_file() -> Option { impl ConsoleConfig { pub fn parse(console: &str) -> Result { - // Split the parameters based on the comma delimiter - let params_list: Vec<&str> = console.split(',').collect(); + let mut parser = OptionParser::new(); + parser + .add_valueless("off") + .add_valueless("tty") + .add_valueless("null") + .add("file") + .add("iommu"); + parser.parse(console).map_err(Error::ParseConsole)?; - let mut valid = false; let mut file: Option = default_consoleconfig_file(); let mut mode: ConsoleOutputMode = ConsoleOutputMode::Off; - let mut iommu_str: &str = ""; - for param in params_list.iter() { - if param.starts_with("iommu=") { - iommu_str = ¶m[6..]; - } else { - if *param == "off" { - mode = ConsoleOutputMode::Off; - file = None; - } else if *param == "tty" { - mode = ConsoleOutputMode::Tty; - file = None; - } else if param.starts_with("file=") { - mode = ConsoleOutputMode::File; - file = Some(PathBuf::from(¶m[5..])); - } else if param.starts_with("null") { - mode = ConsoleOutputMode::Null; - file = None; - } else { - return Err(Error::ParseConsoleParam); - } - valid = true; - } + if parser.is_set("off") { + } else if parser.is_set("tty") { + mode = ConsoleOutputMode::Tty + } else if parser.is_set("null") { + mode = ConsoleOutputMode::Null + } else if parser.is_set("file") { + mode = ConsoleOutputMode::File; + file = Some(PathBuf::from( + parser.get("file").ok_or(Error::ParseConsoleFileMissing)?, + )); + } else { + return Err(Error::ParseConsoleInvalidModeGiven); } + let iommu = parser + .convert::("iommu") + .map_err(Error::ParseConsole)? + .unwrap_or(Toggle(false)) + .0; - if !valid { - return Err(Error::ParseConsoleParam); - } - - Ok(Self { - mode, - file, - iommu: parse_on_off(iommu_str)?, - }) + Ok(Self { mode, file, iommu }) } pub fn default_serial() -> Self {