...
1use std::env;
2use std::fs;
3use std::io;
4use std::io::{Read,Write};
5use std::net::{TcpListener};
6use std::os::wasi::io::FromRawFd;
7use std::process::exit;
8use std::str::from_utf8;
9
10// Until NotADirectory is implemented, read the underlying error raised by
11// wasi-libc. See https://github.com/rust-lang/rust/issues/86442
12use libc::ENOTDIR;
13
14fn main() {
15 let args: Vec<String> = env::args().collect();
16
17 match args[1].as_str() {
18 "ls" => {
19 main_ls(&args[2]);
20 if args.len() == 4 && args[3].as_str() == "repeat" {
21 main_ls(&args[2]);
22 }
23 }
24 "stat" => main_stat(),
25 "sock" => main_sock(),
26 _ => {
27 writeln!(io::stderr(), "unknown command: {}", args[1]).unwrap();
28 exit(1);
29 }
30 }
31}
32
33fn main_ls(dir_name: &String) {
34 match fs::read_dir(dir_name) {
35 Ok(paths) => {
36 for ent in paths.into_iter() {
37 println!("{}", ent.unwrap().path().display());
38 }
39 }
40 Err(e) => {
41 if let Some(error_code) = e.raw_os_error() {
42 if error_code == ENOTDIR {
43 println!("ENOTDIR");
44 } else {
45 println!("errno=={}", error_code);
46 }
47 } else {
48 writeln!(io::stderr(), "failed to read directory: {}", e).unwrap();
49 }
50 }
51 }
52}
53
54extern crate libc;
55
56fn main_stat() {
57 unsafe {
58 println!("stdin isatty: {}", libc::isatty(0) != 0);
59 println!("stdout isatty: {}", libc::isatty(1) != 0);
60 println!("stderr isatty: {}", libc::isatty(2) != 0);
61 println!("/ isatty: {}", libc::isatty(3) != 0);
62 }
63}
64
65fn main_sock() {
66 // Get a listener from the pre-opened file descriptor.
67 // The listener is the first pre-open, with a file-descriptor of 3.
68 let listener = unsafe { TcpListener::from_raw_fd(3) };
69 for conn in listener.incoming() {
70 match conn {
71 Ok(mut conn) => {
72 // Do a blocking read of up to 32 bytes.
73 // Note: the test should write: "wazero", so that's all we should read.
74 let mut data = [0 as u8; 32];
75 match conn.read(&mut data) {
76 Ok(size) => {
77 let text = from_utf8(&data[0..size]).unwrap();
78 println!("{}", text);
79
80 // Exit instead of accepting another connection.
81 exit(0);
82 },
83 Err(e) => writeln!(io::stderr(), "failed to read data: {}", e).unwrap(),
84 } {}
85 }
86 Err(e) => writeln!(io::stderr(), "failed to read connection: {}", e).unwrap(),
87 }
88 }
89}
View as plain text