require "./types"
require "./uio"

lib LibC
  SOCK_DGRAM     =  2
  SOCK_RAW       =  3
  SOCK_SEQPACKET =  5
  SOCK_STREAM    =  1
  SOL_SOCKET     =  1
  SO_BROADCAST   =  6
  SO_KEEPALIVE   =  9
  SO_LINGER      = 13
  SO_RCVBUF      =  8
  SO_REUSEADDR   =  2
  SO_REUSEPORT   = 15
  SO_SNDBUF      =  7
  PF_INET        = LibC::AF_INET
  PF_INET6       = LibC::AF_INET6
  PF_UNIX        = LibC::AF_UNIX
  PF_UNSPEC      = LibC::AF_UNSPEC
  PF_LOCAL       = LibC::AF_LOCAL
  AF_INET        =         2
  AF_INET6       =        10
  AF_UNIX        =         1
  AF_UNSPEC      =         0
  AF_LOCAL       =         1
  SHUT_RD        =         0
  SHUT_RDWR      =         2
  SHUT_WR        =         1
  SOCK_CLOEXEC   = 0o2000000
  SOCK_NONBLOCK  = 0o0004000
  SOL_TCP        =         6
  SOL_TLS        =       282

  alias SocklenT = UInt32
  alias SaFamilyT = UShort

  struct Sockaddr
    sa_family : SaFamilyT
    sa_data : Char[14]
  end

  struct SockaddrStorage
    ss_family : SaFamilyT
    __align : Void*
    __data : Char[112]
  end

  struct Linger
    l_onoff : Int
    l_linger : Int
  end

  struct Msghdr
    msg_name : Void*
    msg_namelen : SocklenT
    msg_iov : Iovec*
    msg_iovlen : SizeT
    msg_control : Void*
    msg_controllen : SizeT
    msg_flags : Int
  end

  struct Cmsghdr
    cmsg_len : SizeT
    cmsg_level : Int
    cmsg_type : Int
    cmsg_data : Char[0]
  end

  fun accept(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*) : Int
  fun accept4(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*, __flags : Int) : Int
  fun bind(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT) : Int
  fun connect(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT) : Int
  fun getpeername(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*) : Int
  fun getsockname(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*) : Int
  fun getsockopt(__fd : Int, __level : Int, __option : Int, __value : Void*, __value_length : SocklenT*) : Int
  fun listen(__fd : Int, __backlog : Int) : Int
  fun recv(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int) : SSizeT
  fun recvfrom(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int, __src_addr : Sockaddr*, __src_addr_length : SocklenT*) : SSizeT
  fun recvmsg(Int, Msghdr*, Int) : Int
  fun send(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int) : SSizeT
  fun sendmsg(Int, Msghdr*, Int) : Int
  fun sendto(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int, __dst_addr : Sockaddr*, __dst_addr_length : SocklenT) : SSizeT
  fun setsockopt(__fd : Int, __level : Int, __option : Int, __value : Void*, __value_length : SocklenT) : Int
  fun shutdown(__fd : Int, __how : Int) : Int
  fun socket(__af : Int, __type : Int, __protocol : Int) : Int
  fun socketpair(__af : Int, __type : Int, __protocol : Int, __fds : Int[2]) : Int
end
