From 5de56b3ca1defd9206db8364ecef5f3fd8cc5b38 Mon Sep 17 00:00:00 2001 From: Barosl Lee Date: Tue, 11 Nov 2014 17:13:10 +0900 Subject: [PATCH] Make os::change_dir() return IoResult<()> os::change_dir() returns bool, without a meaningful error message. Change it to return IoResult<()> to indicate what IoError caused the failure. Fixes #16315. [breaking-change] --- src/libstd/os.rs | 29 +++++++++++++++-------------- src/test/run-pass/tempfile.rs | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 971138c06fb..cf22b8014ca 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -867,32 +867,33 @@ pub fn make_absolute(p: &Path) -> IoResult { /// use std::path::Path; /// /// let root = Path::new("/"); -/// assert!(os::change_dir(&root)); +/// assert!(os::change_dir(&root).is_ok()); /// println!("Successfully changed working directory to {}!", root.display()); /// ``` -pub fn change_dir(p: &Path) -> bool { +pub fn change_dir(p: &Path) -> IoResult<()> { return chdir(p); #[cfg(windows)] - fn chdir(p: &Path) -> bool { - let p = match p.as_str() { - Some(s) => { - let mut p = s.utf16_units().collect::>(); - p.push(0); - p - } - None => return false, - }; + fn chdir(p: &Path) -> IoResult<()> { + let mut p = p.as_str().unwrap().utf16_units().collect::>(); + p.push(0); + unsafe { - libc::SetCurrentDirectoryW(p.as_ptr()) != (0 as libc::BOOL) + match libc::SetCurrentDirectoryW(p.as_ptr()) != (0 as libc::BOOL) { + true => Ok(()), + false => Err(IoError::last_error()), + } } } #[cfg(unix)] - fn chdir(p: &Path) -> bool { + fn chdir(p: &Path) -> IoResult<()> { p.with_c_str(|buf| { unsafe { - libc::chdir(buf) == (0 as c_int) + match libc::chdir(buf) == (0 as c_int) { + true => Ok(()), + false => Err(IoError::last_error()), + } } }) } diff --git a/src/test/run-pass/tempfile.rs b/src/test/run-pass/tempfile.rs index bf47a516bc8..7400c52a73b 100644 --- a/src/test/run-pass/tempfile.rs +++ b/src/test/run-pass/tempfile.rs @@ -190,7 +190,7 @@ pub fn dont_double_panic() { fn in_tmpdir(f: ||) { let tmpdir = TempDir::new("test").ok().expect("can't make tmpdir"); - assert!(os::change_dir(tmpdir.path())); + assert!(os::change_dir(tmpdir.path()).is_ok()); f(); }