staload UNSAFE = "prelude/SATS/unsafe.sats"
staload _ = "prelude/DATS/unsafe.dats"
staload "libc/SATS/errno.sats"
staload "libc/SATS/netdb.sats"
staload "libc/SATS/string.sats"
staload "libc/sys/SATS/sockaddr.sats"
staload "libc/arpa/SATS/inet.sats"
fun display_hostent
  (h: &hostent): void = let
  val (fpf_name | name) = hostent_get_name (h)
  val () = printf (
    "name: %s; type: %d; len: %d\n"
  , @($UNSAFE.castvwtp1{string} (name), h.h_addrtype, h.h_length)
  )   prval () = fpf_name (name)
  val (pf, fpf | p) = hostent_get_aliases (h)
  val n = ptrarr_size (!p)
  prval (pf1 , fpf1) = ptrarr_takeout{string} (pf)
  val () = loop (!p, n, 0) where {
    fun loop {n,i:nat | i <= n} .<n-i>.
      (A: &(@[string][n]), n: size_t n, i: size_t i): void =
      if i < n then let
        val () = printf ("\t%s\n", @(A.[i])) in loop (A, n, i+1)
      end else ()       }   prval () = pf := fpf1 (pf1)
  prval () = fpf (pf)
  val () = if
    (h.h_addrtype = $UNSAFE.cast2int(AF_INET)) then let
  val (pf, fpf | p) = hostent_get_addr_list (h)
  val n = ptrarr_size (!p)
  prval (pf1 , fpf1) = ptrarr_takeout{Ptr1} (pf)
  val () = loop (!p, n, 0) where {
    fun loop {n,i:nat | i <= n} .<n-i>.
      (A: &(@[Ptr1][n]), n: size_t n, i: size_t i): void =
      if i < n then let
        val (fpf_addr | addr) = inet_ntoa
          ($UNSAFE.ptrget<in_addr_struct>(A.[i]))
        val () = printf ("\t%s\n", @($UNSAFE.castvwtp1{string}(addr)))
        prval () = fpf_addr (addr)
      in
        loop (A, n, i+1)
      end else ()       }   prval () = pf := fpf1 (pf1)
  prval () = fpf (pf)    
  in
      end in
  end 
fun hostdb (): void = let
  val (pf | ()) = sethostent (true)
  val () = while (true) let
    val (pfopt | p) = gethostent (pf | )
  in
    if p > null then let
      prval Some_v @(pf1, fpf1) = pfopt
      val () = display_hostent (!p)
      prval () = fpf1 (pf1)
    in
      continue
    end else let
      prval None_v () = pfopt in break
    end   end   val () = endhostent (pf | )
in
  end 
implement
main () = () where {
  val () = hostdb ()
}