summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/cli/src/lib.rs61
1 files changed, 55 insertions, 6 deletions
diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs
index 643d796c..b27592d9 100644
--- a/crates/cli/src/lib.rs
+++ b/crates/cli/src/lib.rs
@@ -178,22 +178,71 @@ pub fn is_readable_stdin() -> bool {
};
let stdin = std::io::stdin();
- let Ok(fd) = stdin.as_fd().try_clone_to_owned() else { return false };
+ let fd = match stdin.as_fd().try_clone_to_owned() {
+ Ok(fd) => fd,
+ Err(err) => {
+ log::debug!(
+ "for heuristic stdin detection on Unix, \
+ could not clone stdin file descriptor \
+ (thus assuming stdin is not readable): {err}",
+ );
+ return false;
+ }
+ };
let file = File::from(fd);
- let Ok(md) = file.metadata() else { return false };
+ let md = match file.metadata() {
+ Ok(md) => md,
+ Err(err) => {
+ log::debug!(
+ "for heuristic stdin detection on Unix, \
+ could not get file metadata for stdin \
+ (thus assuming stdin is not readable): {err}",
+ );
+ return false;
+ }
+ };
let ft = md.file_type();
- ft.is_file() || ft.is_fifo() || ft.is_socket()
+ let is_file = ft.is_file();
+ let is_fifo = ft.is_fifo();
+ let is_socket = ft.is_socket();
+ let is_readable = is_file || is_fifo || is_socket;
+ log::debug!(
+ "for heuristic stdin detection on Unix, \
+ found that \
+ is_file={is_file}, is_fifo={is_fifo} and is_socket={is_socket}, \
+ and thus concluded that is_stdin_readable={is_readable}",
+ );
+ is_readable
}
#[cfg(windows)]
fn imp() -> bool {
- winapi_util::file::typ(winapi_util::HandleRef::stdin())
- .map(|t| t.is_disk() || t.is_pipe())
- .unwrap_or(false)
+ let stdin = winapi_util::HandleRef::stdin();
+ let typ = match winapi_util::file::typ(stdin) {
+ Ok(typ) => typ,
+ Err(err) => {
+ log::debug!(
+ "for heuristic stdin detection on Windows, \
+ could not get file type of stdin \
+ (thus assuming stdin is not readable): {err}",
+ );
+ return false;
+ }
+ };
+ let is_disk = typ.is_disk();
+ let is_pipe = typ.is_pipe();
+ let is_readable = is_disk || is_pipe;
+ log::debug!(
+ "for heuristic stdin detection on Windows, \
+ found that is_disk={is_disk} and is_pipe={is_pipe}, \
+ and thus concluded that is_stdin_readable={is_readable}",
+ );
+ is_readable
}
#[cfg(not(any(unix, windows)))]
fn imp() -> bool {
+ log::debug!("on non-{{Unix,Windows}}, assuming stdin is not readable");
false
}