diff lphobos/std/c/linux/socket.d @ 1:c53b6e3fe49a trunk

[svn r5] Initial commit. Most things are very rough.
author lindquist
date Sat, 01 Sep 2007 21:43:27 +0200
parents
children 058d3925950e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lphobos/std/c/linux/socket.d	Sat Sep 01 21:43:27 2007 +0200
@@ -0,0 +1,396 @@
+/*
+	Written by Christopher E. Miller
+	Placed into public domain.
+*/
+
+
+module std.c.linux.socket;
+
+private import std.stdint;
+
+
+extern(C):
+
+alias int socklen_t;
+
+const int F_GETFL =       3;
+const int F_SETFL =       4;
+const int O_NONBLOCK =    0x800;
+
+
+int socket(int af, int type, int protocol);
+int bind(int s, sockaddr* name, int namelen);
+int connect(int s, sockaddr* name, int namelen);
+int listen(int s, int backlog);
+int accept(int s, sockaddr* addr, int* addrlen);
+int shutdown(int s, int how);
+int getpeername(int s, sockaddr* name, int* namelen);
+int getsockname(int s, sockaddr* name, int* namelen);
+int send(int s, void* buf, int len, int flags);
+int sendto(int s, void* buf, int len, int flags, sockaddr* to, int tolen);
+int recv(int s, void* buf, int len, int flags);
+int recvfrom(int s, void* buf, int len, int flags, sockaddr* from, int* fromlen);
+int getsockopt(int s, int level, int optname, void* optval, int* optlen);
+int setsockopt(int s, int level, int optname, void* optval, int optlen);
+uint inet_addr(char* cp);
+char* inet_ntoa(in_addr ina);
+hostent* gethostbyname(char* name);
+int gethostbyname_r(char* name, hostent* ret, void* buf, size_t buflen, hostent** result, int* h_errnop);
+int gethostbyname2_r(char* name, int af, hostent* ret, void* buf, size_t buflen, hostent** result, int* h_errnop);
+hostent* gethostbyaddr(void* addr, int len, int type);
+protoent* getprotobyname(char* name);
+protoent* getprotobynumber(int number);
+servent* getservbyname(char* name, char* proto);
+servent* getservbyport(int port, char* proto);
+int gethostname(char* name, int namelen);
+int getaddrinfo(char* nodename, char* servname, addrinfo* hints, addrinfo** res);
+void freeaddrinfo(addrinfo* ai);
+int getnameinfo(sockaddr* sa, socklen_t salen, char* node, socklen_t nodelen, char* service, socklen_t servicelen, int flags);
+
+
+
+enum: int
+{
+	AF_UNSPEC =     0,
+	AF_UNIX =       1,
+	AF_INET =       2,
+	AF_IPX =        4,
+	AF_APPLETALK =  5,
+	AF_INET6 =      10,
+	// ...
+	
+	PF_UNSPEC =     AF_UNSPEC,
+	PF_UNIX =       AF_UNIX,
+	PF_INET =       AF_INET,
+	PF_IPX =        AF_IPX,
+	PF_APPLETALK =  AF_APPLETALK,
+	PF_INET6 =      AF_INET6,
+}
+
+
+version(X86)
+    version=SOL_SOCKET_IS_1;
+else version(X86_64)
+    version=SOL_SOCKET_IS_1;
+else version(PPC)
+    version=SOL_SOCKET_IS_1;
+else version(PPC64)
+    version=SOL_SOCKET_IS_1;
+else
+    static assert(0, "Unsupported architecture");
+
+version(SOL_SOCKET_IS_1)
+{
+	enum: int
+	{
+		SOL_SOCKET =  1,
+	}
+}
+else
+{
+	// Different values on other platforms.
+	static assert(0);
+}
+
+
+enum: int
+{
+	SO_DEBUG =       1,
+	SO_BROADCAST =   6,
+	SO_REUSEADDR =   2,
+	SO_LINGER =      13,
+	SO_DONTLINGER =  ~SO_LINGER,
+	SO_OOBINLINE =   10,
+	SO_SNDBUF =      7,
+	SO_RCVBUF =      8,
+	SO_ACCEPTCONN =  30,
+	SO_DONTROUTE =   5,
+	SO_TYPE =        3,
+	
+	TCP_NODELAY =    1,
+	
+	IP_MULTICAST_LOOP =  34,
+	IP_ADD_MEMBERSHIP =  35,
+	IP_DROP_MEMBERSHIP = 36,
+	
+	// ...
+	
+	IPV6_ADDRFORM =        1,
+	IPV6_PKTINFO =         2,
+	IPV6_HOPOPTS =         3,
+	IPV6_DSTOPTS =         4,
+	IPV6_RTHDR =           5,
+	IPV6_PKTOPTIONS =      6,
+	IPV6_CHECKSUM =        7,
+	IPV6_HOPLIMIT =        8,
+	IPV6_NEXTHOP =         9,
+	IPV6_AUTHHDR =         10,
+	IPV6_UNICAST_HOPS =    16,
+	IPV6_MULTICAST_IF =    17,
+	IPV6_MULTICAST_HOPS =  18,
+	IPV6_MULTICAST_LOOP =  19,
+	IPV6_JOIN_GROUP =      20,
+	IPV6_LEAVE_GROUP =     21,
+	IPV6_ROUTER_ALERT =    22,
+	IPV6_MTU_DISCOVER =    23,
+	IPV6_MTU =             24,
+	IPV6_RECVERR =         25,
+	IPV6_V6ONLY =          26,
+	IPV6_JOIN_ANYCAST =    27,
+	IPV6_LEAVE_ANYCAST =   28,
+	IPV6_IPSEC_POLICY =    34,
+	IPV6_XFRM_POLICY =     35,
+}
+
+
+struct linger
+{
+	int32_t l_onoff;
+	int32_t l_linger;
+}
+
+
+struct protoent
+{
+	char* p_name;
+	char** p_aliases;
+	int32_t p_proto;
+}
+
+
+struct servent
+{
+	char* s_name;
+	char** s_aliases;
+	int32_t s_port;
+	char* s_proto;
+}
+
+
+version(BigEndian)
+{
+	uint16_t htons(uint16_t x)
+	{
+		return x;
+	}
+	
+	
+	uint32_t htonl(uint32_t x)
+	{
+		return x;
+	}
+}
+else version(LittleEndian)
+{
+	private import std.intrinsic;
+	
+	
+	uint16_t htons(uint16_t x)
+	{
+		return cast(uint16_t)((x >> 8) | (x << 8));
+	}
+
+
+	uint32_t htonl(uint32_t x)
+	{
+		return bswap(x);
+	}
+}
+else
+{
+	static assert(0);
+}
+
+
+uint16_t ntohs(uint16_t x)
+{
+	return htons(x);
+}
+
+
+uint32_t ntohl(uint32_t x)
+{
+	return htonl(x);
+}
+
+
+enum: int
+{
+	SOCK_STREAM =     1,
+	SOCK_DGRAM =      2,
+	SOCK_RAW =        3,
+	SOCK_RDM =        4,
+	SOCK_SEQPACKET =  5,
+}
+
+
+enum: int
+{
+	IPPROTO_IP =    0,
+	IPPROTO_ICMP =  1,
+	IPPROTO_IGMP =  2,
+	IPPROTO_GGP =   3,
+	IPPROTO_TCP =   6,
+	IPPROTO_PUP =   12,
+	IPPROTO_UDP =   17,
+	IPPROTO_IDP =   22,
+	IPPROTO_IPV6 =  41,
+	IPPROTO_ND =    77,
+	IPPROTO_RAW =   255,
+	
+	IPPROTO_MAX =   256,
+}
+
+
+enum: int
+{
+	MSG_OOB =        0x1,
+	MSG_PEEK =       0x2,
+	MSG_DONTROUTE =  0x4,
+}
+
+
+enum: int
+{
+	SD_RECEIVE =  0,
+	SD_SEND =     1,
+	SD_BOTH =     2,
+}
+
+
+enum: uint
+{
+	INADDR_ANY =        0,
+	INADDR_LOOPBACK =   0x7F000001,
+	INADDR_BROADCAST =  0xFFFFFFFF,
+	INADDR_NONE =       0xFFFFFFFF,
+	ADDR_ANY =          INADDR_ANY,
+}
+
+
+enum: int
+{
+	AI_PASSIVE = 0x1,
+	AI_CANONNAME = 0x2,
+	AI_NUMERICHOST = 0x4,
+}
+
+
+union in_addr
+{
+	private union _S_un_t
+	{
+		private struct _S_un_b_t
+		{
+			uint8_t s_b1, s_b2, s_b3, s_b4;
+		}
+		_S_un_b_t S_un_b;
+		
+		private struct _S_un_w_t
+		{
+			uint16_t s_w1, s_w2;
+		}
+		_S_un_w_t S_un_w;
+		
+		uint32_t S_addr;
+	}
+	_S_un_t S_un;
+	
+	uint32_t s_addr;
+	
+	struct
+	{
+		uint8_t s_net, s_host;
+		
+		union
+		{
+			uint16_t s_imp;
+			
+			struct
+			{
+				uint8_t s_lh, s_impno;
+			}
+		}
+	}
+}
+
+
+union in6_addr
+{
+	private union _in6_u_t
+	{
+		uint8_t[16] u6_addr8;
+		uint16_t[8] u6_addr16;
+		uint32_t[4] u6_addr32;
+	}
+	_in6_u_t in6_u;
+	
+	uint8_t[16] s6_addr8;
+	uint16_t[8] s6_addr16;
+	uint32_t[4] s6_addr32;
+}
+
+
+const in6_addr IN6ADDR_ANY = { s6_addr8: [0] };
+const in6_addr IN6ADDR_LOOPBACK = { s6_addr8: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] };
+//alias IN6ADDR_ANY IN6ADDR_ANY_INIT;
+//alias IN6ADDR_LOOPBACK IN6ADDR_LOOPBACK_INIT;
+	
+const uint INET_ADDRSTRLEN = 16;
+const uint INET6_ADDRSTRLEN = 46;
+
+
+struct sockaddr
+{
+	int16_t sa_family;               
+	ubyte[14] sa_data;             
+}
+
+
+struct sockaddr_in
+{
+	int16_t sin_family = AF_INET;
+	uint16_t sin_port;
+	in_addr sin_addr;
+	ubyte[8] sin_zero;
+}
+
+
+struct sockaddr_in6
+{
+	int16_t sin6_family = AF_INET6;
+	uint16_t sin6_port;
+	uint32_t sin6_flowinfo;
+	in6_addr sin6_addr;
+	uint32_t sin6_scope_id;
+}
+
+
+struct addrinfo
+{
+	int32_t ai_flags; 
+	int32_t ai_family;
+	int32_t ai_socktype;
+	int32_t ai_protocol;
+	size_t ai_addrlen;
+	sockaddr* ai_addr;
+	char* ai_canonname;
+	addrinfo* ai_next;
+}
+
+
+struct hostent
+{
+	char* h_name;
+	char** h_aliases;
+	int32_t h_addrtype;
+	int32_t h_length;
+	char** h_addr_list;
+	
+	
+	char* h_addr()
+	{
+		return h_addr_list[0];
+	}
+}
+