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