strat9_kernel/shell/commands/net/
telnet.rs1use super::*;
2
3pub 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}