#![no_std] #![no_main] use lancer_user::io::write_bytes; use lancer_user::net; use lancer_user::syscall; #[unsafe(no_mangle)] pub extern "C" fn lancer_main() -> ! { let (rx, tx) = match net::init() { Some(pair) => pair, None => { lancer_user::show!(net, error, "netsock init failed"); syscall::exit(); } }; if !net::has_relay() { write_bytes(b"networking not available (use SSH)\n"); syscall::exit(); } let mut args_buf = [0u8; 128]; let args_len = net::recv_args(&rx, &mut args_buf); let args = &args_buf[..args_len]; let (_cmd_tok, rest) = net::next_token(args); let (hostname_tok, _) = net::next_token(rest); if hostname_tok.is_empty() { write_bytes(b"usage: resolve \n"); syscall::exit(); } let mut msg = [0u8; 62]; let len = hostname_tok.len().min(61); msg[1..1 + len].copy_from_slice(&hostname_tok[..len]); let mut any = false; let mut resp_buf = [0u8; 64]; msg[0] = net::MSG_DNS_QUERY; net::send_request(&tx, &msg[..1 + len]); let n = net::recv_response_blocking(&rx, &mut resp_buf); if n >= 6 && resp_buf[0] == net::MSG_DNS_RESULT && resp_buf[1] == 0 { let mut out = [0u8; 20]; let pos = net::write_ip_decimal(&mut out, &resp_buf[2..6]); write_bytes(&out[..pos]); write_bytes(b"\n"); any = true; } msg[0] = net::MSG_DNS_QUERY6; net::send_request(&tx, &msg[..1 + len]); let n = net::recv_response_blocking(&rx, &mut resp_buf); if n >= 18 && resp_buf[0] == net::MSG_DNS_RESULT6 && resp_buf[1] == 0 { let mut out = [0u8; 48]; let pos = net::write_ipv6(&mut out, &resp_buf[2..18]); write_bytes(&out[..pos]); write_bytes(b"\n"); any = true; } if !any { write_bytes(b"DNS lookup failed\n"); } syscall::exit() }