mirror of https://github.com/rust-lang/rust
35 lines
1.1 KiB
Rust
35 lines
1.1 KiB
Rust
// It is UB to unwind out of `fn start()` according to
|
|
// https://doc.rust-lang.org/beta/unstable-book/language-features/start.html so
|
|
// panic with abort to avoid UB:
|
|
//@ compile-flags: -Cpanic=abort
|
|
//@ no-prefer-dynamic so panic=abort works
|
|
|
|
#![feature(start, rustc_private)]
|
|
|
|
extern crate libc;
|
|
|
|
// Use #[start] so we don't have a runtime that messes with SIGPIPE.
|
|
#[start]
|
|
fn start(argc: isize, argv: *const *const u8) -> isize {
|
|
assert_eq!(argc, 2, "Must pass SIG_IGN or SIG_DFL as first arg");
|
|
let arg1 = unsafe { std::ffi::CStr::from_ptr(*argv.offset(1) as *const libc::c_char) }
|
|
.to_str()
|
|
.unwrap();
|
|
|
|
let expected = match arg1 {
|
|
"SIG_IGN" => libc::SIG_IGN,
|
|
"SIG_DFL" => libc::SIG_DFL,
|
|
arg => panic!("Must pass SIG_IGN or SIG_DFL as first arg. Got: {}", arg),
|
|
};
|
|
|
|
let actual = unsafe {
|
|
let mut actual: libc::sigaction = std::mem::zeroed();
|
|
libc::sigaction(libc::SIGPIPE, std::ptr::null(), &mut actual);
|
|
actual.sa_sigaction
|
|
};
|
|
|
|
assert_eq!(actual, expected, "actual and expected SIGPIPE disposition in child differs");
|
|
|
|
0
|
|
}
|