%{#
#include "libc/CATS/netdb.cats"
%}
staload SA = "libc/sys/SATS/sockaddr.sats"
typedef sa_family_t = $SA.sa_family_t
stadef socklen_t = $SA.socklen_t
stadef sockaddr = $SA.sockaddr_struct
staload SOCKET = "libc/sys/SATS/socket.sats"
typedef socktype_t = $SOCKET.socktype_t
typedef sockprot_t = $SOCKET.sockprot_t
staload IN = "libc/netinet/SATS/in.sats"
typedef sockaddr_in = $IN.sockaddr_in_struct
typedef sockaddr_in6 = $IN.sockaddr_in6_struct
abst@ype ai_flag_t = uint
macdef AI_NONE = $extval (ai_flag_t, "0x0")
macdef AI_ALL = $extval (ai_flag_t, "AI_ALL")
macdef AI_ADDRCONFIG = $extval (ai_flag_t, "AI_ADDRCONFIG")
macdef AI_CANNONNAME = $extval (ai_flag_t, "AI_CANNONNAME")
macdef AI_NUMERICHOST = $extval (ai_flag_t, "AI_NUMERICHOST")
macdef AI_NUMERICSERV = $extval (ai_flag_t, "AI_NUMERICSERV")
macdef AI_PASSIVE = $extval (ai_flag_t, "AI_PASSIVE")
macdef AI_V4MAPPED = $extval (ai_flag_t, "AI_V4MAPPED")
fun lor_ai_flag_ai_flag
(x1: ai_flag_t, x2: ai_flag_t): ai_flag_t = "atspre_lor_uint_uint"
overload lor with lor_ai_flag_ai_flag
typedef
addrinfo_struct (n:int) =
$extype_struct "ats_addrinfo_type" of {
ai_flags= ai_flag_t
, ai_family= sa_family_t
, ai_socktype= socktype_t
, ai_protocol= sockprot_t
, ai_addrlen=socklen_t(n)
} stadef addrinfo = addrinfo_struct
absviewtype addrinfoptr (l:addr) = ptr
viewtypedef addrinfoptr = [l:addr] addrinfoptr(l)
fun addrinfoptr_is_null
{l:addr} (x: !addrinfoptr l): bool (l==null) = "atspre_ptr_is_null"
fun addrinfoptr_isnot_null
{l:addr} (x: !addrinfoptr l): bool (l > null) = "atspre_ptr_isnot_null"
fun addrinfoptr_get_next
{l:agz} (x: !addrinfoptr l)
:<> [l1:addr] (minus (addrinfoptr l, addrinfoptr l1) | addrinfoptr l1)
= "#atslib_addrinfoptr_get_next"
fun addrinfoptr_get_canonname {l:agz}
(x: !addrinfoptr l):<> [l1:addr] (minus (addrinfoptr l, strptr l1) | strptr l1)
= "#atslib_addrinfoptr_get_canonname"
fun addrinfoptr_get_family
{l:agz} (x: !addrinfoptr l):<> sa_family_t = "#atslib_addrinfoptr_get_family"
fun addrinfoptr_get_socktype
{l:agz} (x: !addrinfoptr l):<> socktype_t = "#atslib_addrinfoptr_get_socktype"
fun addrinfoptr_get_protocol
{l:agz} (x: !addrinfoptr l):<> sockprot_t = "#atslib_addrinfoptr_get_protocol"
fun addrinfoptr_get_addr_in {l:agz} (x: !addrinfoptr l)
:<> [l1:addr] (sockaddr_in @ l1, minus (addrinfoptr l, sockaddr_in @ l1) | ptr l1)
= "#atslib_addrinfoptr_get_addr"
fun addrinfoptr_get_addr_in6 {l:agz} (x: !addrinfoptr l)
:<> [l1:addr] (sockaddr_in6 @ l1, minus (addrinfoptr l, sockaddr_in6 @ l1) | ptr l1)
= "#atslib_addrinfoptr_get_addr"
fun getaddrinfo (
nodename: string
, portname: string
, hint: &addrinfo(0)
, infop: &addrinfoptr? >> opt (addrinfoptr, i == 0)
) : #[i:int | i <= 0] int (i) = "#atslib_getaddrinfo"
fun gai_strerror
(code: int): [l:agz] (strptr l -<lin,prf> void | strptr l)
= "#atslib_gai_strerror"
fun freeaddrinfo (infop: addrinfoptr): void = "#atslib_freeaddrinfo"
typedef
hostent_struct =
$extype_struct
"ats_hostent_type" of {
h_addrtype= int , h_length= int } typedef hostent = hostent_struct
fun hostent_get_name (h: &hostent)
:<!ref> [l:agz] (strptr l -<lin,prf> void | strptr l)
= "#atslib_hostent_get_name"
fun hostent_get_aliases (h: &hostent)
:<!ref> [n:nat] [l:agz] (ptrarr n @ l, ptrarr n @ l -<lin,prf> void | ptr l)
= "#atslib_hostent_get_aliases"
fun hostent_get_addr_list (h: &hostent)
:<!ref> [n:nat] [l:agz] (ptrarr n @ l, ptrarr n @ l -<lin,prf> void | ptr l)
= "#atslib_hostent_get_addr_list"
absview sethostent_v
fun sethostent {b:bool}
(stayopen: bool (b)): (sethostent_v | void)
= "#atslib_sethostent"
fun gethostent
(pf: !sethostent_v | )
:<!ref> [l:addr] (ptroutopt (hostent, l) | ptr l)
= "#atslib_gethostent"
fun endhostent
(pf: sethostent_v | ): void = "#atslib_endhostent"
fun gethostbyname (name: string)
:<!ref> [l:addr] (ptroutopt (hostent, l) | ptr l) = "#atslib_gethostbyname"
fun gethostbyaddr {a:t@ype}
(addr: &a, n: sizeof_t(a), af: sa_family_t)
:<!ref> [l:addr] (ptroutopt (hostent, l) | ptr l) = "#atslib_gethostbyaddr"
abst@ype niflag_t = int
macdef NI_ZERO = $extval (niflag_t, "0")
macdef NI_NUMERICHOST = $extval (niflag_t, "NI_NUMERICHOST")
macdef NI_NUMERICSERV = $extval (niflag_t, "NI_NUMERICSERV")
macdef NI_NOFQDN = $extval (niflag_t, "NI_NOFQDN")
macdef NI_NAMEREQD = $extval (niflag_t, "NI_NAMEREQD")
macdef NI_DGRAM = $extval (niflag_t, "NI_DGRAM")
macdef NI_IDN = $extval (niflag_t, "NI_IDN")
fun getnameinfo{a:t@ype} {n1,n2:nat} (
sa: &a, salen: sizeof_t (a)
, nodename: &b0ytes(n1) >> bytes(n1), nodelen: size_t(n1)
, servname: &b0ytes(n2) >> bytes(n2), servlen: size_t(n1)
, flags: niflag_t
) : [i:int | i <= 0] int (i) = "#atslib_getnameinfo"
fun gethostid (): lint = "#atslib_gethostid"
fun sethostid (id: lint): int = "#atslib_sethostid"