From 657a88db20b500bd823bf66e54fde9f62946c17b Mon Sep 17 00:00:00 2001
From: Foorack <max@foorack.com>
Date: Sun, 9 Feb 2025 17:44:52 +0100
Subject: [PATCH] lsmem: improve Windows compatability

---
 src/uu/lsmem/src/lsmem.rs | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/src/uu/lsmem/src/lsmem.rs b/src/uu/lsmem/src/lsmem.rs
index e626af8..076d365 100644
--- a/src/uu/lsmem/src/lsmem.rs
+++ b/src/uu/lsmem/src/lsmem.rs
@@ -348,7 +348,7 @@ impl Options {
             split_by_removable: false,
             split_by_state: false,
             split_by_zones: false,
-            sysmem: String::from(PATH_SYS_MEMORY),
+            sysmem: Path::new(PATH_SYS_MEMORY).display().to_string(),
 
             have_nodes: false,
             have_zones: false,
@@ -362,16 +362,23 @@ impl Options {
 fn read_info(lsmem: &mut Lsmem, opts: &mut Options) {
     let path_block_size = Path::new(&opts.sysmem).join(PATH_SUB_BLOCK_SIZE_BYTES);
     lsmem.block_size = u64::from_str_radix(
-        &read_file_content::<String>(path_block_size.as_path()).unwrap(),
+        &read_file_content::<String>(path_block_size.as_path())
+            .expect("Failed to read memory block size"),
         16,
     )
     .unwrap();
     lsmem.dirs = get_block_paths(opts);
     lsmem.dirs.sort_by(|a, b| {
-        let filename_a = a.to_str().unwrap().split('/').last().unwrap();
-        let filename_b = b.to_str().unwrap().split('/').last().unwrap();
-        let idx_a: u64 = filename_a[PATH_NAME_MEMORY.len()..].parse().unwrap();
-        let idx_b: u64 = filename_b[PATH_NAME_MEMORY.len()..].parse().unwrap();
+        let filename_a = a.file_name().expect("Failed parsing memory block name");
+        let filename_a = filename_a.to_str().unwrap();
+        let filename_b = b.file_name().expect("Failed parsing memory block name");
+        let filename_b = filename_b.to_str().unwrap();
+        let idx_a: u64 = filename_a[PATH_NAME_MEMORY.len()..]
+            .parse()
+            .expect("Failed to parse memory block index");
+        let idx_b: u64 = filename_b[PATH_NAME_MEMORY.len()..]
+            .parse()
+            .expect("Failed to parse memory block index");
         idx_a.cmp(&idx_b)
     });
     lsmem.ndirs = lsmem.dirs.len();
@@ -412,7 +419,7 @@ fn get_block_paths(opts: &mut Options) -> Vec<PathBuf> {
     for entry in fs::read_dir(&opts.sysmem).unwrap() {
         let entry = entry.unwrap();
         let path = entry.path();
-        let filename = path.to_str().unwrap().split('/').last().unwrap();
+        let filename = path.file_name().unwrap().to_str().unwrap();
         if path.is_dir() && filename.starts_with(PATH_NAME_MEMORY) {
             paths.push(path);
         }
@@ -458,7 +465,7 @@ fn memory_block_get_node(path: &PathBuf) -> Result<i32, <i32 as FromStr>::Err> {
     for entry in fs::read_dir(path).unwrap() {
         let entry = entry.unwrap();
         let path = entry.path();
-        let filename = path.to_str().unwrap().split('/').last().unwrap();
+        let filename = path.file_name().unwrap().to_str().unwrap();
         if path.is_dir() && filename.starts_with(PATH_NAME_NODE) {
             return filename[PATH_NAME_NODE.len()..].parse();
         }
@@ -470,7 +477,7 @@ fn memory_block_read_attrs(opts: &Options, path: &PathBuf) -> MemoryBlock {
     let mut blk = MemoryBlock::new();
     blk.count = 1;
     blk.state = MemoryState::Unknown;
-    let filename = path.to_str().unwrap().split('/').last().unwrap();
+    let filename = path.file_name().unwrap().to_str().unwrap();
     blk.index = filename[PATH_NAME_MEMORY.len()..].parse().unwrap();
 
     let mut removable_path = path.clone();
@@ -778,11 +785,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
     }
 
     if let Some(sysroot) = matches.get_one::<String>(options::SYSROOT) {
-        opts.sysmem = format!(
-            "{}/{}",
-            sysroot.trim_end_matches('/'),
-            opts.sysmem.trim_start_matches('/')
-        );
+        opts.sysmem = Path::new(sysroot).join(opts.sysmem).display().to_string();
     }
 
     read_info(&mut lsmem, &mut opts);