aboutsummaryrefslogtreecommitdiffstats
path: root/src/run
diff options
context:
space:
mode:
Diffstat (limited to 'src/run')
-rw-r--r--src/run/builtin.rs24
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(())
+ }
}
}