Nothing to see here, move along
at main 71 lines 1.9 kB view raw
1#![no_std] 2#![no_main] 3 4use lancer_user::io::write_bytes; 5use lancer_user::net; 6use lancer_user::syscall; 7 8#[unsafe(no_mangle)] 9pub extern "C" fn lancer_main() -> ! { 10 let (rx, tx) = match net::init() { 11 Some(pair) => pair, 12 None => { 13 lancer_user::show!(net, error, "netsock init failed"); 14 syscall::exit(); 15 } 16 }; 17 18 if !net::has_relay() { 19 write_bytes(b"networking not available (use SSH)\n"); 20 syscall::exit(); 21 } 22 23 let mut args_buf = [0u8; 128]; 24 let args_len = net::recv_args(&rx, &mut args_buf); 25 let args = &args_buf[..args_len]; 26 27 let (_cmd_tok, rest) = net::next_token(args); 28 let (hostname_tok, _) = net::next_token(rest); 29 30 if hostname_tok.is_empty() { 31 write_bytes(b"usage: resolve <hostname>\n"); 32 syscall::exit(); 33 } 34 35 let mut msg = [0u8; 62]; 36 let len = hostname_tok.len().min(61); 37 msg[1..1 + len].copy_from_slice(&hostname_tok[..len]); 38 39 let mut any = false; 40 let mut resp_buf = [0u8; 64]; 41 42 msg[0] = net::MSG_DNS_QUERY; 43 net::send_request(&tx, &msg[..1 + len]); 44 45 let n = net::recv_response_blocking(&rx, &mut resp_buf); 46 if n >= 6 && resp_buf[0] == net::MSG_DNS_RESULT && resp_buf[1] == 0 { 47 let mut out = [0u8; 20]; 48 let pos = net::write_ip_decimal(&mut out, &resp_buf[2..6]); 49 write_bytes(&out[..pos]); 50 write_bytes(b"\n"); 51 any = true; 52 } 53 54 msg[0] = net::MSG_DNS_QUERY6; 55 net::send_request(&tx, &msg[..1 + len]); 56 57 let n = net::recv_response_blocking(&rx, &mut resp_buf); 58 if n >= 18 && resp_buf[0] == net::MSG_DNS_RESULT6 && resp_buf[1] == 0 { 59 let mut out = [0u8; 48]; 60 let pos = net::write_ipv6(&mut out, &resp_buf[2..18]); 61 write_bytes(&out[..pos]); 62 write_bytes(b"\n"); 63 any = true; 64 } 65 66 if !any { 67 write_bytes(b"DNS lookup failed\n"); 68 } 69 70 syscall::exit() 71}