2024-04-01 04:27:48 -05:00
|
|
|
//@ ignore-cross-compile because aux-bin does not yet support it
|
|
|
|
//@ only-unix because SIGPIPE is a unix thing
|
|
|
|
//@ aux-bin: assert-inherit-sig_dfl.rs
|
|
|
|
//@ aux-bin: assert-inherit-sig_ign.rs
|
2022-07-05 12:56:22 -05:00
|
|
|
//@ run-pass
|
2024-04-28 11:02:21 -05:00
|
|
|
//@ compile-flags: -Zon-broken-pipe=kill
|
2024-04-18 15:50:06 -05:00
|
|
|
//@ only-unix because SIGPIPE is a unix thing
|
2022-07-05 12:56:22 -05:00
|
|
|
|
2024-04-28 11:02:21 -05:00
|
|
|
#![feature(rustc_private)]
|
2022-07-05 12:56:22 -05:00
|
|
|
|
2024-04-01 04:27:48 -05:00
|
|
|
extern crate libc;
|
|
|
|
|
2024-04-28 23:49:39 -05:00
|
|
|
// By default the Rust runtime resets SIGPIPE to SIG_DFL before exec'ing child
|
2024-04-28 11:02:21 -05:00
|
|
|
// processes so opt-out of that with `-Zon-broken-pipe=kill`. See
|
2024-04-01 04:27:48 -05:00
|
|
|
// https://github.com/rust-lang/rust/blob/bf4de3a874753bbee3323081c8b0c133444fed2d/library/std/src/sys/pal/unix/process/process_unix.rs#L359-L384
|
2022-07-05 12:56:22 -05:00
|
|
|
fn main() {
|
2024-04-28 11:02:21 -05:00
|
|
|
// First expect SIG_DFL in a child process with -`Zon-broken-pipe=inherit`.
|
2024-04-01 04:27:48 -05:00
|
|
|
assert_inherit_sigpipe_disposition("auxiliary/bin/assert-inherit-sig_dfl");
|
|
|
|
|
2024-04-28 11:02:21 -05:00
|
|
|
// With SIG_IGN we expect `-Zon-broken-pipe=inherit` to also get SIG_IGN.
|
2024-04-01 04:27:48 -05:00
|
|
|
unsafe {
|
|
|
|
libc::signal(libc::SIGPIPE, libc::SIG_IGN);
|
|
|
|
}
|
|
|
|
assert_inherit_sigpipe_disposition("auxiliary/bin/assert-inherit-sig_ign");
|
|
|
|
}
|
2022-07-05 12:56:22 -05:00
|
|
|
|
2024-04-01 04:27:48 -05:00
|
|
|
fn assert_inherit_sigpipe_disposition(aux_bin: &str) {
|
|
|
|
let mut cmd = std::process::Command::new(aux_bin);
|
|
|
|
assert!(cmd.status().unwrap().success());
|
2022-07-05 12:56:22 -05:00
|
|
|
}
|