mirror of
https://github.com/openharmony/third_party_rust_rustix.git
synced 2026-07-21 02:05:28 -04:00
4e2599b729
* Fix the tests to run on 1.48. This puts the benchmarks behind a `criterion` cfg, so add `--cfg=criterion` to RUSTFLAGS when running cargo bench. An MSRV of 1.48 enables us to support users such as async-io, which also has an MSRV of 1.48. * Add a rust-version field. This prints a warning under Rust 1.48, but only when rustix is the top-level build; when rustix is a dependency, it doesn't warn, so this seems ok.
502 lines
17 KiB
Rust
502 lines
17 KiB
Rust
//! A command which prints out information about the standard input,
|
|
//! output, and error streams provided to it.
|
|
|
|
#![cfg_attr(io_lifetimes_use_std, feature(io_safety))]
|
|
|
|
#[cfg(not(windows))]
|
|
use rustix::fd::AsFd;
|
|
#[cfg(not(windows))]
|
|
use rustix::io::{self, stderr, stdin, stdout};
|
|
#[cfg(feature = "termios")]
|
|
#[cfg(not(windows))]
|
|
use rustix::termios::isatty;
|
|
#[cfg(all(
|
|
not(any(windows, target_os = "fuchsia")),
|
|
feature = "termios",
|
|
feature = "procfs"
|
|
))]
|
|
use rustix::termios::ttyname;
|
|
|
|
#[cfg(not(windows))]
|
|
fn main() -> io::Result<()> {
|
|
let (stdin, stdout, stderr) = unsafe { (stdin(), stdout(), stderr()) };
|
|
|
|
println!("Stdin:");
|
|
show(&stdin)?;
|
|
|
|
println!("Stdout:");
|
|
show(&stdout)?;
|
|
|
|
println!("Stderr:");
|
|
show(&stderr)?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(not(windows))]
|
|
fn show<Fd: AsFd>(fd: Fd) -> io::Result<()> {
|
|
let fd = fd.as_fd();
|
|
println!(" - ready: {:?}", rustix::io::ioctl_fionread(fd)?);
|
|
|
|
#[cfg(feature = "termios")]
|
|
if isatty(fd) {
|
|
#[cfg(feature = "procfs")]
|
|
#[cfg(not(target_os = "fuchsia"))]
|
|
println!(" - ttyname: {}", ttyname(fd, Vec::new())?.to_string_lossy());
|
|
|
|
#[cfg(target_os = "wasi")]
|
|
println!(" - is a tty");
|
|
|
|
#[cfg(not(target_os = "wasi"))]
|
|
println!(" - process group: {:?}", rustix::termios::tcgetpgrp(fd)?);
|
|
|
|
#[cfg(not(target_os = "wasi"))]
|
|
println!(" - winsize: {:?}", rustix::termios::tcgetwinsize(fd)?);
|
|
|
|
#[cfg(not(target_os = "wasi"))]
|
|
{
|
|
use rustix::termios::*;
|
|
let term = tcgetattr(fd)?;
|
|
|
|
if let Some(speed) = speed_value(cfgetispeed(&term)) {
|
|
println!(" - ispeed: {}", speed);
|
|
}
|
|
if let Some(speed) = speed_value(cfgetospeed(&term)) {
|
|
println!(" - ospeed: {}", speed);
|
|
}
|
|
|
|
print!(" - in flags:");
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & IGNBRK) != 0 {
|
|
print!(" IGNBRK");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & BRKINT) != 0 {
|
|
print!(" BRKINT");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & IGNPAR) != 0 {
|
|
print!(" IGNPAR");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & PARMRK) != 0 {
|
|
print!(" PARMRK");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & INPCK) != 0 {
|
|
print!(" INPCK");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & ISTRIP) != 0 {
|
|
print!(" ISTRIP");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & INLCR) != 0 {
|
|
print!(" INLCR");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & IGNCR) != 0 {
|
|
print!(" IGNCR");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & ICRNL) != 0 {
|
|
print!(" ICRNL");
|
|
}
|
|
#[cfg(any(
|
|
linux_raw,
|
|
all(
|
|
libc,
|
|
any(target_os = "haiku", target_os = "illumos", target_os = "solaris"),
|
|
)
|
|
))]
|
|
if (term.c_iflag & IUCLC) != 0 {
|
|
print!(" IUCLC");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & IXON) != 0 {
|
|
print!(" IXON");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & IXANY) != 0 {
|
|
print!(" IXANY");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & IXOFF) != 0 {
|
|
print!(" IXOFF");
|
|
}
|
|
#[cfg(not(any(target_os = "haiku", target_os = "ios", target_os = "macos")))]
|
|
if (term.c_iflag & IMAXBEL) != 0 {
|
|
print!(" IMAXBEL");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "emscripten",
|
|
target_os = "freebsd",
|
|
target_os = "haiku",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_iflag & IUTF8) != 0 {
|
|
print!(" IUTF8");
|
|
}
|
|
println!();
|
|
|
|
print!(" - out flags:");
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_oflag & OPOST) != 0 {
|
|
print!(" OPOST");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "redox",
|
|
)))]
|
|
if (term.c_oflag & OLCUC) != 0 {
|
|
print!(" OLCUC");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_oflag & ONLCR) != 0 {
|
|
print!(" ONLCR");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_oflag & OCRNL) != 0 {
|
|
print!(" OCRNL");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_oflag & ONOCR) != 0 {
|
|
print!(" ONOCR");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_oflag & ONLRET) != 0 {
|
|
print!(" ONLRET");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
)))]
|
|
if (term.c_oflag & OFILL) != 0 {
|
|
print!(" OFILL");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
)))]
|
|
if (term.c_oflag & OFDEL) != 0 {
|
|
print!(" OFDEL");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_oflag & NLDLY) != 0 {
|
|
print!(" NLDLY");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_oflag & CRDLY) != 0 {
|
|
print!(" CRDLY");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "illumos",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_oflag & TABDLY) != 0 {
|
|
print!(" TABDLY");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_oflag & BSDLY) != 0 {
|
|
print!(" BSDLY");
|
|
}
|
|
#[cfg(not(any(
|
|
all(libc, target_env = "musl"),
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_oflag & VTDLY) != 0 {
|
|
print!(" VTDLY");
|
|
}
|
|
#[cfg(not(any(
|
|
all(libc, target_env = "musl"),
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_oflag & FFDLY) != 0 {
|
|
print!(" FFDLY");
|
|
}
|
|
println!();
|
|
|
|
print!(" - control flags:");
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "haiku",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
)))]
|
|
if (term.c_cflag & CBAUD) != 0 {
|
|
print!(" CBAUD");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "freebsd",
|
|
target_os = "haiku",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_cflag & CBAUDEX) != 0 {
|
|
print!(" CBAUDEX");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & CSIZE) != 0 {
|
|
print!(" CSIZE");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & CSTOPB) != 0 {
|
|
print!(" CSTOPB");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & CREAD) != 0 {
|
|
print!(" CREAD");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & PARENB) != 0 {
|
|
print!(" PARENB");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & PARODD) != 0 {
|
|
print!(" PARODD");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & HUPCL) != 0 {
|
|
print!(" HUPCL");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & CLOCAL) != 0 {
|
|
print!(" CLOCAL");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "emscripten",
|
|
target_os = "freebsd",
|
|
target_os = "haiku",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
)))]
|
|
if (term.c_cflag & CIBAUD) != 0 {
|
|
print!(" CIBAUD");
|
|
}
|
|
#[cfg(not(any(
|
|
target_os = "dragonfly",
|
|
target_os = "emscripten",
|
|
target_os = "freebsd",
|
|
target_os = "haiku",
|
|
target_os = "illumos",
|
|
target_os = "ios",
|
|
target_os = "macos",
|
|
target_os = "netbsd",
|
|
target_os = "openbsd",
|
|
target_os = "redox",
|
|
target_os = "solaris",
|
|
)))]
|
|
if (term.c_cflag & CMSPAR) != 0 {
|
|
print!(" CMSPAR");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_cflag & CRTSCTS) != 0 {
|
|
print!(" CRTSCTS");
|
|
}
|
|
println!();
|
|
|
|
print!(" - local flags:");
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ISIG) != 0 {
|
|
print!(" ISIG");
|
|
}
|
|
if (term.c_lflag & ICANON) != 0 {
|
|
print!(" ICANON");
|
|
}
|
|
#[cfg(any(linux_raw, all(libc, any(target_arch = "s390x", target_os = "haiku"))))]
|
|
if (term.c_lflag & XCASE) != 0 {
|
|
print!(" XCASE");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ECHO) != 0 {
|
|
print!(" ECHO");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ECHOE) != 0 {
|
|
print!(" ECHOE");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ECHOK) != 0 {
|
|
print!(" ECHOK");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ECHONL) != 0 {
|
|
print!(" ECHONL");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ECHOCTL) != 0 {
|
|
print!(" ECHOCTL");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ECHOPRT) != 0 {
|
|
print!(" ECHOPRT");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & ECHOKE) != 0 {
|
|
print!(" ECHOKE");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & FLUSHO) != 0 {
|
|
print!(" FLUSHO");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & NOFLSH) != 0 {
|
|
print!(" NOFLSH");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & TOSTOP) != 0 {
|
|
print!(" TOSTOP");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & PENDIN) != 0 {
|
|
print!(" PENDIN");
|
|
}
|
|
#[cfg(not(any(target_os = "ios", target_os = "macos")))]
|
|
if (term.c_lflag & IEXTEN) != 0 {
|
|
print!(" IEXTEN");
|
|
}
|
|
println!();
|
|
|
|
println!(
|
|
" - keys: INTR={} QUIT={} ERASE={} KILL={} EOF={} TIME={} MIN={} ",
|
|
key(term.c_cc[VINTR]),
|
|
key(term.c_cc[VQUIT]),
|
|
key(term.c_cc[VERASE]),
|
|
key(term.c_cc[VKILL]),
|
|
key(term.c_cc[VEOF]),
|
|
term.c_cc[VTIME],
|
|
term.c_cc[VMIN]
|
|
);
|
|
println!(
|
|
" START={} STOP={} SUSP={} EOL={}",
|
|
key(term.c_cc[VSTART]),
|
|
key(term.c_cc[VSTOP]),
|
|
key(term.c_cc[VSUSP]),
|
|
key(term.c_cc[VEOL]),
|
|
);
|
|
#[cfg(not(target_os = "haiku"))]
|
|
println!(
|
|
" REPRINT={} DISCARD={}",
|
|
key(term.c_cc[VREPRINT]),
|
|
key(term.c_cc[VDISCARD])
|
|
);
|
|
#[cfg(not(target_os = "haiku"))]
|
|
println!(
|
|
" WERASE={} VLNEXT={}",
|
|
key(term.c_cc[VWERASE]),
|
|
key(term.c_cc[VLNEXT]),
|
|
);
|
|
println!(" EOL2={}", key(term.c_cc[VEOL2]));
|
|
}
|
|
} else {
|
|
println!(" - is not a tty");
|
|
}
|
|
|
|
println!();
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(feature = "termios")]
|
|
#[cfg(not(windows))]
|
|
fn key(b: u8) -> String {
|
|
if b == 0 {
|
|
format!("<undef>")
|
|
} else if b < 0x20 {
|
|
format!("^{}", (b + 0x40) as char)
|
|
} else if b == 0x7f {
|
|
format!("^?")
|
|
} else {
|
|
format!("{}", b as char)
|
|
}
|
|
}
|
|
|
|
#[cfg(windows)]
|
|
fn main() {
|
|
unimplemented!()
|
|
}
|