(c-system-include "sys/types.h")
(c-system-include "sys/socket.h")
(c-system-include "netdb.h")

(define-c-struct sockaddr
  predicate:   sockaddr?)

(define-c-struct addrinfo
  constructor: (make-address-info ai_family ai_socktype ai_protocol)
  finalizer: freeaddrinfo
  predicate: address-info?
  (int              ai_family    address-info-family)
  (int              ai_socktype  address-info-socket-type)
  (int              ai_protocol  address-info-protocol)
  ((link sockaddr)  ai_addr      address-info-address)
  (size_t           ai_addrlen   address-info-address-length)
  ((link addrinfo)  ai_next      address-info-next))

;;> The addrinfo struct accessors.
;;/

(define-c errno (%get-address-info getaddrinfo)
  (string string (maybe-null addrinfo) (result free addrinfo)))

;;> Bind a name to a socket.

(define-c int bind (int sockaddr int))

;;> Listen on a socket.

(define-c int listen (int int))

;;> Accept a connection on a socket.

(define-c int accept (int sockaddr (pointer unsigned)))

;;> Create an endpoint for communication.

(define-c int socket (int int int))

;;> Initiate a connection on a socket.

(define-c int connect (int sockaddr int))

(define-c-const int (address-family/unix "AF_UNIX"))
(define-c-const int (address-family/inet "AF_INET"))
(define-c-const int (socket-type/stream "SOCK_STREAM"))
(define-c-const int (socket-type/datagram "SOCK_DGRAM"))
(define-c-const int (socket-type/raw "SOCK_RAW"))
(define-c-const int (ip-proto/tcp "IPPROTO_TCP"))
(define-c-const int (ip-proto/udp "IPPROTO_UDP"))

;;> The constants for the addrinfo struct.
;;/