# Network.Socket

Low-Level C Sockets bindings for Idris. Used by higher-level, cleverer things.

Original (C) SimonJF, MIT Licensed, 2014
Modified (C) The Idris Community, 2015, 2016

socket : (fam : SocketFamily) -> (ty : SocketType) -> (pnum : ProtocolNumber) -> IO (Either SocketError Socket)

  Creates a UNIX socket with the given family, socket type and protocol
  number. Returns either a socket or an error.

sockaddr_free : SockaddrPtr -> IO ()
sock_free : BufPtr -> IO ()

  Frees a given pointer

sock_alloc : ByteLength -> IO BufPtr

  Allocates an amount of memory given by the ByteLength parameter.

  Used to allocate a mutable pointer to be given to the Recv functions.

sendTo : (sock : Socket) -> (addr : SocketAddress) -> (port : Port) -> (msg : String) -> IO (Either SocketError ByteLength)

  Send a message.

  Returns on failure a `SocketError`
  Returns on success the `ResultCode`

  sock

    The socket on which to send the message.

  addr

    Address of the recipient.

  port

    The port on which to send the message.

  msg

    The message to send.

send : (sock : Socket) -> (msg : String) -> IO (Either SocketError ResultCode)

  Send data on the specified socket.

  Returns on failure a `SocketError`.
  Returns on success the `ResultCode`.

  sock

    The socket on which to send the message.

  msg

    The data to send.

recvFrom : (sock : Socket) -> (len : ByteLength) -> IO (Either SocketError (UDPAddrInfo, String, ResultCode))

  Receive a message.

  Returns on failure a `SocketError`.
  Returns on success a triple of

  - `UDPAddrInfo` :: The address of the sender.
  - `String` :: The payload.
  - `Int` :: Result value from underlying function.
  sock

    The channel on which to receive.

  len

    Size of the expected message.

recv : (sock : Socket) -> (len : ByteLength) -> IO (Either SocketError (String, ResultCode))

  Receive data on the specified socket.

  Returns on failure a `SocketError`
  Returns on success a pairing of:

  - `String` :: The payload.
  - `ResultCode` :: The result of the underlying function.
  sock

    The socket on which to receive the message.

  len

    How much of the data to send.

listen : (sock : Socket) -> IO Int

  Listens on a bound socket.

  sock

    The socket to listen on.

connect : (sock : Socket) -> (addr : SocketAddress) -> (port : Port) -> IO ResultCode

  Connects to a given address and port.
  Returns 0 on success, and an error number on error.

close : Socket -> IO ()

  Close a socket

bind : (sock : Socket) -> (addr : Maybe SocketAddress) -> (port : Port) -> IO Int

  Binds a socket to the given socket address and port.
  Returns 0 on success, an error code otherwise.

accept : (sock : Socket) -> IO (Either SocketError (Socket, SocketAddress))

  Accept a connection on the provided socket.

  Returns on failure a `SocketError`
  Returns on success a pairing of:

  - `Socket` :: The socket representing the connection.
  - `SocketAddress` :: The
  sock

    The socket used to establish connection.

record UDPRecvData
  MkUDPRecvData : (remote_addr : SocketAddress) -> (remote_port : Port) -> (recv_data : String) -> (data_len : Int) -> UDPRecvData
  remote_addr : (rec : UDPRecvData) -> SocketAddress
  remote_port : (rec : UDPRecvData) -> Port
  recv_data : (rec : UDPRecvData) -> String
  data_len : (rec : UDPRecvData) -> Int
record UDPAddrInfo
  MkUDPAddrInfo : (remote_addr : SocketAddress) -> (remote_port : Port) -> UDPAddrInfo
  remote_addr : (rec : UDPAddrInfo) -> SocketAddress
  remote_port : (rec : UDPAddrInfo) -> Port
interface ToCode
  toCode : ToCode a => a -> Int
data SocketType : Type

  Socket Types.

  NotASocket : SocketType

    Not a socket, used in certain operations

  Stream : SocketType

    TCP

  Datagram : SocketType

    UDP

  RawSocket : SocketType

    Raw sockets

data SocketFamily : Type

  Socket Families

  The ones that people might actually use. We're not going to need US
  Government proprietary ones.

  AF_UNSPEC : SocketFamily

    Unspecified

  AF_INET : SocketFamily

    IP / UDP etc. IPv4

  AF_INET6 : SocketFamily

    IP / UDP etc. IPv6

SocketError : Type

  SocketError: Error thrown by a socket operation

SocketDescriptor : Type

  SocketDescriptor: Native C Socket Descriptor

data SocketAddress : Type

  Network Addresses

  IPv4Addr : Int -> Int -> Int -> Int -> SocketAddress
  IPv6Addr : SocketAddress

    Not implemented (yet)

  Hostname : String -> SocketAddress
  InvalidAddress : SocketAddress

    Used when there's a parse error

record Socket

  The metadata about a socket

  MkSocket : (descriptor : SocketDescriptor) -> (family : SocketFamily) -> (socketType : SocketType) -> (protocolNumber : ProtocolNumber) -> Socket
  descriptor : (rec : Socket) -> SocketDescriptor
  family : (rec : Socket) -> SocketFamily
  socketType : (rec : Socket) -> SocketType
  protocolNumber : (rec : Socket) -> ProtocolNumber
data SockaddrPtr : Type
  SAPtr : Ptr -> SockaddrPtr
ResultCode : Type
ProtocolNumber : Type

  Protocol Number.

  Generally good enough to just set it to 0.

Port : Type
MkUDPRecvData : (remote_addr : SocketAddress) -> (remote_port : Port) -> (recv_data : String) -> (data_len : Int) -> UDPRecvData
MkUDPAddrInfo : (remote_addr : SocketAddress) -> (remote_port : Port) -> UDPAddrInfo
MkSocket : (descriptor : SocketDescriptor) -> (family : SocketFamily) -> (socketType : SocketType) -> (protocolNumber : ProtocolNumber) -> Socket
EAGAIN : Int
ByteLength : Type
data BufPtr : Type
  BPtr : Ptr -> BufPtr
BACKLOG : Int

  Backlog used within listen() call -- number of incoming calls