about summary refs log tree commit diff
path: root/library/std/src/sys/unix/io.rs
diff options
context:
space:
mode:
authorJosh Triplett <josh@joshtriplett.org>2022-06-12 14:10:18 -0700
committerJosh Triplett <josh@joshtriplett.org>2022-10-15 00:35:38 +0100
commit326ef470a8b379a180d6dc4bbef08990698a737a (patch)
tree1466bde52b4eb3e910ec2811981bd656f9e9c757 /library/std/src/sys/unix/io.rs
parentbf15a9e5263fcea065a7ae9c179b2d24c2deb670 (diff)
downloadrust-326ef470a8b379a180d6dc4bbef08990698a737a.tar.gz
rust-326ef470a8b379a180d6dc4bbef08990698a737a.zip
Add `IsTerminal` trait to determine if a descriptor or handle is a terminal
The UNIX and WASI implementations use `isatty`. The Windows
implementation uses the same logic the `atty` crate uses, including the
hack needed to detect msys terminals.

Implement this trait for `File` and for `Stdin`/`Stdout`/`Stderr` and
their locked counterparts on all platforms. On UNIX and WASI, implement
it for `BorrowedFd`/`OwnedFd`. On Windows, implement it for
`BorrowedHandle`/`OwnedHandle`.

Based on https://github.com/rust-lang/rust/pull/91121

Co-authored-by: Matt Wilkinson <mattwilki17@gmail.com>
Diffstat (limited to 'library/std/src/sys/unix/io.rs')
-rw-r--r--library/std/src/sys/unix/io.rs6
1 files changed, 6 insertions, 0 deletions
diff --git a/library/std/src/sys/unix/io.rs b/library/std/src/sys/unix/io.rs
index deb5ee76bd0..29c340dd349 100644
--- a/library/std/src/sys/unix/io.rs
+++ b/library/std/src/sys/unix/io.rs
@@ -1,4 +1,5 @@
 use crate::marker::PhantomData;
+use crate::os::fd::{AsFd, AsRawFd};
 use crate::slice;
 
 use libc::{c_void, iovec};
@@ -74,3 +75,8 @@ impl<'a> IoSliceMut<'a> {
         unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
     }
 }
+
+pub fn is_terminal(fd: &impl AsFd) -> bool {
+    let fd = fd.as_fd();
+    unsafe { libc::isatty(fd.as_raw_fd()) != 0 }
+}