From e185ac3cf91aaf6bfa68d658a49565e1b68520dc Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Wed, 28 Aug 2024 11:16:42 -0400 Subject: [PATCH 01/15] Initial parent directory command --- applications/cd/src/lib.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index c2d9647ccd..9cd0857bba 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -17,6 +17,7 @@ use getopts::Options; pub fn main(args: Vec) -> isize { let mut opts = Options::new(); opts.optflag("h", "help", "print this help menu"); + opts.optflag("p", "parent", "change parent directory"); let matches = match opts.parse(args) { Ok(m) => m, @@ -27,16 +28,32 @@ pub fn main(args: Vec) -> isize { } }; + let parent_opt = matches.opt_present("p"); + let Ok(curr_env) = task::with_current_task(|t| t.get_env()) else { println!("failed to get current task"); return -1; }; + let working_dir = Arc::clone(&curr_env.lock().working_dir); // go to root directory if matches.free.is_empty() { + println!("empty"); curr_env.lock().working_dir = Arc::clone(root::get_root()); } else { let path = matches.free[0].as_ref(); + + if parent_opt { + println!("Parent"); + if let Some(parent_dir) = working_dir.lock().get_parent_dir() { + curr_env.lock().working_dir = Arc::clone(&parent_dir); + } else { + println!("already at the root directory"); + return -1; + } + } + + else { match curr_env.lock().chdir(path) { Err(environment::Error::NotADirectory) => { println!("not a directory: {}", path); @@ -48,6 +65,7 @@ pub fn main(args: Vec) -> isize { } _ => {} } + } } 0 } From bd1b82f1ea923b2d7a697de80df38f7a7e395faf Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Wed, 28 Aug 2024 12:04:14 -0400 Subject: [PATCH 02/15] Remove '-p' argument in place with '..' --- applications/cd/src/lib.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index 9cd0857bba..0efb85fdcc 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -13,6 +13,7 @@ use alloc::string::String; use alloc::sync::Arc; use alloc::vec::Vec; use getopts::Options; +use path::Path; pub fn main(args: Vec) -> isize { let mut opts = Options::new(); @@ -28,14 +29,14 @@ pub fn main(args: Vec) -> isize { } }; - let parent_opt = matches.opt_present("p"); - let Ok(curr_env) = task::with_current_task(|t| t.get_env()) else { println!("failed to get current task"); return -1; }; - + + // Obtains copy of working directory for reference let working_dir = Arc::clone(&curr_env.lock().working_dir); + // go to root directory if matches.free.is_empty() { println!("empty"); @@ -43,28 +44,27 @@ pub fn main(args: Vec) -> isize { } else { let path = matches.free[0].as_ref(); - if parent_opt { - println!("Parent"); + if path == Path::new("..") { if let Some(parent_dir) = working_dir.lock().get_parent_dir() { curr_env.lock().working_dir = Arc::clone(&parent_dir); } else { - println!("already at the root directory"); + println!("failed to get parent directory"); return -1; } } else { - match curr_env.lock().chdir(path) { - Err(environment::Error::NotADirectory) => { - println!("not a directory: {}", path); - return -1; + match curr_env.lock().chdir(path) { + Err(environment::Error::NotADirectory) => { + println!("not a directory: {}", path); + return -1; + } + Err(environment::Error::NotFound) => { + println!("couldn't find directory: {}", path); + return -1; + } + _ => {} } - Err(environment::Error::NotFound) => { - println!("couldn't find directory: {}", path); - return -1; - } - _ => {} - } } } 0 From 2d6cfcba117ad6cd4dc8125ea34e27947a169fb1 Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Wed, 28 Aug 2024 12:21:33 -0400 Subject: [PATCH 03/15] Clean up syntax --- applications/cd/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index 0efb85fdcc..af0e00860d 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -43,7 +43,6 @@ pub fn main(args: Vec) -> isize { curr_env.lock().working_dir = Arc::clone(root::get_root()); } else { let path = matches.free[0].as_ref(); - if path == Path::new("..") { if let Some(parent_dir) = working_dir.lock().get_parent_dir() { curr_env.lock().working_dir = Arc::clone(&parent_dir); From d7307bfdb88d202ca6ef5f1ac552dac8d8d7ef78 Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Wed, 28 Aug 2024 13:25:34 -0400 Subject: [PATCH 04/15] Update parent flag in print usage option --- applications/cd/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index af0e00860d..b2edf3238d 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -18,7 +18,7 @@ use path::Path; pub fn main(args: Vec) -> isize { let mut opts = Options::new(); opts.optflag("h", "help", "print this help menu"); - opts.optflag("p", "parent", "change parent directory"); + opts.optflag("p", "parent", "use '..' to change to parent directory"); let matches = match opts.parse(args) { Ok(m) => m, From 2d6eeda5ad18ae694477e60d1648ab45144cf858 Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Wed, 28 Aug 2024 13:35:17 -0400 Subject: [PATCH 05/15] Remove verbose print statement --- applications/cd/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index b2edf3238d..837d39fb10 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -39,7 +39,6 @@ pub fn main(args: Vec) -> isize { // go to root directory if matches.free.is_empty() { - println!("empty"); curr_env.lock().working_dir = Arc::clone(root::get_root()); } else { let path = matches.free[0].as_ref(); From e94fa9ea557497c7d0ecd91b9cc622dc4d6b3f45 Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Wed, 28 Aug 2024 13:36:12 -0400 Subject: [PATCH 06/15] Remove unnecessary space --- applications/cd/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index 837d39fb10..acc2a4470e 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -33,7 +33,6 @@ pub fn main(args: Vec) -> isize { println!("failed to get current task"); return -1; }; - // Obtains copy of working directory for reference let working_dir = Arc::clone(&curr_env.lock().working_dir); From df0521179703bdd7075611b6e1f832e497b3516f Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Fri, 30 Aug 2024 23:35:36 -0400 Subject: [PATCH 07/15] Attempt to move parent directory logic to kernel --- applications/cd/src/lib.rs | 26 ++++++++------------------ kernel/environment/src/lib.rs | 35 +++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index acc2a4470e..5bd0834249 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -41,28 +41,18 @@ pub fn main(args: Vec) -> isize { curr_env.lock().working_dir = Arc::clone(root::get_root()); } else { let path = matches.free[0].as_ref(); - if path == Path::new("..") { - if let Some(parent_dir) = working_dir.lock().get_parent_dir() { - curr_env.lock().working_dir = Arc::clone(&parent_dir); - } else { - println!("failed to get parent directory"); + match curr_env.lock().chdir(path) { + Err(environment::Error::NotADirectory) => { + println!("not a directory: {}", path); return -1; } - } - - else { - match curr_env.lock().chdir(path) { - Err(environment::Error::NotADirectory) => { - println!("not a directory: {}", path); - return -1; - } - Err(environment::Error::NotFound) => { - println!("couldn't find directory: {}", path); - return -1; - } - _ => {} + Err(environment::Error::NotFound) => { + println!("couldn't find directory: {}", path); + return -1; } + _ => {} } + } 0 } diff --git a/kernel/environment/src/lib.rs b/kernel/environment/src/lib.rs index 1dcf6f78d5..a7c9ab7b19 100644 --- a/kernel/environment/src/lib.rs +++ b/kernel/environment/src/lib.rs @@ -31,17 +31,36 @@ impl Environment { /// Changes the current working directory. #[doc(alias("change"))] pub fn chdir(&mut self, path: &Path) -> Result<()> { - for component in path.components() { - let new = self.working_dir.lock().get(component.as_ref()); - match new { - Some(FileOrDir::Dir(dir)) => { - self.working_dir = dir; + if path == Path::new("..") { + // Obtain the parent directory in a separate step + let parent_dir = { + let working_dir_lock = self.working_dir.lock(); + working_dir_lock.get_parent_dir() + }; + + match parent_dir { + Some(parent_dir) => { + // Now safely update `self.working_dir` outside of the lock + self.working_dir = Arc::clone(&parent_dir); } - Some(FileOrDir::File(_)) => return Err(Error::NotADirectory), - None => return Err(Error::NotFound), + None => return Err(Error::NotFound), // Or another suitable error } + Ok(()) + } + + else { + for component in path.components() { + let new = self.working_dir.lock().get(component.as_ref()); + match new { + Some(FileOrDir::Dir(dir)) => { + self.working_dir = dir; + } + Some(FileOrDir::File(_)) => return Err(Error::NotADirectory), + None => return Err(Error::NotFound), + } + } + Ok(()) } - Ok(()) } /// Returns the value of the environment variable with the given `key`. From 6aff644caf2ae88050fd7c39f9b49adbad3ae3da Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Mon, 2 Sep 2024 00:17:47 -0400 Subject: [PATCH 08/15] Remove unnecessary Path crate and copy of working directory --- applications/cd/src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index 5bd0834249..539ae78ad8 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -13,7 +13,6 @@ use alloc::string::String; use alloc::sync::Arc; use alloc::vec::Vec; use getopts::Options; -use path::Path; pub fn main(args: Vec) -> isize { let mut opts = Options::new(); @@ -33,8 +32,6 @@ pub fn main(args: Vec) -> isize { println!("failed to get current task"); return -1; }; - // Obtains copy of working directory for reference - let working_dir = Arc::clone(&curr_env.lock().working_dir); // go to root directory if matches.free.is_empty() { From 9e10ed53650c63006d4f42ca990a064917f0aafc Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Mon, 2 Sep 2024 00:23:13 -0400 Subject: [PATCH 09/15] Remove extra line --- applications/cd/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index 539ae78ad8..99064618ba 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -17,7 +17,6 @@ use getopts::Options; pub fn main(args: Vec) -> isize { let mut opts = Options::new(); opts.optflag("h", "help", "print this help menu"); - opts.optflag("p", "parent", "use '..' to change to parent directory"); let matches = match opts.parse(args) { Ok(m) => m, @@ -48,8 +47,7 @@ pub fn main(args: Vec) -> isize { return -1; } _ => {} - } - + } } 0 } From e316ed192ef0cbc9be65a1804c75112b4b211a0d Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Mon, 2 Sep 2024 00:25:20 -0400 Subject: [PATCH 10/15] Synatx --- applications/cd/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index 99064618ba..bef1291788 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -47,7 +47,7 @@ pub fn main(args: Vec) -> isize { return -1; } _ => {} - } + } } 0 } From 46faeb5252e09fd05d43e0375c4cb6706429fa89 Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Mon, 2 Sep 2024 00:29:37 -0400 Subject: [PATCH 11/15] fix line --- applications/cd/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index bef1291788..c2d9647ccd 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -31,7 +31,7 @@ pub fn main(args: Vec) -> isize { println!("failed to get current task"); return -1; }; - + // go to root directory if matches.free.is_empty() { curr_env.lock().working_dir = Arc::clone(root::get_root()); From eb682f48b9aa585907ddc7bfb603a018fb55a615 Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Fri, 6 Sep 2024 03:48:32 -0400 Subject: [PATCH 12/15] Call get function from path crate to add correctory directory --- applications/cd/src/lib.rs | 3 ++- kernel/environment/src/lib.rs | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index c2d9647ccd..f7a15e5a49 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -37,7 +37,8 @@ pub fn main(args: Vec) -> isize { curr_env.lock().working_dir = Arc::clone(root::get_root()); } else { let path = matches.free[0].as_ref(); - match curr_env.lock().chdir(path) { + + match curr_env.lock().chdir_path(path) { Err(environment::Error::NotADirectory) => { println!("not a directory: {}", path); return -1; diff --git a/kernel/environment/src/lib.rs b/kernel/environment/src/lib.rs index 1dcf6f78d5..5dff729d1b 100644 --- a/kernel/environment/src/lib.rs +++ b/kernel/environment/src/lib.rs @@ -44,6 +44,17 @@ impl Environment { Ok(()) } + pub fn chdir_path(&mut self, path: &Path) -> Result<()> { + match path.get(&self.working_dir) { + Some(FileOrDir::Dir(dir)) => { + self.working_dir = dir; + Ok(()) + } + Some(FileOrDir::File(_)) => Err(Error::NotADirectory), + None => Err(Error::NotFound), + } + } + /// Returns the value of the environment variable with the given `key`. #[doc(alias("var"))] pub fn get(&self, key: &str) -> Option<&String> { From 531c847dec6e6541374de17138d71b6588da43ad Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Fri, 6 Sep 2024 03:59:59 -0400 Subject: [PATCH 13/15] Remove redundant harded parent directory check --- kernel/environment/src/lib.rs | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/kernel/environment/src/lib.rs b/kernel/environment/src/lib.rs index 7c179a5e0d..5dff729d1b 100644 --- a/kernel/environment/src/lib.rs +++ b/kernel/environment/src/lib.rs @@ -31,36 +31,17 @@ impl Environment { /// Changes the current working directory. #[doc(alias("change"))] pub fn chdir(&mut self, path: &Path) -> Result<()> { - if path == Path::new("..") { - // Obtain the parent directory in a separate step - let parent_dir = { - let working_dir_lock = self.working_dir.lock(); - working_dir_lock.get_parent_dir() - }; - - match parent_dir { - Some(parent_dir) => { - // Now safely update `self.working_dir` outside of the lock - self.working_dir = Arc::clone(&parent_dir); + for component in path.components() { + let new = self.working_dir.lock().get(component.as_ref()); + match new { + Some(FileOrDir::Dir(dir)) => { + self.working_dir = dir; } - None => return Err(Error::NotFound), // Or another suitable error + Some(FileOrDir::File(_)) => return Err(Error::NotADirectory), + None => return Err(Error::NotFound), } - Ok(()) - } - - else { - for component in path.components() { - let new = self.working_dir.lock().get(component.as_ref()); - match new { - Some(FileOrDir::Dir(dir)) => { - self.working_dir = dir; - } - Some(FileOrDir::File(_)) => return Err(Error::NotADirectory), - None => return Err(Error::NotFound), - } - } - Ok(()) } + Ok(()) } pub fn chdir_path(&mut self, path: &Path) -> Result<()> { From e06c19b1816f0d5652f9c9518c4a68ee0870c3db Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Fri, 6 Sep 2024 16:19:59 -0400 Subject: [PATCH 14/15] Replace redundant function: --- applications/cd/src/lib.rs | 2 +- kernel/environment/src/lib.rs | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index f7a15e5a49..17a846375a 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -38,7 +38,7 @@ pub fn main(args: Vec) -> isize { } else { let path = matches.free[0].as_ref(); - match curr_env.lock().chdir_path(path) { + match curr_env.lock().chdir(path) { Err(environment::Error::NotADirectory) => { println!("not a directory: {}", path); return -1; diff --git a/kernel/environment/src/lib.rs b/kernel/environment/src/lib.rs index 5dff729d1b..9c5a43252b 100644 --- a/kernel/environment/src/lib.rs +++ b/kernel/environment/src/lib.rs @@ -31,20 +31,6 @@ impl Environment { /// Changes the current working directory. #[doc(alias("change"))] pub fn chdir(&mut self, path: &Path) -> Result<()> { - for component in path.components() { - let new = self.working_dir.lock().get(component.as_ref()); - match new { - Some(FileOrDir::Dir(dir)) => { - self.working_dir = dir; - } - Some(FileOrDir::File(_)) => return Err(Error::NotADirectory), - None => return Err(Error::NotFound), - } - } - Ok(()) - } - - pub fn chdir_path(&mut self, path: &Path) -> Result<()> { match path.get(&self.working_dir) { Some(FileOrDir::Dir(dir)) => { self.working_dir = dir; From dbdcf060b7689687ac85baa8e1d84f9be0566df4 Mon Sep 17 00:00:00 2001 From: Nathan Hsiao Date: Fri, 6 Sep 2024 16:22:11 -0400 Subject: [PATCH 15/15] Remove extra line --- applications/cd/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/applications/cd/src/lib.rs b/applications/cd/src/lib.rs index 17a846375a..c2d9647ccd 100644 --- a/applications/cd/src/lib.rs +++ b/applications/cd/src/lib.rs @@ -37,7 +37,6 @@ pub fn main(args: Vec) -> isize { curr_env.lock().working_dir = Arc::clone(root::get_root()); } else { let path = matches.free[0].as_ref(); - match curr_env.lock().chdir(path) { Err(environment::Error::NotADirectory) => { println!("not a directory: {}", path);