diff options
| -rw-r--r-- | src/run/builtin.rs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/run/builtin.rs b/src/run/builtin.rs index ed1285a..90c44a9 100644 --- a/src/run/builtin.rs +++ b/src/run/builtin.rs @@ -17,7 +17,7 @@ impl Builtin for cd { se: Arc<Mutex<Session>>, args: &[BString], _stdin: &mut dyn Read, - _stdout: &mut dyn Write, + stdout: &mut dyn Write, ) -> Result { let mut dir = match current_dir() { Ok(path) => path.as_os_str().as_bytes().to_vec(), @@ -26,21 +26,31 @@ impl Builtin for cd { std::mem::swap(&mut dir, &mut se.lock().unwrap().prev_path); - match args.get(0).map(|v| &v[..]) { + let target_path: BString = match args.get(0).map(|v| &v[..]) { Some(b"-") => { - let _ = set_current_dir(OsStr::from_bytes(&dir)); + dir } Some(path) => { - let _ = set_current_dir(OsStr::from_bytes(path)); + path.to_vec() } None => { if let Some(home) = std::env::var_os("HOME") { - let _ = set_current_dir(home); + home.into_encoded_bytes() + } else { + writeln!(stdout, "$HOME not set")?; + return Err(Error::Exit(-1)); } } - } + }; - Ok(()) + if let Err(_) = set_current_dir(OsStr::from_bytes(&target_path)) { + write!(stdout, "failed to cd into ")?; + stdout.write_all(&target_path)?; + writeln!(stdout, "\n")?; + Err(Error::Exit(1)) + } else { + Ok(()) + } } } |
