| // Test that windows `creation_flags` extension to `Command` works. |
| |
| //@ run-pass |
| //@ only-windows |
| //@ needs-subprocess |
| |
| use std::env; |
| use std::os::windows::process::CommandExt; |
| use std::process::{Command, exit}; |
| |
| fn main() { |
| if env::args().skip(1).any(|s| s == "--child") { |
| child(); |
| } else { |
| parent(); |
| } |
| } |
| |
| fn parent() { |
| let exe = env::current_exe().unwrap(); |
| |
| // Use the DETACH_PROCESS to create a subprocess that isn't attached to the console. |
| // The subprocess's exit status will be 0 if it's detached. |
| let status = Command::new(&exe) |
| .arg("--child") |
| .creation_flags(DETACH_PROCESS) |
| .spawn() |
| .unwrap() |
| .wait() |
| .unwrap(); |
| assert_eq!(status.code(), Some(0)); |
| |
| // Try without DETACH_PROCESS to ensure this test works. |
| let status = Command::new(&exe).arg("--child").spawn().unwrap().wait().unwrap(); |
| assert_eq!(status.code(), Some(1)); |
| } |
| |
| // exits with 1 if the console is attached or 0 otherwise |
| fn child() { |
| // Get the attached console's code page. |
| // This will fail (return 0) if no console is attached. |
| let has_console = GetConsoleCP() != 0; |
| exit(has_console as i32); |
| } |
| |
| // Windows API definitions. |
| const DETACH_PROCESS: u32 = 0x00000008; |
| #[link(name = "kernel32")] |
| unsafe extern "system" { |
| safe fn GetConsoleCP() -> u32; |
| } |