diff --git a/src/args.rs b/src/args.rs index 99e01fdd3..921fde43c 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 c2db42922..0e954093d 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;