Skip to main content

strat9_kernel/shell/commands/net/
nslookup.rs

1use super::*;
2
3/// Minimal DNS lookup command.
4///
5/// Reads the configured DNS servers and attempts a resolution via the
6/// `/net/dns/resolve/<domain>` scheme path. If the network strate does
7/// not yet support it, shows the configured nameservers and a TODO.
8pub fn cmd_nslookup(args: &[String]) -> Result<(), ShellError> {
9    if args.is_empty() {
10        shell_println!("Usage: nslookup <domain>");
11        return Err(ShellError::InvalidArguments);
12    }
13    let domain = &args[0];
14
15    let dns = match vfs::open("/net/dns", OpenFlags::READ) {
16        Ok(fd) => {
17            let mut buf = [0u8; 128];
18            let n = vfs::read(fd, &mut buf).unwrap_or(0);
19            let _ = vfs::close(fd);
20            let s = core::str::from_utf8(&buf[..n]).unwrap_or("").trim();
21            String::from(s)
22        }
23        Err(_) => String::from("(not configured)"),
24    };
25    shell_println!("Server: {}", dns);
26
27    let resolve_path = alloc::format!("/net/dns/resolve/{}", domain);
28    match vfs::open(&resolve_path, OpenFlags::READ) {
29        Ok(fd) => {
30            let mut buf = [0u8; 256];
31            let n = vfs::read(fd, &mut buf).unwrap_or(0);
32            let _ = vfs::close(fd);
33            if n > 0 {
34                let result = core::str::from_utf8(&buf[..n]).unwrap_or("(invalid)");
35                shell_println!("Name:   {}", domain);
36                shell_println!("Address: {}", result.trim());
37            } else {
38                shell_println!("** cannot resolve {}", domain);
39            }
40        }
41        Err(_) => {
42            // TODO: optional fallback resolver if /net/resolve is unavailable
43            shell_println!("** DNS resolution unavailable in /net scheme");
44            shell_println!("   Configured nameserver(s): {}", dns);
45        }
46    }
47    Ok(())
48}