diff options
author | Andrew Gallant <jamslam@gmail.com> | 2016-09-25 11:13:16 -0400 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2016-09-25 11:14:54 -0400 |
commit | ab0d1c1c797c0464ad4fcdfc641bcf88f9ade304 (patch) | |
tree | 8dcc56bd5637c7e6bf8c446575e3a9c7ce382e16 | |
parent | 2015c56e8d6405b435cfdecc4d204489ee7256a3 (diff) |
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
-rw-r--r-- | src/args.rs | 3 | ||||
-rw-r--r-- | src/atty.rs | 23 |
2 files changed, 25 insertions, 1 deletions
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 @@ -5,6 +5,29 @@ 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; 0 < unsafe { libc::isatty(libc::STDIN_FILENO) } |