14
14
15
15
#![ unstable( feature = "std_misc" ) ]
16
16
#![ allow( missing_docs) ]
17
- #![ allow( deprecated) ] // will be addressed by #23197
18
17
19
18
use prelude:: v1:: * ;
20
19
21
20
use env;
22
- use ffi:: CString ;
21
+ use ffi:: { AsOsStr , CString , OsString } ;
23
22
use mem;
24
- use old_path :: { Path , GenericPath } ;
25
- use os;
26
- use str;
23
+ use path :: { Path , PathBuf } ;
24
+ # [ cfg ( not ( target_os = "android" ) ) ] use os;
25
+ # [ cfg ( not ( target_os = "android" ) ) ] use str;
27
26
28
27
pub struct DynamicLibrary {
29
28
handle : * mut u8
@@ -54,7 +53,7 @@ impl DynamicLibrary {
54
53
/// Lazily open a dynamic library. When passed None it gives a
55
54
/// handle to the calling process
56
55
pub fn open ( filename : Option < & Path > ) -> Result < DynamicLibrary , String > {
57
- let maybe_library = dl:: open ( filename. map ( |path| path. as_vec ( ) ) ) ;
56
+ let maybe_library = dl:: open ( filename. map ( |path| path. as_os_str ( ) ) ) ;
58
57
59
58
// The dynamic library must not be constructed if there is
60
59
// an error opening the library so the destructor does not
@@ -68,19 +67,17 @@ impl DynamicLibrary {
68
67
/// Prepends a path to this process's search path for dynamic libraries
69
68
pub fn prepend_search_path ( path : & Path ) {
70
69
let mut search_path = DynamicLibrary :: search_path ( ) ;
71
- search_path. insert ( 0 , path. clone ( ) ) ;
72
- let newval = DynamicLibrary :: create_path ( & search_path) ;
73
- env:: set_var ( DynamicLibrary :: envvar ( ) ,
74
- str:: from_utf8 ( & newval) . unwrap ( ) ) ;
70
+ search_path. insert ( 0 , path. to_path_buf ( ) ) ;
71
+ env:: set_var ( DynamicLibrary :: envvar ( ) , & DynamicLibrary :: create_path ( & search_path) ) ;
75
72
}
76
73
77
74
/// From a slice of paths, create a new vector which is suitable to be an
78
75
/// environment variable for this platforms dylib search path.
79
- pub fn create_path ( path : & [ Path ] ) -> Vec < u8 > {
80
- let mut newvar = Vec :: new ( ) ;
76
+ pub fn create_path ( path : & [ PathBuf ] ) -> OsString {
77
+ let mut newvar = OsString :: new ( ) ;
81
78
for ( i, path) in path. iter ( ) . enumerate ( ) {
82
79
if i > 0 { newvar. push ( DynamicLibrary :: separator ( ) ) ; }
83
- newvar. push_all ( path. as_vec ( ) ) ;
80
+ newvar. push ( path) ;
84
81
}
85
82
return newvar;
86
83
}
@@ -97,15 +94,15 @@ impl DynamicLibrary {
97
94
}
98
95
}
99
96
100
- fn separator ( ) -> u8 {
101
- if cfg ! ( windows) { b';' } else { b':' }
97
+ fn separator ( ) -> & ' static str {
98
+ if cfg ! ( windows) { ";" } else { ":" }
102
99
}
103
100
104
101
/// Returns the current search path for dynamic libraries being used by this
105
102
/// process
106
- pub fn search_path ( ) -> Vec < Path > {
103
+ pub fn search_path ( ) -> Vec < PathBuf > {
107
104
match env:: var_os ( DynamicLibrary :: envvar ( ) ) {
108
- Some ( var) => os :: split_paths ( var. to_str ( ) . unwrap ( ) ) ,
105
+ Some ( var) => env :: split_paths ( & var) . collect ( ) ,
109
106
None => Vec :: new ( ) ,
110
107
}
111
108
}
@@ -134,8 +131,8 @@ mod test {
134
131
use super :: * ;
135
132
use prelude:: v1:: * ;
136
133
use libc;
137
- use old_path:: Path ;
138
134
use mem;
135
+ use path:: Path ;
139
136
140
137
#[ test]
141
138
#[ cfg_attr( any( windows, target_os = "android" ) , ignore) ] // FIXME #8818, #10379
@@ -192,12 +189,13 @@ mod test {
192
189
mod dl {
193
190
use prelude:: v1:: * ;
194
191
195
- use ffi:: { CString , CStr } ;
192
+ use ffi:: { CStr , OsStr } ;
196
193
use str;
197
194
use libc;
195
+ use os:: unix:: prelude:: * ;
198
196
use ptr;
199
197
200
- pub fn open ( filename : Option < & [ u8 ] > ) -> Result < * mut u8 , String > {
198
+ pub fn open ( filename : Option < & OsStr > ) -> Result < * mut u8 , String > {
201
199
check_for_errors_in ( || {
202
200
unsafe {
203
201
match filename {
@@ -210,8 +208,8 @@ mod dl {
210
208
211
209
const LAZY : libc:: c_int = 1 ;
212
210
213
- unsafe fn open_external ( filename : & [ u8 ] ) -> * mut u8 {
214
- let s = CString :: new ( filename) . unwrap ( ) ;
211
+ unsafe fn open_external ( filename : & OsStr ) -> * mut u8 {
212
+ let s = filename. to_cstring ( ) . unwrap ( ) ;
215
213
dlopen ( s. as_ptr ( ) , LAZY ) as * mut u8
216
214
}
217
215
@@ -264,21 +262,22 @@ mod dl {
264
262
265
263
#[ cfg( target_os = "windows" ) ]
266
264
mod dl {
265
+ use ffi:: OsStr ;
267
266
use iter:: IteratorExt ;
268
267
use libc;
269
268
use libc:: consts:: os:: extra:: ERROR_CALL_NOT_IMPLEMENTED ;
270
269
use ops:: FnOnce ;
271
270
use os;
271
+ use os:: windows:: prelude:: * ;
272
272
use option:: Option :: { self , Some , None } ;
273
273
use ptr;
274
274
use result:: Result ;
275
275
use result:: Result :: { Ok , Err } ;
276
- use str;
277
276
use string:: String ;
278
277
use vec:: Vec ;
279
278
use sys:: c:: compat:: kernel32:: SetThreadErrorMode ;
280
279
281
- pub fn open ( filename : Option < & [ u8 ] > ) -> Result < * mut u8 , String > {
280
+ pub fn open ( filename : Option < & OsStr > ) -> Result < * mut u8 , String > {
282
281
// disable "dll load failed" error dialog.
283
282
let mut use_thread_mode = true ;
284
283
let prev_error_mode = unsafe {
@@ -308,9 +307,8 @@ mod dl {
308
307
309
308
let result = match filename {
310
309
Some ( filename) => {
311
- let filename_str = str:: from_utf8 ( filename) . unwrap ( ) ;
312
- let mut filename_str: Vec < u16 > = filename_str. utf16_units ( ) . collect ( ) ;
313
- filename_str. push ( 0 ) ;
310
+ let filename_str: Vec < _ > =
311
+ filename. encode_wide ( ) . chain ( Some ( 0 ) . into_iter ( ) ) . collect ( ) ;
314
312
let result = unsafe {
315
313
LoadLibraryW ( filename_str. as_ptr ( ) as * const libc:: c_void )
316
314
} ;
0 commit comments