blob: 430d0c0d1e3898aaf244baf6697ba2836e1992ce [file]
/**
* D header file for POSIX.
*
* Copyright: Copyright Sean Kelly 2005 - 2009.
* License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: Sean Kelly, Alex Rønne Petersen
* Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
*/
/* Copyright Sean Kelly 2005 - 2009.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
module core.sys.posix.sys.socket;
import core.sys.posix.config;
public import core.sys.posix.sys.types; // for ssize_t
public import core.sys.posix.sys.uio; // for iovec
version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;
version (ARM) version = ARM_Any;
version (AArch64) version = ARM_Any;
version (HPPA) version = HPPA_Any;
version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
version (SystemZ) version = IBMZ_Any;
version (X86) version = X86_Any;
version (X86_64) version = X86_Any;
version (Posix):
extern (C) nothrow @nogc:
@system:
//
// Required
//
/*
socklen_t
sa_family_t
struct sockaddr
{
sa_family_t sa_family;
char sa_data[];
}
struct sockaddr_storage
{
sa_family_t ss_family;
}
struct msghdr
{
void* msg_name;
socklen_t msg_namelen;
struct iovec* msg_iov;
int msg_iovlen;
void* msg_control;
socklen_t msg_controllen;
int msg_flags;
}
struct iovec {} // from core.sys.posix.sys.uio
struct cmsghdr
{
socklen_t cmsg_len;
int cmsg_level;
int cmsg_type;
}
SCM_RIGHTS
CMSG_DATA(cmsg)
CMSG_NXTHDR(mhdr,cmsg)
CMSG_FIRSTHDR(mhdr)
struct linger
{
int l_onoff;
int l_linger;
}
SOCK_DGRAM
SOCK_SEQPACKET
SOCK_STREAM
SOL_SOCKET
SO_ACCEPTCONN
SO_BROADCAST
SO_DEBUG
SO_DONTROUTE
SO_ERROR
SO_KEEPALIVE
SO_LINGER
SO_OOBINLINE
SO_RCVBUF
SO_RCVLOWAT
SO_RCVTIMEO
SO_REUSEADDR
SO_SNDBUF
SO_SNDLOWAT
SO_SNDTIMEO
SO_TYPE
SOMAXCONN
MSG_CTRUNC
MSG_DONTROUTE
MSG_EOR
MSG_OOB
MSG_PEEK
MSG_TRUNC
MSG_WAITALL
AF_INET
AF_UNIX
AF_UNSPEC
SHUT_RD
SHUT_RDWR
SHUT_WR
int accept(int, sockaddr*, socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope 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, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int);
int socket(int, int, int);
int sockatmark(int);
int socketpair(int, int, int, ref int[2]);
*/
version (CRuntime_Glibc)
{
// Some of the constants below and from the Bionic section are really from
// the linux kernel headers.
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 /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
{
ubyte[1] __cmsg_data;
}
}
enum : uint
{
SCM_RIGHTS = 0x01
}
static if ( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
{
extern (D) ubyte[1] CMSG_DATA( cmsghdr* cmsg ) pure nothrow @nogc { return cmsg.__cmsg_data; }
}
else
{
extern (D) inout(ubyte)* CMSG_DATA( return inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
}
private inout(cmsghdr)* __cmsg_nxthdr(inout(msghdr)*, inout(cmsghdr)*) pure nothrow @nogc;
extern (D) inout(cmsghdr)* CMSG_NXTHDR(inout(msghdr)* msg, inout(cmsghdr)* cmsg) pure nothrow @nogc
{
return __cmsg_nxthdr(msg, cmsg);
}
extern (D) inout(cmsghdr)* CMSG_FIRSTHDR( inout(msghdr)* mhdr ) pure nothrow @nogc
{
return ( cast(size_t)mhdr.msg_controllen >= cmsghdr.sizeof
? cast(inout(cmsghdr)*) mhdr.msg_control
: cast(inout(cmsghdr)*) null );
}
extern (D)
{
size_t CMSG_ALIGN( size_t len ) pure nothrow @nogc
{
return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
}
size_t CMSG_LEN( size_t len ) pure nothrow @nogc
{
return CMSG_ALIGN(cmsghdr.sizeof) + len;
}
}
extern (D) size_t CMSG_SPACE(size_t len) pure nothrow @nogc
{
return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof);
}
struct linger
{
int l_onoff;
int l_linger;
}
version (X86_Any)
{
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_REUSEPORT = 15,
SO_SNDBUF = 7,
SO_SNDLOWAT = 19,
SO_SNDTIMEO = 21,
SO_TYPE = 3
}
}
else version (HPPA_Any)
{
enum
{
SOCK_DGRAM = 2,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1,
}
enum
{
SOL_SOCKET = 0xffff
}
enum
{
SO_ACCEPTCONN = 0x401c,
SO_BROADCAST = 0x0020,
SO_DEBUG = 0x0001,
SO_DONTROUTE = 0x0010,
SO_ERROR = 0x1007,
SO_KEEPALIVE = 0x0008,
SO_LINGER = 0x0080,
SO_OOBINLINE = 0x0100,
SO_RCVBUF = 0x1002,
SO_RCVLOWAT = 0x1004,
SO_RCVTIMEO = 0x1006,
SO_REUSEADDR = 0x0004,
SO_SNDBUF = 0x1001,
SO_SNDLOWAT = 0x1003,
SO_SNDTIMEO = 0x1005,
SO_TYPE = 0x1008,
}
}
else version (MIPS_Any)
{
enum
{
SOCK_DGRAM = 1,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 2,
}
enum
{
SOL_SOCKET = 0xffff
}
enum
{
SO_ACCEPTCONN = 0x1009,
SO_BROADCAST = 0x0020,
SO_DEBUG = 0x0001,
SO_DONTROUTE = 0x0010,
SO_ERROR = 0x1007,
SO_KEEPALIVE = 0x0008,
SO_LINGER = 0x0080,
SO_OOBINLINE = 0x0100,
SO_RCVBUF = 0x1002,
SO_RCVLOWAT = 0x1004,
SO_RCVTIMEO = 0x1006,
SO_REUSEADDR = 0x0004,
SO_SNDBUF = 0x1001,
SO_SNDLOWAT = 0x1003,
SO_SNDTIMEO = 0x1005,
SO_TYPE = 0x1008,
}
}
else version (PPC_Any)
{
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 = 16,
SO_RCVTIMEO = 18,
SO_REUSEADDR = 2,
SO_SNDBUF = 7,
SO_SNDLOWAT = 17,
SO_SNDTIMEO = 19,
SO_TYPE = 3
}
}
else version (ARM_Any)
{
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_REUSEPORT = 15,
SO_SNDBUF = 7,
SO_SNDLOWAT = 19,
SO_SNDTIMEO = 21,
SO_TYPE = 3
}
}
else version (RISCV_Any)
{
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
}
}
else version (SPARC_Any)
{
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
}
}
else version (IBMZ_Any)
{
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
}
}
else
static assert(0, "unimplemented");
enum
{
SOMAXCONN = 128
}
enum : uint
{
MSG_CTRUNC = 0x08,
MSG_DONTROUTE = 0x04,
MSG_EOR = 0x80,
MSG_OOB = 0x01,
MSG_PEEK = 0x02,
MSG_TRUNC = 0x20,
MSG_WAITALL = 0x100,
MSG_NOSIGNAL = 0x4000
}
enum
{
AF_APPLETALK = 5,
AF_INET = 2,
AF_IPX = 4,
AF_UNIX = 1,
AF_UNSPEC = 0,
PF_APPLETALK = AF_APPLETALK,
PF_IPX = AF_IPX
}
enum int SOCK_RDM = 4;
enum
{
SHUT_RD,
SHUT_WR,
SHUT_RDWR
}
int accept(int, scope sockaddr*, scope socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
int getpeername(int, scope sockaddr*, scope socklen_t*);
int getsockname(int, scope sockaddr*, scope socklen_t*);
int getsockopt(int, int, int, scope void*, scope socklen_t*);
int listen(int, int) @safe;
ssize_t recv(int, scope void*, size_t, int);
ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
ssize_t recvmsg(int, scope msghdr*, int);
ssize_t send(int, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int) @safe;
int socket(int, int, int) @safe;
int sockatmark(int) @safe;
int socketpair(int, int, int, ref int[2]) @safe;
}
else version (Darwin)
{
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 = 0x01
}
/+
CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
ALIGN(sizeof(struct cmsghdr)))
CMSG_NXTHDR(mhdr, cmsg) \
(((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len) + \
ALIGN(sizeof(struct cmsghdr)) > \
(unsigned char *)(mhdr)->msg_control +(mhdr)->msg_controllen) ? \
(struct cmsghdr *)0 /* NULL */ : \
(struct cmsghdr *)((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len)))
CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control)
+/
struct linger
{
int l_onoff;
int l_linger;
}
enum
{
SOCK_DGRAM = 2,
SOCK_RDM = 4,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1
}
enum : uint
{
SOL_SOCKET = 0xffff
}
enum : uint
{
SO_ACCEPTCONN = 0x0002,
SO_BROADCAST = 0x0020,
SO_DEBUG = 0x0001,
SO_DONTROUTE = 0x0010,
SO_ERROR = 0x1007,
SO_KEEPALIVE = 0x0008,
SO_LINGER = 0x1080,
SO_NOSIGPIPE = 0x1022, // non-standard
SO_OOBINLINE = 0x0100,
SO_RCVBUF = 0x1002,
SO_RCVLOWAT = 0x1004,
SO_RCVTIMEO = 0x1006,
SO_REUSEADDR = 0x0004,
SO_REUSEPORT = 0x0200,
SO_SNDBUF = 0x1001,
SO_SNDLOWAT = 0x1003,
SO_SNDTIMEO = 0x1005,
SO_TYPE = 0x1008
}
enum
{
SOMAXCONN = 128
}
enum : uint
{
MSG_CTRUNC = 0x20,
MSG_DONTROUTE = 0x4,
MSG_EOR = 0x8,
MSG_OOB = 0x1,
MSG_PEEK = 0x2,
MSG_TRUNC = 0x10,
MSG_WAITALL = 0x40
}
enum
{
AF_APPLETALK = 16,
AF_INET = 2,
AF_IPX = 23,
AF_UNIX = 1,
AF_UNSPEC = 0,
PF_APPLETALK = AF_APPLETALK,
PF_IPX = AF_IPX
}
enum
{
SHUT_RD,
SHUT_WR,
SHUT_RDWR
}
int accept(int, scope sockaddr*, scope socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
int getpeername(int, scope sockaddr*, scope socklen_t*);
int getsockname(int, scope sockaddr*, scope socklen_t*);
int getsockopt(int, int, int, scope void*, scope socklen_t*);
int listen(int, int) @safe;
ssize_t recv(int, scope void*, size_t, int);
ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
ssize_t recvmsg(int, scope msghdr*, int);
ssize_t send(int, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int) @safe;
int socket(int, int, int) @safe;
int sockatmark(int) @safe;
int socketpair(int, int, int, ref int[2]) @safe;
}
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 = 0x01
}
private // <machine/param.h>
{
enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
}
extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
{
return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
}
extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
{
if ( cmsg == null )
{
return CMSG_FIRSTHDR( mhdr );
}
else
{
if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
return null;
else
return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
}
}
extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
{
return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
}
struct linger
{
int l_onoff;
int l_linger;
}
enum
{
SOCK_DGRAM = 2,
SOCK_RDM = 4,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1
}
enum : uint
{
SOL_SOCKET = 0xffff
}
enum : uint
{
SO_ACCEPTCONN = 0x0002,
SO_BROADCAST = 0x0020,
SO_DEBUG = 0x0001,
SO_DONTROUTE = 0x0010,
SO_ERROR = 0x1007,
SO_KEEPALIVE = 0x0008,
SO_LINGER = 0x0080,
SO_NOSIGPIPE = 0x0800, // non-standard
SO_OOBINLINE = 0x0100,
SO_RCVBUF = 0x1002,
SO_RCVLOWAT = 0x1004,
SO_RCVTIMEO = 0x1006,
SO_REUSEADDR = 0x0004,
SO_REUSEPORT = 0x0200,
SO_SNDBUF = 0x1001,
SO_SNDLOWAT = 0x1003,
SO_SNDTIMEO = 0x1005,
SO_TYPE = 0x1008
}
enum
{
SOMAXCONN = 128
}
enum : uint
{
MSG_CTRUNC = 0x20,
MSG_DONTROUTE = 0x4,
MSG_EOR = 0x8,
MSG_OOB = 0x1,
MSG_PEEK = 0x2,
MSG_TRUNC = 0x10,
MSG_WAITALL = 0x40,
MSG_NOSIGNAL = 0x20000
}
enum
{
AF_APPLETALK = 16,
AF_INET = 2,
AF_IPX = 23,
AF_UNIX = 1,
AF_UNSPEC = 0
}
enum
{
SHUT_RD = 0,
SHUT_WR = 1,
SHUT_RDWR = 2
}
int accept(int, scope sockaddr*, scope socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
int getpeername(int, scope sockaddr*, scope socklen_t*);
int getsockname(int, scope sockaddr*, scope socklen_t*);
int getsockopt(int, int, int, scope void*, scope socklen_t*);
int listen(int, int) @safe;
ssize_t recv(int, scope void*, size_t, int);
ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
ssize_t recvmsg(int, scope msghdr*, int);
ssize_t send(int, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int) @safe;
int socket(int, int, int) @safe;
int sockatmark(int) @safe;
int socketpair(int, int, int, ref int[2]) @safe;
}
else version (NetBSD)
{
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 = 0x01
}
private // <machine/param.h>
{
enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
}
extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
{
return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
}
extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
{
if ( cmsg == null )
{
return CMSG_FIRSTHDR( mhdr );
}
else
{
if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
return null;
else
return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
}
}
extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
{
return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
}
struct linger
{
int l_onoff;
int l_linger;
}
enum
{
SOCK_DGRAM = 2,
SOCK_RDM = 4,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1
}
enum : uint
{
SOL_SOCKET = 0xffff
}
enum : uint
{
SO_DEBUG = 0x0001, /* turn on debugging info recording */
SO_ACCEPTCONN = 0x0002, /* socket has had listen() */
SO_REUSEADDR = 0x0004, /* allow local address reuse */
SO_KEEPALIVE = 0x0008, /* keep connections alive */
SO_DONTROUTE = 0x0010, /* just use interface addresses */
SO_BROADCAST = 0x0020, /* permit sending of broadcast msgs */
SO_USELOOPBACK = 0x0040, /* bypass hardware when possible */
SO_LINGER = 0x0080, /* linger on close if data present */
SO_OOBINLINE = 0x0100, /* leave received OOB data in line */
SO_REUSEPORT = 0x0200, /* allow local address & port reuse */
/* SO_OTIMESTAMP 0x0400 */
SO_NOSIGPIPE = 0x0800, /* no SIGPIPE from EPIPE */
SO_ACCEPTFILTER = 0x1000, /* there is an accept filter */
SO_TIMESTAMP = 0x2000, /* timestamp received dgram traffic */
/*
* Additional options, not kept in so_options.
*/
SO_SNDBUF = 0x1001, /* send buffer size */
SO_RCVBUF = 0x1002, /* receive buffer size */
SO_SNDLOWAT = 0x1003, /* send low-water mark */
SO_RCVLOWAT = 0x1004, /* receive low-water mark */
/* SO_OSNDTIMEO 0x1005 */
/* SO_ORCVTIMEO 0x1006 */
SO_ERROR = 0x1007, /* get error status and clear */
SO_TYPE = 0x1008, /* get socket type */
SO_OVERFLOWED = 0x1009, /* datagrams: return packets dropped */
SO_NOHEADER = 0x100a, /* user supplies no header to kernel;
* kernel removes header and supplies
* payload
*/
SO_SNDTIMEO = 0x100b, /* send timeout */
SO_RCVTIMEO = 0x100c /* receive timeout */
}
enum
{
SOMAXCONN = 128
}
enum : uint
{
MSG_OOB = 0x0001, /* process out-of-band data */
MSG_PEEK = 0x0002, /* peek at incoming message */
MSG_DONTROUTE = 0x0004, /* send without using routing tables */
MSG_EOR = 0x0008, /* data completes record */
MSG_TRUNC = 0x0010, /* data discarded before delivery */
MSG_CTRUNC = 0x0020, /* control data lost before delivery */
MSG_WAITALL = 0x0040, /* wait for full request or error */
MSG_DONTWAIT = 0x0080, /* this message should be nonblocking */
MSG_BCAST = 0x0100, /* this message was rcvd using link-level brdcst */
MSG_MCAST = 0x0200, /* this message was rcvd using link-level mcast */
MSG_NOSIGNAL = 0x0400 /* do not generate SIGPIPE on EOF */
}
enum
{
AF_APPLETALK = 16,
AF_INET = 2,
AF_IPX = 23,
AF_UNIX = 1,
AF_UNSPEC = 0
}
enum
{
SHUT_RD = 0,
SHUT_WR = 1,
SHUT_RDWR = 2
}
int accept(int, scope sockaddr*, scope socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
int getpeername(int, scope sockaddr*, scope socklen_t*);
int getsockname(int, scope sockaddr*, scope socklen_t*);
int getsockopt(int, int, int, scope void*, scope socklen_t*);
int listen(int, int) @safe;
ssize_t recv(int, scope void*, size_t, int);
ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
ssize_t recvmsg(int, scope msghdr*, int);
ssize_t send(int, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int) @safe;
int socket(int, int, int) @safe;
int sockatmark(int) @safe;
int socketpair(int, int, int, ref int[2]) @safe;
}
else version (OpenBSD)
{
alias uint socklen_t;
alias ubyte sa_family_t;
struct sockaddr
{
ubyte sa_len;
sa_family_t sa_family;
byte[14] sa_data;
}
struct sockaddr_storage
{
ubyte ss_len;
sa_family_t ss_family;
byte[6] __ss_pad1;
long __ss_align;
byte[240] __ss_pad2;
}
struct msghdr
{
void* msg_name;
socklen_t msg_namelen;
iovec* msg_iov;
uint 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 = 0x01
}
private // <sys/_types.h>
{
extern (D) size_t _ALIGN(size_t p) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
}
extern (D) ubyte* CMSG_DATA(cmsghdr* cmsg)
{
return cast(ubyte*) cmsg + _ALIGN(cmsghdr.sizeof);
}
extern (D) cmsghdr* CMSG_NXTHDR(msghdr* mhdr, cmsghdr* cmsg)
{
if (cast(ubyte*) cmsg + _ALIGN(cmsg.cmsg_len) + _ALIGN(cmsghdr.sizeof) >
cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen)
return null;
else
return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN(cmsg.cmsg_len));
}
extern (D) cmsghdr* CMSG_FIRSTHDR(msghdr* mhdr)
{
return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
}
struct linger
{
int l_onoff;
int l_linger;
}
enum
{
SOCK_DGRAM = 2,
SOCK_RDM = 4,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1
}
enum : uint
{
SOL_SOCKET = 0xffff
}
enum : uint
{
SO_DEBUG = 0x0001,
SO_ACCEPTCONN = 0x0002,
SO_REUSEADDR = 0x0004,
SO_KEEPALIVE = 0x0008,
SO_DONTROUTE = 0x0010,
SO_BROADCAST = 0x0020,
SO_USELOOPBACK = 0x0040,
SO_LINGER = 0x0080,
SO_OOBINLINE = 0x0100,
SO_REUSEPORT = 0x0200,
SO_TIMESTAMP = 0x0800,
SO_BINDANY = 0x1000,
SO_ZEROSIZE = 0x2000,
SO_SNDBUF = 0x1001,
SO_RCVBUF = 0x1002,
SO_SNDLOWAT = 0x1003,
SO_RCVLOWAT = 0x1004,
SO_SNDTIMEO = 0x1005,
SO_RCVTIMEO = 0x1006,
SO_ERROR = 0x1007,
SO_TYPE = 0x1008,
SO_NETPROC = 0x1020,
SO_RTABLE = 0x1021,
SO_PEERCRED = 0x1022,
SO_SPLICE = 0x1023,
}
enum
{
SOMAXCONN = 128
}
enum : uint
{
MSG_OOB = 0x001,
MSG_PEEK = 0x002,
MSG_DONTROUTE = 0x004,
MSG_EOR = 0x008,
MSG_TRUNC = 0x010,
MSG_CTRUNC = 0x020,
MSG_WAITALL = 0x040,
MSG_DONTWAIT = 0x080,
MSG_BCAST = 0x100,
MSG_MCAST = 0x200,
MSG_NOSIGNAL = 0x400,
MSG_CMSG_CLOEXEC = 0x800,
}
enum
{
AF_APPLETALK = 16,
AF_INET = 2,
AF_IPX = 23,
AF_UNIX = 1,
AF_UNSPEC = 0
}
enum
{
SHUT_RD = 0,
SHUT_WR = 1,
SHUT_RDWR = 2
}
int accept(int, scope sockaddr*, scope socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
int getpeername(int, scope sockaddr*, scope socklen_t*);
int getsockname(int, scope sockaddr*, scope socklen_t*);
int getsockopt(int, int, int, scope void*, scope socklen_t*);
int listen(int, int) @safe;
ssize_t recv(int, scope void*, size_t, int);
ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
ssize_t recvmsg(int, scope msghdr*, int);
ssize_t send(int, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int) @safe;
int socket(int, int, int) @safe;
int sockatmark(int) @safe;
int socketpair(int, int, int, ref int[2]) @safe;
}
else version (DragonFlyBSD)
{
alias uint socklen_t;
alias ubyte sa_family_t;
enum
{
SOCK_STREAM = 1,
SOCK_DGRAM = 2,
//SOCK_RAW = 3, // defined below
SOCK_RDM = 4,
SOCK_SEQPACKET = 5,
}
enum SOCK_CLOEXEC = 0x10000000;
enum SOCK_NONBLOCK = 0x20000000;
enum : uint
{
SO_DEBUG = 0x0001,
SO_ACCEPTCONN = 0x0002,
SO_REUSEADDR = 0x0004,
SO_KEEPALIVE = 0x0008,
SO_DONTROUTE = 0x0010,
SO_BROADCAST = 0x0020,
SO_USELOOPBACK = 0x0040,
SO_LINGER = 0x0080,
SO_OOBINLINE = 0x0100,
SO_REUSEPORT = 0x0200,
SO_TIMESTAMP = 0x0400,
SO_NOSIGPIPE = 0x0800, // non-standard
SO_ACCEPTFILTER = 0x1000,
SO_SNDBUF = 0x1001,
SO_RCVBUF = 0x1002,
SO_SNDLOWAT = 0x1003,
SO_RCVLOWAT = 0x1004,
SO_SNDTIMEO = 0x1005,
SO_RCVTIMEO = 0x1006,
SO_ERROR = 0x1007,
SO_TYPE = 0x1008,
SO_SNDSPACE = 0x100a, // get appr. send buffer free space
SO_CPUHINT = 0x1030, // get socket's owner cpuid hint
}
struct linger
{
int l_onoff;
int l_linger;
}
struct accept_filter_arg {
byte[16] af_name;
byte[256-16] af_arg;
}
enum : uint
{
SOL_SOCKET = 0xffff
}
enum
{
AF_UNSPEC = 0,
AF_LOCAL = 1,
AF_UNIX = AF_LOCAL,
AF_INET = 2,
AF_APPLETALK = 16,
AF_IPX = 23,
}
struct sockaddr
{
ubyte sa_len;
sa_family_t sa_family;
byte[14] sa_data;
}
enum SOCK_MAXADDRLEN = 255;
struct sockproto {
ushort sp_family;
ushort sp_protocol;
}
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;
}
enum SOMAXCONN = 128;
enum SOMAXOPT_SIZE = 65536;
enum SOMAXOPT_SIZE0 = (32 * 1024 * 1024);
enum : uint
{
MSG_OOB = 0x00000001,
MSG_PEEK = 0x00000002,
MSG_DONTROUTE = 0x00000004,
MSG_EOR = 0x00000008,
MSG_TRUNC = 0x00000010,
MSG_CTRUNC = 0x00000020,
MSG_WAITALL = 0x00000040,
MSG_DONTWAIT = 0x00000080,
MSG_EOF = 0x00000100,
MSG_UNUSED09 = 0x00000200,
MSG_NOSIGNAL = 0x00000400,
MSG_SYNC = 0x00000800,
MSG_CMSG_CLOEXEC = 0x00001000,
/* These override FIONBIO. MSG_FNONBLOCKING is functionally equivalent to MSG_DONTWAIT.*/
MSG_FBLOCKING = 0x00010000,
MSG_FNONBLOCKING = 0x00020000,
MSG_FMASK = 0xFFFF0000,
}
struct cmsghdr
{
socklen_t cmsg_len;
int cmsg_level;
int cmsg_type;
}
enum CMGROUP_MAX = 16;
struct cmsgcred {
pid_t cmcred_pid;
uid_t cmcred_uid;
uid_t cmcred_euid;
gid_t cmcred_gid;
short cmcred_ngroups;
gid_t[CMGROUP_MAX] cmcred_groups;
}
enum : uint
{
SCM_RIGHTS = 0x01
}
private // <machine/param.h>
{
enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
}
extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
{
return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
}
extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
{
if ( cmsg == null )
{
return CMSG_FIRSTHDR( mhdr );
}
else
{
if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
return null;
else
return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
}
}
extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
{
return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
}
enum
{
SHUT_RD = 0,
SHUT_WR = 1,
SHUT_RDWR = 2
}
/*
/+ sendfile(2) header/trailer struct +/
struct sf_hdtr {
iovec * headers;
int hdr_cnt;
iovec * trailers;
int trl_cnt;
}
*/
int accept(int, sockaddr*, socklen_t*);
// int accept4(int, sockaddr*, socklen_t*, int);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
// int extconnect(int, int, 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, const scope void*, size_t, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
ssize_t sendmsg(int, const scope msghdr*, int);
// int sendfile(int, int, off_t, size_t, sf_hdtr *, off_t *, int);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int);
int sockatmark(int);
int socket(int, int, int);
int socketpair(int, int, int, ref int[2]);
// void pfctlinput(int, struct sockaddr *);
}
else version (Solaris)
{
alias uint socklen_t;
alias ushort sa_family_t;
struct sockaddr
{
sa_family_t sa_family;
char[14] sa_data = 0;
}
alias double sockaddr_maxalign_t;
private
{
enum _SS_ALIGNSIZE = sockaddr_maxalign_t.sizeof;
enum _SS_MAXSIZE = 256;
enum _SS_PAD1SIZE = _SS_ALIGNSIZE - sa_family_t.sizeof;
enum _SS_PAD2SIZE = _SS_MAXSIZE - sa_family_t.sizeof + _SS_PAD1SIZE + _SS_ALIGNSIZE;
}
struct sockaddr_storage
{
sa_family_t ss_family;
char[_SS_PAD1SIZE] _ss_pad1 = void;
sockaddr_maxalign_t _ss_align;
char[_SS_PAD2SIZE] _ss_pad2 = void;
}
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 = 0x1010
}
// FIXME: CMSG_DATA, CMSG_NXTHDR, CMSG_FIRSTHDR missing
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 = 0xffff
}
enum : uint
{
SO_ACCEPTCONN = 0x0002,
SO_BROADCAST = 0x0020,
SO_DEBUG = 0x0001,
SO_DONTROUTE = 0x0010,
SO_ERROR = 0x1007,
SO_KEEPALIVE = 0x0008,
SO_LINGER = 0x0080,
SO_OOBINLINE = 0x0100,
SO_RCVBUF = 0x1002,
SO_RCVLOWAT = 0x1004,
SO_RCVTIMEO = 0x1006,
SO_REUSEADDR = 0x0004,
SO_SNDBUF = 0x1001,
SO_SNDLOWAT = 0x1003,
SO_SNDTIMEO = 0x1005,
SO_TYPE = 0x1008,
SO_USELOOPBACK = 0x0040, // non-standard
SO_DGRAM_ERRIND = 0x0200, // non-standard
SO_RECVUCRED = 0x0400, // non-standard
}
enum
{
SOMAXCONN = 128
}
enum : uint
{
MSG_CTRUNC = 0x10,
MSG_DONTROUTE = 0x4,
MSG_EOR = 0x8,
MSG_OOB = 0x1,
MSG_PEEK = 0x2,
MSG_TRUNC = 0x20,
MSG_WAITALL = 0x40
}
enum
{
AF_IPX = 23,
AF_APPLETALK = 16,
AF_INET = 2,
AF_UNIX = 1,
AF_UNSPEC = 0
}
enum
{
SHUT_RD,
SHUT_WR,
SHUT_RDWR
}
int accept(int, scope sockaddr*, scope socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
int getpeername(int, scope sockaddr*, scope socklen_t*);
int getsockname(int, scope sockaddr*, scope socklen_t*);
int getsockopt(int, int, int, scope void*, scope socklen_t*);
int listen(int, int) @safe;
ssize_t recv(int, scope void*, size_t, int);
ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
ssize_t recvmsg(int, scope msghdr*, int);
ssize_t send(int, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int) @safe;
int socket(int, int, int) @safe;
int sockatmark(int) @safe;
int socketpair(int, int, int, ref int[2]) @safe;
}
else version (CRuntime_Bionic)
{
alias int socklen_t;
alias ushort sa_family_t;
struct sockaddr
{
sa_family_t sa_family;
byte[14] sa_data;
}
private enum size_t _K_SS_MAXSIZE = 128;
struct sockaddr_storage
{
ushort ss_family;
byte[_K_SS_MAXSIZE - ushort.sizeof] __data;
}
enum : uint
{
SCM_RIGHTS = 0x01
}
private enum _ALIGNBYTES = c_long.sizeof - 1;
extern (D)
{
size_t CMSG_ALIGN( size_t len )
{
return (len + _ALIGNBYTES) & ~_ALIGNBYTES;
}
void* CMSG_DATA( cmsghdr* cmsg )
{
return cast(void*) (cast(char*) cmsg + CMSG_ALIGN( cmsghdr.sizeof ));
}
cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
{
cmsghdr* __ptr = cast(cmsghdr*) ((cast(ubyte*) cmsg) + CMSG_ALIGN(cmsg.cmsg_len));
return cast(c_ulong)( cast(char*)(__ptr+1) - cast(char*) mhdr.msg_control) > mhdr.msg_controllen ? null : __ptr;
}
cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
{
return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
}
}
struct linger
{
int l_onoff;
int l_linger;
}
struct msghdr
{
void* msg_name;
int msg_namelen;
iovec* msg_iov;
__kernel_size_t msg_iovlen;
void* msg_control;
__kernel_size_t msg_controllen;
uint msg_flags;
}
struct cmsghdr
{
__kernel_size_t cmsg_len;
int cmsg_level;
int cmsg_type;
}
alias size_t __kernel_size_t;
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 = 0x08,
MSG_DONTROUTE = 0x04,
MSG_EOR = 0x80,
MSG_OOB = 0x01,
MSG_PEEK = 0x02,
MSG_TRUNC = 0x20,
MSG_WAITALL = 0x100
}
enum
{
AF_APPLETALK = 5,
AF_INET = 2,
AF_IPX = 4,
AF_UNIX = 1,
AF_UNSPEC = 0
}
enum
{
SHUT_RD,
SHUT_WR,
SHUT_RDWR
}
enum SOCK_RDM = 4;
int accept(int, scope sockaddr*, scope socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope sockaddr*, socklen_t);
int getpeername(int, scope sockaddr*, scope socklen_t*);
int getsockname(int, scope sockaddr*, scope socklen_t*);
int getsockopt(int, int, int, scope void*, scope socklen_t*);
int listen(int, int) @safe;
ssize_t recv(int, scope void*, size_t, int);
ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
int recvmsg(int, scope msghdr*, int);
ssize_t send(int, const scope void*, size_t, int);
int sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope void*, socklen_t);
int shutdown(int, int) @safe;
int socket(int, int, int) @safe;
int sockatmark(int) @safe;
int socketpair(int, int, int, ref int[2]) @safe;
}
else version (CRuntime_Musl)
{
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 - sa_family_t.sizeof
}
struct sockaddr_storage
{
sa_family_t ss_family;
byte[_SS_PADSIZE] __ss_padding;
c_ulong __ss_align;
}
enum
{
SOCK_STREAM = 1,
SOCK_DGRAM = 2,
SOCK_RDM = 4,
SOCK_SEQPACKET = 5,
SOCK_DCCP = 6,
SOCK_PACKET = 10
}
enum
{
AF_UNSPEC = 0,
AF_LOCAL = 1,
AF_UNIX = AF_LOCAL,
AF_FILE = AF_LOCAL,
AF_INET = 2,
AF_AX25 = 3,
AF_IPX = 4,
AF_APPLETALK = 5,
PF_APPLETALK = AF_APPLETALK,
PF_IPX = AF_IPX
}
enum
{
SHUT_RD,
SHUT_WR,
SHUT_RDWR
}
enum
{
SOL_SOCKET = 1
}
enum
{
SO_DEBUG = 1
}
version (MIPS_Any)
{
enum
{
SO_REUSEADDR = 0x0004,
SO_TYPE = 0x1008,
SO_ERROR = 0x1007,
SO_DONTROUTE = 0x0010,
SO_BROADCAST = 0x0020,
SO_SNDBUF = 0x1001,
SO_RCVBUF = 0x1002,
SO_KEEPALIVE = 0x0008,
SO_OOBINLINE = 0x0100,
SO_LINGER = 0x0080,
SO_REUSEPORT = 0x0200,
SO_RCVLOWAT = 0x1004,
SO_SNDLOWAT = 0x1003,
SO_RCVTIMEO = 0x1006,
SO_SNDTIMEO = 0x1005,
SO_ACCEPTCONN = 0x1009
}
}
else
{
enum
{
SO_REUSEADDR = 2,
SO_TYPE = 3,
SO_ERROR = 4,
SO_DONTROUTE = 5,
SO_BROADCAST = 6,
SO_SNDBUF = 7,
SO_RCVBUF = 8,
SO_KEEPALIVE = 9,
SO_OOBINLINE = 10,
SO_LINGER = 13,
SO_REUSEPORT = 15,
SO_RCVLOWAT = 18,
SO_SNDLOWAT = 19,
SO_RCVTIMEO = 20,
SO_SNDTIMEO = 21,
SO_ACCEPTCONN = 30
}
}
enum : uint
{
MSG_OOB = 0x01,
MSG_PEEK = 0x02,
MSG_DONTROUTE = 0x04,
MSG_CTRUNC = 0x08,
MSG_TRUNC = 0x20,
MSG_EOR = 0x80,
MSG_WAITALL = 0x100,
MSG_NOSIGNAL = 0x4000
}
struct linger
{
int l_onoff;
int l_linger;
}
struct msghdr {
void *msg_name;
socklen_t msg_namelen;
iovec *msg_iov;
int msg_iovlen, __pad1;
void *msg_control;
socklen_t msg_controllen, __pad2;
int msg_flags;
}
int accept(int, sockaddr*, socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope 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, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope 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 (CRuntime_UClibc)
{
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;
}
enum : uint
{
SCM_RIGHTS = 0x01
}
extern (D) inout(ubyte)* CMSG_DATA( inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
private inout(cmsghdr)* __cmsg_nxthdr(inout(msghdr)*, inout(cmsghdr)*) pure nothrow @nogc;
extern (D) inout(cmsghdr)* CMSG_NXTHDR(inout(msghdr)* msg, inout(cmsghdr)* cmsg) pure nothrow @nogc
{
return __cmsg_nxthdr(msg, cmsg);
}
extern (D) inout(cmsghdr)* CMSG_FIRSTHDR( inout(msghdr)* mhdr ) pure nothrow @nogc
{
return ( cast(size_t)mhdr.msg_controllen >= cmsghdr.sizeof
? cast(inout(cmsghdr)*) mhdr.msg_control
: cast(inout(cmsghdr)*) null );
}
extern (D)
{
size_t CMSG_ALIGN( size_t len ) pure nothrow @nogc
{
return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
}
size_t CMSG_LEN( size_t len ) pure nothrow @nogc
{
return CMSG_ALIGN(cmsghdr.sizeof) + len;
}
}
extern (D) size_t CMSG_SPACE(size_t len) pure nothrow @nogc
{
return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof);
}
struct linger
{
int l_onoff;
int l_linger;
}
version (X86_Any)
{
enum
{
SOCK_DGRAM = 2,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1,
SOCK_CLOEXEC = 0x80000, // octal 02000000
SOCK_NONBLOCK = 0x800 // octal 00004000
}
}
else version (MIPS_Any)
{
enum
{
SOCK_DGRAM = 1,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 2,
SOCK_CLOEXEC = 0x80000, // octal 02000000
SOCK_NONBLOCK = 0x80 // octal 00000200
}
}
else version (ARM_Any)
{
enum
{
SOCK_DGRAM = 2,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1,
SOCK_CLOEXEC = 0x80000, // octal 02000000
SOCK_NONBLOCK = 0x800 // octal 00004000
}
}
else
static assert(0, "unimplemented");
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,
SOL_SOCKET = 1,
SOL_TCP = 6,
SOMAXCONN = 128
}
enum : uint
{
MSG_CTRUNC = 0x08,
MSG_DONTROUTE = 0x04,
MSG_EOR = 0x80,
MSG_OOB = 0x01,
MSG_PEEK = 0x02,
MSG_TRUNC = 0x20,
MSG_WAITALL = 0x100,
MSG_NOSIGNAL = 0x4000
}
enum
{
AF_APPLETALK = 5,
AF_INET = 2,
AF_IPX = 4,
AF_UNIX = 1,
AF_UNSPEC = 0,
PF_APPLETALK = AF_APPLETALK,
PF_IPX = AF_IPX
}
enum int SOCK_RDM = 4;
enum
{
SHUT_RD,
SHUT_WR,
SHUT_RDWR
}
int accept(int, sockaddr*, socklen_t*);
int bind(int, const scope sockaddr*, socklen_t);
int connect(int, const scope 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, const scope void*, size_t, int);
ssize_t sendmsg(int, const scope msghdr*, int);
ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
int setsockopt(int, int, int, const scope 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");
}
//
// IPV6 (IP6)
//
/*
AF_INET6
*/
version (CRuntime_Glibc)
{
enum
{
AF_INET6 = 10
}
}
else version (Darwin)
{
enum
{
AF_INET6 = 30
}
}
else version (FreeBSD)
{
enum
{
AF_INET6 = 28
}
}
else version (NetBSD)
{
enum
{
AF_INET6 = 24
}
}
else version (OpenBSD)
{
enum
{
AF_INET6 = 24
}
}
else version (DragonFlyBSD)
{
enum
{
AF_INET6 = 28
}
}
else version (Solaris)
{
enum
{
AF_INET6 = 26,
}
}
else version (CRuntime_Bionic)
{
enum
{
AF_INET6 = 10
}
}
else version (CRuntime_Musl)
{
enum AF_INET6 = 10;
}
else version (CRuntime_UClibc)
{
enum
{
AF_INET6 = 10
}
}
else
{
static assert(false, "Unsupported platform");
}
//
// Raw Sockets (RS)
//
/*
SOCK_RAW
*/
version (CRuntime_Glibc)
{
enum
{
SOCK_RAW = 3
}
}
else version (Darwin)
{
enum
{
SOCK_RAW = 3
}
}
else version (FreeBSD)
{
enum
{
SOCK_RAW = 3
}
}
else version (NetBSD)
{
enum
{
SOCK_RAW = 3
}
}
else version (OpenBSD)
{
enum
{
SOCK_RAW = 3
}
}
else version (DragonFlyBSD)
{
enum
{
SOCK_RAW = 3
}
}
else version (Solaris)
{
enum
{
SOCK_RAW = 4,
}
}
else version (CRuntime_Bionic)
{
enum
{
SOCK_RAW = 3
}
}
else version (CRuntime_Musl)
{
enum
{
SOCK_RAW = 3
}
}
else version (CRuntime_UClibc)
{
enum
{
SOCK_RAW = 3
}
}
else
{
static assert(false, "Unsupported platform");
}