module unix

// Select represents a select operation
enum Select {
	read
	write
	except
}

// SocketType are the available sockets
enum SocketType {
	dgram = C.SOCK_DGRAM
	stream = C.SOCK_STREAM
	seqpacket = C.SOCK_SEQPACKET
}

struct C.sockaddr {
	sa_family u16
}

const max_sun_path = 104

// 104 for macos, 108 for linux => use the minimum

struct C.sockaddr_un {
mut:
	//	sun_len    byte // only on macos
	sun_family int
	sun_path   [104]char // on linux that is 108
}

struct C.addrinfo {
mut:
	ai_family    int
	ai_socktype  int
	ai_flags     int
	ai_protocol  int
	ai_addrlen   int
	ai_addr      voidptr
	ai_canonname voidptr
	ai_next      voidptr
}

struct C.sockaddr_storage {
}

fn C.socket() int

fn C.setsockopt() int

fn C.htonl() int

fn C.htons() int

fn C.bind() int

fn C.listen() int

fn C.accept() int

fn C.getaddrinfo() int

fn C.connect() int

fn C.send() int

fn C.sendto() int

fn C.recv() int

fn C.recvfrom() int

fn C.shutdown() int

fn C.ntohs() int

fn C.getpeername() int

fn C.inet_ntop(af int, src voidptr, dst charptr, dst_size int) charptr

fn C.WSAAddressToStringA() int

fn C.getsockname() int

// defined in builtin
// fn C.read() int
// fn C.close() int

fn C.ioctlsocket() int

fn C.fcntl() int

fn C.@select() int

fn C.FD_ZERO()

fn C.FD_SET()

fn C.FD_ISSET() bool

[typedef]
struct C.fd_set {}