Nothing to see here, move along
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}