diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
commit | 698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch) | |
tree | 173a775858bd501c378080a10dca74132f05bc50 /vendor/xshell/tests/data/xecho.rs | |
parent | Initial commit. (diff) | |
download | rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip |
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/xshell/tests/data/xecho.rs')
-rw-r--r-- | vendor/xshell/tests/data/xecho.rs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/vendor/xshell/tests/data/xecho.rs b/vendor/xshell/tests/data/xecho.rs new file mode 100644 index 000000000..ac86433c3 --- /dev/null +++ b/vendor/xshell/tests/data/xecho.rs @@ -0,0 +1,85 @@ +use std::io::{self, Write}; + +fn main() { + if let Err(err) = try_main() { + eprintln!("{err}"); + std::process::exit(1); + } +} + +fn try_main() -> io::Result<()> { + let mut tee_stderr = false; + let mut echo_stdin = false; + let mut echo_env = false; + let mut fail = false; + let mut suicide = false; + + let mut args = std::env::args().skip(1).peekable(); + while let Some(arg) = args.peek() { + match arg.as_str() { + "-e" => tee_stderr = true, + "-i" => echo_stdin = true, + "-$" => echo_env = true, + "-f" => fail = true, + "-s" => suicide = true, + _ => break, + } + args.next(); + } + + let stdin = io::stdin(); + let stdout = io::stdout(); + let stderr = io::stderr(); + let mut stdin = stdin.lock(); + let mut stdout = stdout.lock(); + let mut stderr = stderr.lock(); + macro_rules! w { + ($($tt:tt)*) => { + write!(stdout, $($tt)*)?; + if tee_stderr { + write!(stderr, $($tt)*)?; + } + } + } + + if echo_stdin { + io::copy(&mut stdin, &mut stdout)?; + } else if echo_env { + for key in args { + if let Some(v) = std::env::var_os(&key) { + w!("{}={}\n", key, v.to_string_lossy()); + } + } + } else { + let mut space = ""; + for arg in args { + w!("{}{}", space, arg); + space = " "; + } + w!("\n"); + } + + if fail { + return Err(io::ErrorKind::Other.into()); + } + if suicide { + #[cfg(unix)] + unsafe { + let pid = signals::getpid(); + if pid > 0 { + signals::kill(pid, 9); + } + } + } + + Ok(()) +} + +#[cfg(unix)] +mod signals { + use std::os::raw::c_int; + extern "C" { + pub fn kill(pid: c_int, sig: c_int) -> c_int; + pub fn getpid() -> c_int; + } +} |