| // 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; | |
| } |