@@ -33,14 +33,6 @@ use vec;
3333pub const BUF_BYTES : usize = 2048 ;
3434const TMPBUF_SZ : usize = 128 ;
3535
36- fn bytes2path ( b : & [ u8 ] ) -> PathBuf {
37- PathBuf :: from ( <OsStr as OsStrExt >:: from_bytes ( b) )
38- }
39-
40- fn os2path ( os : OsString ) -> PathBuf {
41- bytes2path ( os. as_bytes ( ) )
42- }
43-
4436/// Returns the platform-specific value of errno
4537pub fn errno ( ) -> i32 {
4638 #[ cfg( any( target_os = "macos" ,
@@ -102,14 +94,17 @@ pub fn error_string(errno: i32) -> String {
10294}
10395
10496pub fn getcwd ( ) -> io:: Result < PathBuf > {
105- super :: fill_bytes_buf ( |buf , len | {
97+ super :: fill_bytes_buf ( |mut buf | {
10698 unsafe {
107- Some ( if !libc:: getcwd ( buf, len) . is_null ( ) {
108- Ok ( bytes2path ( CStr :: from_ptr ( buf) . to_bytes ( ) ) )
99+ let ptr = buf. as_mut_ptr ( ) as * mut libc:: c_char ;
100+ Ok ( if !libc:: getcwd ( ptr, buf. capacity ( ) as libc:: size_t ) . is_null ( ) {
101+ let len = CStr :: from_ptr ( buf. as_ptr ( ) as * const libc:: c_char ) . to_bytes ( ) . len ( ) ;
102+ buf. set_len ( len) ;
103+ Ok ( PathBuf :: from ( OsString :: from_bytes ( buf) . unwrap ( ) ) )
109104 } else {
110105 let error = io:: Error :: last_os_error ( ) ;
111106 if error. raw_os_error ( ) . unwrap ( ) == libc:: ERANGE {
112- return None ;
107+ return Err ( buf ) ;
113108 }
114109 Err ( error)
115110 } )
@@ -134,11 +129,14 @@ pub struct SplitPaths<'a> {
134129}
135130
136131pub fn split_paths < ' a > ( unparsed : & ' a OsStr ) -> SplitPaths < ' a > {
132+ fn bytes_to_path ( b : & [ u8 ] ) -> PathBuf {
133+ PathBuf :: from ( <OsStr as OsStrExt >:: from_bytes ( b) )
134+ }
137135 fn is_colon ( b : & u8 ) -> bool { * b == b':' }
138136 let unparsed = unparsed. as_bytes ( ) ;
139137 SplitPaths {
140138 iter : unparsed. split ( is_colon as fn ( & u8 ) -> bool )
141- . map ( bytes2path as fn ( & ' a [ u8 ] ) -> PathBuf )
139+ . map ( bytes_to_path as fn ( & ' a [ u8 ] ) -> PathBuf )
142140 }
143141}
144142
@@ -449,7 +447,7 @@ pub fn page_size() -> usize {
449447}
450448
451449pub fn temp_dir ( ) -> PathBuf {
452- getenv ( "TMPDIR" . as_ref ( ) ) . map ( os2path ) . unwrap_or_else ( || {
450+ getenv ( "TMPDIR" . as_ref ( ) ) . map ( PathBuf :: from ) . unwrap_or_else ( || {
453451 if cfg ! ( target_os = "android" ) {
454452 PathBuf :: from ( "/data/local/tmp" )
455453 } else {
@@ -461,7 +459,7 @@ pub fn temp_dir() -> PathBuf {
461459pub fn home_dir ( ) -> Option < PathBuf > {
462460 return getenv ( "HOME" . as_ref ( ) ) . or_else ( || unsafe {
463461 fallback ( )
464- } ) . map ( os2path ) ;
462+ } ) . map ( PathBuf :: from ) ;
465463
466464 #[ cfg( any( target_os = "android" ,
467465 target_os = "ios" ) ) ]
0 commit comments