diff --git a/src/libstd/sys/unix/mod.rs b/src/libstd/sys/unix/mod.rs index 5bf8c1e06a6..6fd20b940bb 100644 --- a/src/libstd/sys/unix/mod.rs +++ b/src/libstd/sys/unix/mod.rs @@ -75,28 +75,6 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind { } } -// Some system functions expect the user to pass a appropiately-sized buffer -// without specifying its size. They will only report back whether the buffer -// was large enough or not. -// -// The callback is yielded an uninitialized vector which can be passed to a -// syscall. The closure is expected to return `Err(v)` with the passed vector -// if the space was insufficient and `Ok(r)` if the syscall did not fail due to -// insufficient space. -fn fill_bytes_buf(mut f: F) -> io::Result - where F: FnMut(Vec) -> Result,Vec>, -{ - let mut buf = Vec::new(); - let mut n = os::BUF_BYTES; - loop { - buf.reserve(n); - match f(buf) { - Err(b) => { buf = b; n *= 2; } - Ok(r) => return r, - } - } -} - pub fn cvt>(t: T) -> io::Result { let one: T = T::one(); if t == -one { diff --git a/src/libstd/sys/unix/os.rs b/src/libstd/sys/unix/os.rs index ac38d294a6f..2b6b50a1a56 100644 --- a/src/libstd/sys/unix/os.rs +++ b/src/libstd/sys/unix/os.rs @@ -30,7 +30,7 @@ use sys::c; use sys::fd; use vec; -pub const BUF_BYTES: usize = 2048; +const GETCWD_BUF_BYTES: usize = 2048; const TMPBUF_SZ: usize = 128; /// Returns the platform-specific value of errno @@ -94,22 +94,26 @@ pub fn error_string(errno: i32) -> String { } pub fn getcwd() -> io::Result { - super::fill_bytes_buf(|mut buf| { + let mut buf = Vec::new(); + let mut n = GETCWD_BUF_BYTES; + loop { unsafe { + buf.reserve(n); let ptr = buf.as_mut_ptr() as *mut libc::c_char; - Ok(if !libc::getcwd(ptr, buf.capacity() as libc::size_t).is_null() { + if !libc::getcwd(ptr, buf.capacity() as libc::size_t).is_null() { let len = CStr::from_ptr(buf.as_ptr() as *const libc::c_char).to_bytes().len(); buf.set_len(len); - Ok(PathBuf::from(OsString::from_bytes(buf).unwrap())) + buf.shrink_to_fit(); + return Ok(PathBuf::from(OsString::from_vec(buf))); } else { let error = io::Error::last_os_error(); - if error.raw_os_error().unwrap() == libc::ERANGE { - return Err(buf); + if error.raw_os_error() != Some(libc::ERANGE) { + return Err(error); } - Err(error) - }) + } + n *= 2; } - }) + } } pub fn chdir(p: &path::Path) -> io::Result<()> {