From ab0d1c1c797c0464ad4fcdfc641bcf88f9ade304 Mon Sep 17 00:00:00 2001 From: Andrew Gallant Date: Sun, 25 Sep 2016 11:13:16 -0400 Subject: Be more conservative with stdin. If no paths are given to ripgrep, only read from stdin if it's a file or a FIFO. In particular, if something like `rg foo < /dev/null` is used, then don't try to read from stdin. Fixes #35, #81 --- src/args.rs | 3 ++- src/atty.rs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/args.rs b/src/args.rs index 99e01fdd..921fde43 100644 --- a/src/args.rs +++ b/src/args.rs @@ -279,7 +279,8 @@ impl RawArgs { if self.arg_path.is_empty() { if atty::on_stdin() || self.flag_files - || self.flag_type_list { + || self.flag_type_list + || !atty::stdin_is_readable() { vec![Path::new("./").to_path_buf()] } else { vec![Path::new("-").to_path_buf()] diff --git a/src/atty.rs b/src/atty.rs index c2db4292..0e954093 100644 --- a/src/atty.rs +++ b/src/atty.rs @@ -4,6 +4,29 @@ from (or to) a terminal. Windows and Unix do this differently, so implement both here. */ +#[cfg(unix)] +pub fn stdin_is_readable() -> bool { + use std::fs::File; + use std::os::unix::fs::FileTypeExt; + use std::os::unix::io::{FromRawFd, IntoRawFd}; + use libc; + + let file = unsafe { File::from_raw_fd(libc::STDIN_FILENO) }; + let md = file.metadata(); + let _ = file.into_raw_fd(); + let ft = match md { + Err(_) => return false, + Ok(md) => md.file_type(), + }; + ft.is_file() || ft.is_fifo() +} + +#[cfg(windows)] +pub fn stdin_is_readable() -> bool { + // ??? + true +} + #[cfg(unix)] pub fn on_stdin() -> bool { use libc; -- cgit v1.2.3