// D import file generated from '../../../../libphobos/libdruntime/core/sys/posix/sys/socket.d'
module core.sys.posix.sys.socket;
private import core.sys.posix.config;

public import core.sys.posix.sys.types;

public import core.sys.posix.sys.uio;

version (Posix)
{
	extern (C) 
	{
		version (linux)
		{
			alias uint socklen_t;
			alias ushort sa_family_t;
			struct sockaddr
			{
				sa_family_t sa_family;
				byte[14] sa_data;
			}
			private enum : size_t
			{
				_SS_SIZE = 128,
				_SS_PADSIZE = _SS_SIZE - c_ulong.sizeof * 2,
			}

			struct sockaddr_storage
			{
				sa_family_t ss_family;
				c_ulong __ss_align;
				byte[_SS_PADSIZE] __ss_padding;
			}
			struct msghdr
			{
				void* msg_name;
				socklen_t msg_namelen;
				iovec* msg_iov;
				size_t msg_iovlen;
				void* msg_control;
				size_t msg_controllen;
				int msg_flags;
			}
			struct cmsghdr
			{
				size_t cmsg_len;
				int cmsg_level;
				int cmsg_type;
				static if(false)
				{
					ubyte[1] __cmsg_data;
				}
			}
			enum : uint
			{
				SCM_RIGHTS = 1,
			}
			static if(false)
			{
				extern (D) ubyte[1] CMSG_DATA(cmsghdr* cmsg);

			}
			else
			{
				extern (D) ubyte* CMSG_DATA(cmsghdr* cmsg);

			}
			private cmsghdr* __cmsg_nxthdr(msghdr*, cmsghdr*);

			alias __cmsg_nxthdr CMSG_NXTHDR;
			extern (D) size_t CMSG_FIRSTHDR(msghdr* mhdr);

			struct linger
			{
				int l_onoff;
				int l_linger;
			}
			version (MIPS)
			{
				enum 
				{
					SOCK_DGRAM = 1,
					SOCK_SEQPACKET = 5,
					SOCK_STREAM = 2,
				}
				enum 
				{
					SOL_SOCKET = 65535,
				}
				enum 
				{
					SO_ACCEPTCONN = 4105,
					SO_BROADCAST = 32,
					SO_DEBUG = 1,
					SO_DONTROUTE = 16,
					SO_ERROR = 4103,
					SO_KEEPALIVE = 8,
					SO_LINGER = 128,
					SO_OOBINLINE = 256,
					SO_RCVBUF = 4098,
					SO_RCVLOWAT = 4100,
					SO_RCVTIMEO = 4102,
					SO_REUSEADDR = 4,
					SO_SNDBUF = 4097,
					SO_SNDLOWAT = 4099,
					SO_SNDTIMEO = 4101,
					SO_TYPE = 4104,
				}
			}
			else
			{
				enum 
				{
					SOCK_DGRAM = 2,
					SOCK_SEQPACKET = 5,
					SOCK_STREAM = 1,
				}
				enum 
				{
					SOL_SOCKET = 1,
				}
				enum 
				{
					SO_ACCEPTCONN = 30,
					SO_BROADCAST = 6,
					SO_DEBUG = 1,
					SO_DONTROUTE = 5,
					SO_ERROR = 4,
					SO_KEEPALIVE = 9,
					SO_LINGER = 13,
					SO_OOBINLINE = 10,
					SO_RCVBUF = 8,
					SO_RCVLOWAT = 18,
					SO_RCVTIMEO = 20,
					SO_REUSEADDR = 2,
					SO_SNDBUF = 7,
					SO_SNDLOWAT = 19,
					SO_SNDTIMEO = 21,
					SO_TYPE = 3,
				}
			}
			enum 
			{
				SOMAXCONN = 128,
			}
			enum : uint
			{
				MSG_CTRUNC = 8,
				MSG_DONTROUTE = 4,
				MSG_EOR = 128,
				MSG_OOB = 1,
				MSG_PEEK = 2,
				MSG_TRUNC = 32,
				MSG_WAITALL = 256,
			}
			enum 
			{
				AF_INET = 2,
				AF_UNIX = 1,
				AF_UNSPEC = 0,
			}
			enum 
			{
				SHUT_RD,
				SHUT_WR,
				SHUT_RDWR,
			}
			int accept(int, sockaddr*, socklen_t*);
			int bind(int, in sockaddr*, socklen_t);
			int connect(int, in sockaddr*, socklen_t);
			int getpeername(int, sockaddr*, socklen_t*);
			int getsockname(int, sockaddr*, socklen_t*);
			int getsockopt(int, int, int, void*, socklen_t*);
			int listen(int, int);
			ssize_t recv(int, void*, size_t, int);
			ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
			ssize_t recvmsg(int, msghdr*, int);
			ssize_t send(int, in void*, size_t, int);
			ssize_t sendmsg(int, in msghdr*, int);
			ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
			int setsockopt(int, int, int, in void*, socklen_t);
			int shutdown(int, int);
			int socket(int, int, int);
			int sockatmark(int);
			int socketpair(int, int, int, ref int[2]);
		}
		else
		{
			version (OSX)
			{
				alias uint socklen_t;
				alias ubyte sa_family_t;
				struct sockaddr
				{
					ubyte sa_len;
					sa_family_t sa_family;
					byte[14] sa_data;
				}
				private enum : size_t
				{
					_SS_PAD1 = (long).sizeof - (ubyte).sizeof - sa_family_t.sizeof,
					_SS_PAD2 = 128 - (ubyte).sizeof - sa_family_t.sizeof - _SS_PAD1 - (long).sizeof,
				}

				struct sockaddr_storage
				{
					ubyte ss_len;
					sa_family_t ss_family;
					byte[_SS_PAD1] __ss_pad1;
					long __ss_align;
					byte[_SS_PAD2] __ss_pad2;
				}
				struct msghdr
				{
					void* msg_name;
					socklen_t msg_namelen;
					iovec* msg_iov;
					int msg_iovlen;
					void* msg_control;
					socklen_t msg_controllen;
					int msg_flags;
				}
				struct cmsghdr
				{
					socklen_t cmsg_len;
					int cmsg_level;
					int cmsg_type;
				}
				enum : uint
				{
					SCM_RIGHTS = 1,
				}
				struct linger
				{
					int l_onoff;
					int l_linger;
				}
				enum 
				{
					SOCK_DGRAM = 2,
					SOCK_SEQPACKET = 5,
					SOCK_STREAM = 1,
				}
				enum : uint
				{
					SOL_SOCKET = 65535,
				}
				enum : uint
				{
					SO_ACCEPTCONN = 2,
					SO_BROADCAST = 32,
					SO_DEBUG = 1,
					SO_DONTROUTE = 16,
					SO_ERROR = 4103,
					SO_KEEPALIVE = 8,
					SO_LINGER = 4224,
					SO_NOSIGPIPE = 4130,
					SO_OOBINLINE = 256,
					SO_RCVBUF = 4098,
					SO_RCVLOWAT = 4100,
					SO_RCVTIMEO = 4102,
					SO_REUSEADDR = 4,
					SO_SNDBUF = 4097,
					SO_SNDLOWAT = 4099,
					SO_SNDTIMEO = 4101,
					SO_TYPE = 4104,
				}
				enum 
				{
					SOMAXCONN = 128,
				}
				enum : uint
				{
					MSG_CTRUNC = 32,
					MSG_DONTROUTE = 4,
					MSG_EOR = 8,
					MSG_OOB = 1,
					MSG_PEEK = 2,
					MSG_TRUNC = 16,
					MSG_WAITALL = 64,
				}
				enum 
				{
					AF_INET = 2,
					AF_UNIX = 1,
					AF_UNSPEC = 0,
				}
				enum 
				{
					SHUT_RD,
					SHUT_WR,
					SHUT_RDWR,
				}
				int accept(int, sockaddr*, socklen_t*);
				int bind(int, in sockaddr*, socklen_t);
				int connect(int, in sockaddr*, socklen_t);
				int getpeername(int, sockaddr*, socklen_t*);
				int getsockname(int, sockaddr*, socklen_t*);
				int getsockopt(int, int, int, void*, socklen_t*);
				int listen(int, int);
				ssize_t recv(int, void*, size_t, int);
				ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
				ssize_t recvmsg(int, msghdr*, int);
				ssize_t send(int, in void*, size_t, int);
				ssize_t sendmsg(int, in msghdr*, int);
				ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
				int setsockopt(int, int, int, in void*, socklen_t);
				int shutdown(int, int);
				int socket(int, int, int);
				int sockatmark(int);
				int socketpair(int, int, int, ref int[2]);
			}
			else
			{
				version (FreeBSD)
				{
					alias uint socklen_t;
					alias ubyte sa_family_t;
					struct sockaddr
					{
						ubyte sa_len;
						sa_family_t sa_family;
						byte[14] sa_data;
					}
					private 
					{
						enum _SS_ALIGNSIZE = (long).sizeof;
						enum _SS_MAXSIZE = 128;
						enum _SS_PAD1SIZE = _SS_ALIGNSIZE - (ubyte).sizeof - sa_family_t.sizeof;
						enum _SS_PAD2SIZE = _SS_MAXSIZE - (ubyte).sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
					}
					struct sockaddr_storage
					{
						ubyte ss_len;
						sa_family_t ss_family;
						byte[_SS_PAD1SIZE] __ss_pad1;
						long __ss_align;
						byte[_SS_PAD2SIZE] __ss_pad2;
					}
					struct msghdr
					{
						void* msg_name;
						socklen_t msg_namelen;
						iovec* msg_iov;
						int msg_iovlen;
						void* msg_control;
						socklen_t msg_controllen;
						int msg_flags;
					}
					struct cmsghdr
					{
						socklen_t cmsg_len;
						int cmsg_level;
						int cmsg_type;
					}
					enum : uint
					{
						SCM_RIGHTS = 1,
					}
					private 
					{
						enum _ALIGNBYTES = (int).sizeof - 1;
						extern (D) size_t _ALIGN(size_t p);

					}
					extern (D) ubyte* CMSG_DATA(cmsghdr* cmsg);

					extern (D) cmsghdr* CMSG_NXTHDR(msghdr* mhdr, cmsghdr* cmsg);

					extern (D) cmsghdr* CMSG_FIRSTHDR(msghdr* mhdr);

					struct linger
					{
						int l_onoff;
						int l_linger;
					}
					enum 
					{
						SOCK_DGRAM = 2,
						SOCK_SEQPACKET = 5,
						SOCK_STREAM = 1,
					}
					enum : uint
					{
						SOL_SOCKET = 65535,
					}
					enum : uint
					{
						SO_ACCEPTCONN = 2,
						SO_BROADCAST = 32,
						SO_DEBUG = 1,
						SO_DONTROUTE = 16,
						SO_ERROR = 4103,
						SO_KEEPALIVE = 8,
						SO_LINGER = 128,
						SO_NOSIGPIPE = 2048,
						SO_OOBINLINE = 256,
						SO_RCVBUF = 4098,
						SO_RCVLOWAT = 4100,
						SO_RCVTIMEO = 4102,
						SO_REUSEADDR = 4,
						SO_SNDBUF = 4097,
						SO_SNDLOWAT = 4099,
						SO_SNDTIMEO = 4101,
						SO_TYPE = 4104,
					}
					enum 
					{
						SOMAXCONN = 128,
					}
					enum : uint
					{
						MSG_CTRUNC = 32,
						MSG_DONTROUTE = 4,
						MSG_EOR = 8,
						MSG_OOB = 1,
						MSG_PEEK = 2,
						MSG_TRUNC = 16,
						MSG_WAITALL = 64,
					}
					enum 
					{
						AF_INET = 2,
						AF_UNIX = 1,
						AF_UNSPEC = 0,
					}
					enum 
					{
						SHUT_RD = 0,
						SHUT_WR = 1,
						SHUT_RDWR = 2,
					}
					int accept(int, sockaddr*, socklen_t*);
					int bind(int, in sockaddr*, socklen_t);
					int connect(int, in sockaddr*, socklen_t);
					int getpeername(int, sockaddr*, socklen_t*);
					int getsockname(int, sockaddr*, socklen_t*);
					int getsockopt(int, int, int, void*, socklen_t*);
					int listen(int, int);
					ssize_t recv(int, void*, size_t, int);
					ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
					ssize_t recvmsg(int, msghdr*, int);
					ssize_t send(int, in void*, size_t, int);
					ssize_t sendmsg(int, in msghdr*, int);
					ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
					int setsockopt(int, int, int, in void*, socklen_t);
					int shutdown(int, int);
					int socket(int, int, int);
					int sockatmark(int);
					int socketpair(int, int, int, ref int[2]);
				}
				else
				{
					version (Solaris)
					{
						alias uint socklen_t;
						alias ushort sa_family_t;
						struct sockaddr
						{
							sa_family_t sa_family;
							char[14] sa_data;
						}
						alias double sockaddr_maxalign_t;
						private enum _SS_PAD1SIZE = sockaddr_maxalign_t.sizeof - sa_family_t.sizeof;

						private enum _SS_PAD2SIZE = 256 - sa_family_t.sizeof + _SS_PAD1SIZE + sockaddr_maxalign_t.sizeof;

						struct sockaddr_storage
						{
							sa_family_t ss_family;
							char[_SS_PAD1SIZE] _ss_pad1;
							sockaddr_maxalign_t _ss_align;
							char[_SS_PAD2SIZE] _ss_pad2;
						}
						struct msghdr
						{
							void* msg_name;
							socklen_t msg_namelen;
							iovec* msg_iov;
							int msg_iovlen;
							void* msg_control;
							socklen_t msg_controllen;
							int msg_flags;
						}
						struct cmsghdr
						{
							socklen_t cmsg_len;
							int cmsg_level;
							int cmsg_type;
						}
						enum : uint
						{
							SCM_RIGHTS = 4113,
						}
						struct linger
						{
							int l_onoff;
							int l_linger;
						}
						enum 
						{
							SOCK_STREAM = 2,
							SOCK_DGRAM = 1,
							SOCK_RDM = 5,
							SOCK_SEQPACKET = 6,
						}
						enum : uint
						{
							SOL_SOCKET = 65535,
						}
						enum : uint
						{
							SO_ACCEPTCONN = 2,
							SO_BROADCAST = 32,
							SO_DEBUG = 1,
							SO_DONTROUTE = 16,
							SO_ERROR = 4103,
							SO_KEEPALIVE = 8,
							SO_LINGER = 128,
							SO_OOBINLINE = 256,
							SO_RCVBUF = 4098,
							SO_RCVLOWAT = 4100,
							SO_RCVTIMEO = 4102,
							SO_REUSEADDR = 4,
							SO_SNDBUF = 4097,
							SO_SNDLOWAT = 4099,
							SO_SNDTIMEO = 4101,
							SO_TYPE = 4104,
						}
						enum 
						{
							SOMAXCONN = 128,
						}
						enum : uint
						{
							MSG_CTRUNC = 16,
							MSG_DONTROUTE = 4,
							MSG_EOR = 8,
							MSG_OOB = 1,
							MSG_PEEK = 2,
							MSG_TRUNC = 32,
							MSG_WAITALL = 64,
						}
						enum 
						{
							AF_INET = 2,
							AF_UNIX = 1,
							AF_UNSPEC = 0,
						}
						enum 
						{
							SHUT_RD,
							SHUT_WR,
							SHUT_RDWR,
						}
						int accept(int, sockaddr*, socklen_t*);
						int bind(int, in sockaddr*, socklen_t);
						int connect(int, in sockaddr*, socklen_t);
						int getpeername(int, sockaddr*, socklen_t*);
						int getsockname(int, sockaddr*, socklen_t*);
						int getsockopt(int, int, int, void*, socklen_t*);
						int listen(int, int);
						ssize_t recv(int, void*, size_t, int);
						ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
						ssize_t recvmsg(int, msghdr*, int);
						ssize_t send(int, in void*, size_t, int);
						ssize_t sendmsg(int, in msghdr*, int);
						ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
						int setsockopt(int, int, int, in void*, socklen_t);
						int shutdown(int, int);
						int socket(int, int, int);
						int sockatmark(int);
						int socketpair(int, int, int, ref int[2]);
					}
					else
					{
						static assert(false,"Unsupported platform");
					}
				}
			}
		}
		version (linux)
		{
			enum 
			{
				AF_INET6 = 10,
			}
		}
		else
		{
			version (OSX)
			{
				enum 
				{
					AF_INET6 = 30,
				}
			}
			else
			{
				version (FreeBSD)
				{
					enum 
					{
						AF_INET6 = 28,
					}
				}
				else
				{
					version (Solaris)
					{
						enum 
						{
							AF_INET6 = 26,
						}
					}
					else
					{
						static assert(false,"Unsupported platform");
					}
				}
			}
		}
		version (linux)
		{
			enum 
			{
				SOCK_RAW = 3,
			}
		}
		else
		{
			version (OSX)
			{
				enum 
				{
					SOCK_RAW = 3,
				}
			}
			else
			{
				version (FreeBSD)
				{
					enum 
					{
						SOCK_RAW = 3,
					}
				}
				else
				{
					version (Solaris)
					{
						enum 
						{
							SOCK_RAW = 4,
						}
					}
					else
					{
						static assert(false,"Unsupported platform");
					}
				}
			}
		}
	}
}
