let () =
  Mirage_crypto_rng_unix.use_default ();
  let t = Dns_client_unix.create () in
  let domain = Domain_name.(host_exn (of_string_exn Sys.argv.(1))) in
  let ipv4 =
    match Dns_client_unix.gethostbyname t domain with
    | Ok addr -> Fmt.pr "%a has address %a\n"
                   Domain_name.pp domain Ipaddr.V4.pp addr ; Ok ()
    | Error _ as err -> err
  in
  let ipv6 =
    match Dns_client_unix.gethostbyname6 t domain with
    | Ok addr -> Fmt.pr "%a has IPv6 address %a\n"
                   Domain_name.pp domain Ipaddr.V6.pp addr ; Ok ()
    | Error _ as err -> err
  in
  let mx =
    match Dns_client_unix.getaddrinfo t Mx domain with
    | Ok (_ttl, resp) ->
      Fmt.pr "%a\n"
        (Fmt.list (fun ppf -> Fmt.pf ppf "%a mail is handled by %a"
                      Domain_name.pp domain
                      Dns.Mx.pp)) (Dns.Rr_map.Mx_set.elements resp) ;
      Ok ()
    | Error _ as err -> err
  in
  let results = [ ipv4 ; ipv6 ; mx ] in
  let is_error = (function Error _ -> true | Ok _ -> false) in
  match List.find_opt is_error results with
  | None | Some Ok _ -> () (* no errors *)
  | Some (Error `Msg msg) -> (* at least one error *)
    if List.for_all is_error results then
      (* Everything failed; print an error message *)
      ( Fmt.epr "Host %a not found: @[<v>%s@]\n"
          Domain_name.pp domain msg ;
        exit 1)
