diff --git a/src/uu/lscpu/src/lscpu.rs b/src/uu/lscpu/src/lscpu.rs index 3150e53..4cd5647 100644 --- a/src/uu/lscpu/src/lscpu.rs +++ b/src/uu/lscpu/src/lscpu.rs @@ -15,6 +15,8 @@ mod options { pub const JSON: &str = "json"; } +mod sysfs; + const ABOUT: &str = help_about!("lscpu.md"); const USAGE: &str = help_usage!("lscpu.md"); @@ -126,6 +128,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { cpu_infos.push(vendor_info); } + let vulns = sysfs::read_cpu_vulnerabilities(); + if !vulns.is_empty() { + let mut vuln_info = CpuInfo::new("Vulnerabilities", "", None); + for vuln in vulns { + vuln_info.add_child(CpuInfo::new(&vuln.name, &vuln.mitigation, None)); + } + cpu_infos.push(vuln_info); + } + print_output(cpu_infos, output_opts); Ok(()) diff --git a/src/uu/lscpu/src/sysfs.rs b/src/uu/lscpu/src/sysfs.rs new file mode 100644 index 0000000..62adc05 --- /dev/null +++ b/src/uu/lscpu/src/sysfs.rs @@ -0,0 +1,33 @@ +use std::fs; + +pub struct CpuVulnerability { + pub name: String, + pub mitigation: String, +} + +pub fn read_cpu_vulnerabilities() -> Vec { + let mut out: Vec = vec![]; + + if let Ok(dir) = fs::read_dir("/sys/devices/system/cpu/vulnerabilities") { + let mut files: Vec<_> = dir + .flatten() + .map(|x| x.path()) + .filter(|x| !x.is_dir()) + .collect(); + + files.sort_by(|a, b| a.file_name().cmp(&b.file_name())); + + for file in files { + if let Ok(content) = fs::read_to_string(&file) { + let name = file.file_name().unwrap().to_str().unwrap(); + + out.push(CpuVulnerability { + name: (name[..1].to_uppercase() + &name[1..]).replace("_", " "), + mitigation: content.trim().to_string(), + }); + } + } + }; + + out +}