From 3065a8c9c839f7e722a73e8375f2e41c7e084737 Mon Sep 17 00:00:00 2001 From: Jack O'Connor Date: Sun, 27 Aug 2017 14:32:20 -0400 Subject: [PATCH] restore the default SIGPIPE behavior as a temporary workaround See https://github.com/BurntSushi/ripgrep/issues/200. --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index a9ed1c055..24763126b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,6 +10,7 @@ dependencies = [ "grep 0.1.6", "ignore 0.2.2", "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 9886d9dca..aeb2aee79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ env_logger = { version = "0.4", default-features = false } grep = { version = "0.1.5", path = "grep" } ignore = { version = "0.2.2", path = "ignore" } lazy_static = "0.2" +libc = "0.2" log = "0.3" memchr = "1" memmap = "0.5" diff --git a/src/main.rs b/src/main.rs index ce49263fe..73ced9552 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,6 +54,7 @@ mod worker; pub type Result = result::Result>; fn main() { + reset_sigpipe(); match Args::parse().map(Arc::new).and_then(run) { Ok(0) => process::exit(1), Ok(_) => process::exit(0), @@ -329,3 +330,22 @@ fn eprint_nothing_searched() { applied a filter you didn't expect. \ Try running again with --debug."); } + +// The Rust standard library suppresses the default SIGPIPE behavior, so that +// writing to a closed pipe doesn't kill the process. The goal is to instead +// handle errors through the normal result mechanism. Ripgrep needs some +// refactoring before it will be able to do that, however, so we re-enable the +// standard SIGPIPE behavior as a workaround. See +// https://github.com/BurntSushi/ripgrep/issues/200. +#[cfg(unix)] +fn reset_sigpipe() { + extern crate libc; + unsafe { + libc::signal(libc::SIGPIPE, libc::SIG_DFL); + } +} + +#[cfg(not(unix))] +fn reset_sigpipe() { + // no-op +}