summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2016-09-25 11:13:16 -0400
committerAndrew Gallant <jamslam@gmail.com>2016-09-25 11:14:54 -0400
commitab0d1c1c797c0464ad4fcdfc641bcf88f9ade304 (patch)
tree8dcc56bd5637c7e6bf8c446575e3a9c7ce382e16
parent2015c56e8d6405b435cfdecc4d204489ee7256a3 (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.rs3
-rw-r--r--src/atty.rs23
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) }