@@ -284,13 +284,28 @@ impl Command {
284
284
None
285
285
} ;
286
286
let program = resolve_exe ( & self . program , || env:: var_os ( "PATH" ) , child_paths) ?;
287
+ #[ cfg( not( target_vendor = "rust9x" ) ) ]
287
288
let has_bat_extension = |program : & [ u16 ] | {
288
289
matches ! (
289
290
// Case insensitive "ends_with" of UTF-16 encoded ".bat" or ".cmd"
290
291
program. len( ) . checked_sub( 4 ) . and_then( |i| program. get( i..) ) ,
291
292
Some ( [ 46 , 98 | 66 , 97 | 65 , 116 | 84 ] | [ 46 , 99 | 67 , 109 | 77 , 100 | 68 ] )
292
293
)
293
294
} ;
295
+ #[ cfg( target_vendor = "rust9x" ) ]
296
+ let has_bat_extension = |program : & [ u16 ] | {
297
+ let ext = program. len ( ) . checked_sub ( 4 ) . and_then ( |i| program. get ( i..) ) ;
298
+ if crate :: sys:: compat:: checks:: is_windows_nt ( ) {
299
+ matches ! (
300
+ // Case insensitive "ends_with" of UTF-16 encoded ".bat" or ".cmd"
301
+ ext,
302
+ Some ( [ 46 , 98 | 66 , 97 | 65 , 116 | 84 ] | [ 46 , 99 | 67 , 109 | 77 , 100 | 68 ] )
303
+ )
304
+ } else {
305
+ // Case insensitive "ends_with" of UTF-16 encoded ".bat"
306
+ matches ! ( ext, Some ( [ 46 , 98 | 66 , 97 | 65 , 116 | 84 , 0 ] ) )
307
+ }
308
+ } ;
294
309
let is_batch_file = if path:: is_verbatim ( & program) {
295
310
has_bat_extension ( & program[ ..program. len ( ) - 1 ] )
296
311
} else {
@@ -314,7 +329,16 @@ impl Command {
314
329
cmd_str. push ( 0 ) ; // add null terminator
315
330
316
331
// stolen from the libuv code.
332
+ #[ cfg( not( target_vendor = "rust9x" ) ) ]
317
333
let mut flags = self . flags | c:: CREATE_UNICODE_ENVIRONMENT ;
334
+ #[ cfg( target_vendor = "rust9x" ) ]
335
+ let mut flags = {
336
+ let mut flags = self . flags ;
337
+ if crate :: sys:: compat:: checks:: is_windows_nt ( ) {
338
+ flags |= c:: CREATE_UNICODE_ENVIRONMENT ;
339
+ }
340
+ flags
341
+ } ;
318
342
if self . detach {
319
343
flags |= c:: DETACHED_PROCESS | c:: CREATE_NEW_PROCESS_GROUP ;
320
344
}
@@ -637,6 +661,17 @@ impl Stdio {
637
661
opts. read ( stdio_id == c:: STD_INPUT_HANDLE ) ;
638
662
opts. write ( stdio_id != c:: STD_INPUT_HANDLE ) ;
639
663
opts. security_attributes ( & mut sa) ;
664
+
665
+ #[ cfg( target_vendor = "rust9x" ) ]
666
+ {
667
+ let p = if crate :: sys:: compat:: checks:: is_windows_nt ( ) {
668
+ r"\\.\NUL"
669
+ } else {
670
+ r"NUL"
671
+ } ;
672
+ File :: open ( Path :: new ( p) , & opts) . map ( |file| file. into_inner ( ) )
673
+ }
674
+ #[ cfg( not( target_vendor = "rust9x" ) ) ]
640
675
File :: open ( Path :: new ( r"\\.\NUL" ) , & opts) . map ( |file| file. into_inner ( ) )
641
676
}
642
677
}
@@ -874,12 +909,34 @@ fn make_command_line(argv0: &OsStr, args: &[Arg], force_quotes: bool) -> io::Res
874
909
875
910
// Get `cmd.exe` for use with bat scripts, encoded as a UTF-16 string.
876
911
fn command_prompt ( ) -> io:: Result < Vec < u16 > > {
877
- let mut system: Vec < u16 > = super :: fill_utf16_buf (
878
- |buf, size| unsafe { c:: GetSystemDirectoryW ( buf, size) } ,
879
- |buf| buf. into ( ) ,
880
- ) ?;
881
- system. extend ( "\\ cmd.exe" . encode_utf16 ( ) . chain ( [ 0 ] ) ) ;
882
- Ok ( system)
912
+ #[ cfg( target_vendor = "rust9x" ) ]
913
+ {
914
+ if crate :: sys:: compat:: checks:: is_windows_nt ( ) {
915
+ let mut system: Vec < u16 > = super :: fill_utf16_buf (
916
+ |buf, size| unsafe { c:: GetSystemDirectoryW ( buf, size) } ,
917
+ |buf| buf. into ( ) ,
918
+ ) ?;
919
+ system. extend ( "\\ cmd.exe" . encode_utf16 ( ) . chain ( [ 0 ] ) ) ;
920
+ Ok ( system)
921
+ } else {
922
+ let mut system: Vec < u16 > = super :: fill_utf16_buf (
923
+ |buf, size| unsafe { c:: GetWindowsDirectoryW ( buf, size) } ,
924
+ |buf| buf. into ( ) ,
925
+ ) ?;
926
+ system. extend ( "\\ command.com" . encode_utf16 ( ) . chain ( [ 0 ] ) ) ;
927
+ Ok ( system)
928
+ }
929
+ }
930
+
931
+ #[ cfg( not( target_vendor = "rust9x" ) ) ]
932
+ {
933
+ let mut system: Vec < u16 > = super :: fill_utf16_buf (
934
+ |buf, size| unsafe { c:: GetSystemDirectoryW ( buf, size) } ,
935
+ |buf| buf. into ( ) ,
936
+ ) ?;
937
+ system. extend ( "\\ cmd.exe" . encode_utf16 ( ) . chain ( [ 0 ] ) ) ;
938
+ Ok ( system)
939
+ }
883
940
}
884
941
885
942
fn make_envp ( maybe_env : Option < BTreeMap < EnvKey , OsString > > ) -> io:: Result < ( * mut c_void , Vec < u16 > ) > {
0 commit comments