Skip to main content

strat9_kernel/shell/commands/net/
telnet.rs

1use super::*;
2
3/// Open a TCP connection and send/receive data interactively.
4///
5/// Usage: `telnet <ip> <port> [--http]`
6///
7/// With `--http`, sends an HTTP GET and prints the response.
8pub fn cmd_telnet(args: &[String]) -> Result<(), ShellError> {
9    if args.len() < 2 {
10        shell_println!("Usage: telnet <ip> <port> [--http]");
11        return Err(ShellError::InvalidArguments);
12    }
13    let ip = &args[0];
14    let port = &args[1];
15    let http_mode = args.get(2).map(|s| s.as_str()) == Some("--http");
16
17    let path = alloc::format!("/net/tcp/connect/{}/{}", ip, port);
18    let fd = match vfs::open(&path, OpenFlags::RDWR) {
19        Ok(fd) => fd,
20        Err(e) => {
21            shell_println!("telnet: connect failed: {:?}", e);
22            return Err(ShellError::ExecutionFailed);
23        }
24    };
25
26    shell_println!("Connected to {}:{}", ip, port);
27
28    for _ in 0..50 {
29        shell_sleep_ms(100);
30        if crate::shell::is_interrupted() {
31            shell_println!("^C");
32            let _ = vfs::close(fd);
33            return Ok(());
34        }
35    }
36
37    if http_mode {
38        let req = alloc::format!("GET / HTTP/1.0\r\nHost: {}\r\n\r\n", ip);
39        let _ = vfs::write(fd, req.as_bytes());
40    }
41
42    let mut buf = [0u8; 256];
43    let mut total = 0usize;
44    for _ in 0..100 {
45        if crate::shell::is_interrupted() {
46            shell_println!("^C");
47            break;
48        }
49        match vfs::read(fd, &mut buf) {
50            Ok(0) => break,
51            Ok(n) => {
52                if let Ok(s) = core::str::from_utf8(&buf[..n]) {
53                    crate::shell_print!("{}", s);
54                }
55                total += n;
56            }
57            Err(_) => {
58                shell_sleep_ms(100);
59            }
60        }
61    }
62    shell_println!("\nConnection closed ({} bytes received)", total);
63    let _ = vfs::close(fd);
64    Ok(())
65}