#include <endian.h>

struct msghdr {
	void *msg_name;
	socklen_t msg_namelen;
	struct iovec *msg_iov;
#if __BYTE_ORDER == __BIG_ENDIAN
	int __pad1, msg_iovlen;
#else
	int msg_iovlen, __pad1;
#endif
	void *msg_control;
#if __BYTE_ORDER == __BIG_ENDIAN
	int __pad2;
	socklen_t msg_controllen;
#else
	socklen_t msg_controllen;
	int __pad2;
#endif
	int msg_flags;
};

struct cmsghdr {
#if __BYTE_ORDER == __BIG_ENDIAN
	int __pad1;
	socklen_t cmsg_len;
#else
	socklen_t cmsg_len;
	int __pad1;
#endif
	int cmsg_level;
	int cmsg_type;
};

#define SOCK_STREAM    2
#define SOCK_DGRAM     1
#define SOL_SOCKET     65535
#define SO_DEBUG       1

#define SO_REUSEADDR    0x0004
#define SO_KEEPALIVE    0x0008
#define SO_DONTROUTE    0x0010
#define SO_BROADCAST    0x0020
#define SO_LINGER       0x0080
#define SO_OOBINLINE    0x0100
#define SO_REUSEPORT    0x0200
#define SO_SNDBUF       0x1001
#define SO_RCVBUF       0x1002
#define SO_SNDLOWAT     0x1003
#define SO_RCVLOWAT     0x1004
#define SO_RCVTIMEO     0x1006
#define SO_SNDTIMEO     0x1005
#define SO_ERROR        0x1007
#define SO_TYPE         0x1008
#define SO_ACCEPTCONN   0x1009
#define SO_PROTOCOL     0x1028
#define SO_DOMAIN       0x1029

#define SO_NO_CHECK     11
#define SO_PRIORITY     12
#define SO_BSDCOMPAT    14
#define SO_PASSCRED     17
#define SO_PEERCRED     18
#define SO_PEERSEC      30
#define SO_SNDBUFFORCE  31
#define SO_RCVBUFFORCE  33

#define SOCK_NONBLOCK     0200
#define SOCK_CLOEXEC  02000000
