@@ -33,14 +33,6 @@ use vec;
33
33
pub const BUF_BYTES : usize = 2048 ;
34
34
const TMPBUF_SZ : usize = 128 ;
35
35
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
-
44
36
/// Returns the platform-specific value of errno
45
37
pub fn errno ( ) -> i32 {
46
38
#[ cfg( any( target_os = "macos" ,
@@ -102,14 +94,17 @@ pub fn error_string(errno: i32) -> String {
102
94
}
103
95
104
96
pub fn getcwd ( ) -> io:: Result < PathBuf > {
105
- super :: fill_bytes_buf ( |buf , len | {
97
+ super :: fill_bytes_buf ( |mut buf | {
106
98
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 ( ) ) )
109
104
} else {
110
105
let error = io:: Error :: last_os_error ( ) ;
111
106
if error. raw_os_error ( ) . unwrap ( ) == libc:: ERANGE {
112
- return None ;
107
+ return Err ( buf ) ;
113
108
}
114
109
Err ( error)
115
110
} )
@@ -134,11 +129,14 @@ pub struct SplitPaths<'a> {
134
129
}
135
130
136
131
pub 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
+ }
137
135
fn is_colon ( b : & u8 ) -> bool { * b == b':' }
138
136
let unparsed = unparsed. as_bytes ( ) ;
139
137
SplitPaths {
140
138
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 )
142
140
}
143
141
}
144
142
@@ -449,7 +447,7 @@ pub fn page_size() -> usize {
449
447
}
450
448
451
449
pub 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 ( || {
453
451
if cfg ! ( target_os = "android" ) {
454
452
PathBuf :: from ( "/data/local/tmp" )
455
453
} else {
@@ -461,7 +459,7 @@ pub fn temp_dir() -> PathBuf {
461
459
pub fn home_dir ( ) -> Option < PathBuf > {
462
460
return getenv ( "HOME" . as_ref ( ) ) . or_else ( || unsafe {
463
461
fallback ( )
464
- } ) . map ( os2path ) ;
462
+ } ) . map ( PathBuf :: from ) ;
465
463
466
464
#[ cfg( any( target_os = "android" ,
467
465
target_os = "ios" ) ) ]
0 commit comments