1 module tango.sys.linux.consts.socket;
2     import tango.sys.linux.consts.fcntl: F_GETFL, F_SETFL,O_NONBLOCK;
3     enum {SOCKET_ERROR = -1}
4     enum
5     {
6         SO_DEBUG = 1 , /* turn on debugging info recording */
7         SO_BROADCAST = 6 , /* permit sending of broadcast msgs */
8         SO_REUSEADDR = 2 , /* allow local address reuse */
9         SO_LINGER = 13 , /* linger on close if data present */
10         SO_DONTLINGER = ~(13),
11         SO_OOBINLINE = 10 , /* leave received OOB data in line */
12         SO_ACCEPTCONN = 30, /* socket has had listen() */
13         SO_KEEPALIVE = 9 , /* keep connections alive */
14         SO_DONTROUTE = 5 , /* just use interface addresses */
15         SO_TYPE = 3 , /* get socket type */
16         /*
17          * Additional options, not kept in so_options.
18          */
19         SO_SNDBUF = 7, /* send buffer size */
20         SO_RCVBUF = 8, /* receive buffer size */
21         SO_ERROR = 4 , /* get error status and clear */
22         // OptionLevel.IP settings
23         IP_MULTICAST_TTL = 33 ,
24         IP_MULTICAST_LOOP = 34 ,
25         IP_ADD_MEMBERSHIP = 35 ,
26         IP_DROP_MEMBERSHIP = 36,
27         // OptionLevel.TCP settings
28         TCP_NODELAY = 1 ,
29     }
30     enum
31     {
32         SOL_SOCKET = 1,
33     }
34     enum {
35         SOCK_STREAM = 1 , /++ sequential, reliable +/
36         SOCK_DGRAM = 2 , /++ connectionless unreliable, max length +/
37         SOCK_SEQPACKET = 5, /++ sequential, reliable, max length +/
38         SOCK_RAW = 3 , /++ raw protocol +/
39         SOCK_RDM = 4 , /++ reliable messages +/
40         SOCK_PACKET = 10, /++ linux specific packets at dev level +/
41     }
42     /* Standard well-defined IP protocols.  */
43     enum
44       {
45         IPPROTO_IP = 0, /* Dummy protocol for TCP.  */
46         IPPROTO_IPV4 = 0, /* Dummy protocol for TCP.  */
47         IPPROTO_IPV6 = 41, /* IPv6 header.  */
48         IPPROTO_ICMP = 1, /* Internet Control Message Protocol.  */
49         IPPROTO_IGMP = 2, /* Internet Group Management Protocol. */
50         IPPROTO_TCP = 6, /* Transmission Control Protocol.  */
51         IPPROTO_PUP = 12, /* PUP protocol.  */
52         IPPROTO_UDP = 17, /* User Datagram Protocol.  */
53         IPPROTO_IDP = 22, /* XNS IDP protocol.  */
54         /+
55         // undefined for cross platform reasons, if you need some of these ask
56         IPPROTO_HOPOPTS = 0, /* IPv6 Hop-by-Hop options.  */
57         IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94).  */
58         IPPROTO_EGP = 8, /* Exterior Gateway Protocol.  */
59         IPPROTO_TP = 29, /* SO Transport Protocol Class 4.  */
60         IPPROTO_ROUTING = 43, /* IPv6 routing header.  */
61         IPPROTO_FRAGMENT = 44, /* IPv6 fragmentation header.  */
62         IPPROTO_RSVP = 46, /* Reservation Protocol.  */
63         IPPROTO_GRE = 47, /* General Routing Encapsulation.  */
64         IPPROTO_ESP = 50, /* encapsulating security payload.  */
65         IPPROTO_AH = 51, /* authentication header.  */
66         IPPROTO_ICMPV6 = 58, /* ICMPv6.  */
67         IPPROTO_NONE = 59, /* IPv6 no next header.  */
68         IPPROTO_DSTOPTS = 60, /* IPv6 destination options.  */
69         IPPROTO_MTP = 92, /* Multicast Transport Protocol.  */
70         IPPROTO_ENCAP = 98, /* Encapsulation Header.  */
71         IPPROTO_PIM = 103, /* Protocol Independent Multicast.  */
72         IPPROTO_COMP = 108, /* Compression Header Protocol.  */
73         IPPROTO_SCTP = 132, /* Stream Control Transmission Protocol.  */
74         IPPROTO_RAW = 255, /* Raw IP packets.  */
75         IPPROTO_MAX +/
76       }
77     enum
78     {
79         AF_UNSPEC = 0 ,
80         AF_UNIX = 1 ,
81         AF_INET = 2 ,
82         AF_IPX = 4 ,
83         AF_APPLETALK = 5 ,
84         AF_INET6 = 10 ,
85     }
86     enum : uint
87     {
88         SCM_RIGHTS = 0x01
89     }
90     enum
91     {
92         SOMAXCONN       = 128,
93     }
94     enum : uint
95     {
96         MSG_CTRUNC      = 0x08,
97         MSG_DONTROUTE   = 0x04,
98         MSG_EOR         = 0x80,
99         MSG_OOB         = 0x01,
100         MSG_PEEK        = 0x02,
101         MSG_TRUNC       = 0x20,
102         MSG_WAITALL     = 0x100
103     }
104     /* The following constants should be used for the second parameter of
105        `shutdown'.  */
106     enum
107     {
108       SHUT_RD = 0, /* No more receptions.  */
109       SHUT_WR, /* No more transmissions.  */
110       SHUT_RDWR /* No more receptions or transmissions.  */
111     }
112                                 
113 enum: int
114 {
115         AI_PASSIVE      = 0x0001,       /// Socket address is intended for `bind`
116         AI_CANONNAME =  0x0002, /// Request for canonical name.
117         AI_NUMERICHOST = 0x0004,        /// Don't use name resolution.
118         AI_V4MAPPED = 0x0008,   /// IPv4 mapped addresses are acceptable.
119         AI_ALL = 0x0010,        /// Return IPv4 mapped and IPv6 addresses.
120         AI_ADDRCONFIG = 0x0020, /// Use configuration of this host to choose returned address type.
121         AI_NUMERICSERV = 0x0400,        /// Don't use name resolution.  
122         AI_MASK = (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | AI_ADDRCONFIG),
123         AI_DEFAULT = (AI_V4MAPPED | AI_ADDRCONFIG),
124 }
125 
126 enum
127 {
128         EAI_BADFLAGS = -1,      /// Invalid value for `ai_flags` field.
129         EAI_NONAME = -2,        /// NAME or SERVICE is unknown.
130         EAI_AGAIN = -3, /// Temporary failure in name resolution.
131         EAI_FAIL = -4,  /// Non-recoverable failure in name res.
132         EAI_NODATA = -5,        /// No address associated with NAME.
133         EAI_FAMILY = -6,        /// `ai_family` not supported.
134         EAI_SOCKTYPE = -7,      /// `ai_socktype` not supported.
135         EAI_SERVICE = -8,       /// SERVICE not supported for `ai_socktype`.
136         EAI_MEMORY = -10,       /// Memory allocation failure.
137 }       
138 
139 enum
140 {
141         NI_MAXHOST = 1025,
142         NI_MAXSERV = 32,
143         NI_NUMERICHOST = 1,     /// Don't try to look up hostname.
144         NI_NUMERICSERV = 2,     /// Don't convert port number to name.
145         NI_NOFQDN = 4,  /// Only return nodename portion.
146         NI_NAMEREQD = 8,        /// Don't return numeric addresses.
147         NI_DGRAM = 16,  /// Look up UDP service rather than TCP.
148 }       
149 
150         
151     // non cross platform.
152     /+
153         /* Bits in the FLAGS argument to `send', `recv', et al.  */
154         enum :uint
155           {
156             MSG_PROXY = 0x10, /* Supply or ask second address.  */
157             MSG_DONTWAIT = 0x40, /* Nonblocking IO.  */
158             MSG_WAITALL = 0x100, /* Wait for a full request.  */
159             MSG_FIN = 0x200,
160             MSG_SYN = 0x400,
161             MSG_CONFIRM = 0x800, /* Confirm path validity.  */
162             MSG_RST = 0x1000,
163             MSG_ERRQUEUE = 0x2000, /* Fetch message from error queue.  */
164             MSG_NOSIGNAL = 0x4000, /* Do not generate SIGPIPE.  */
165             MSG_MORE = 0x8000, /* Sender will send more.  */
166             MSG_CMSG_CLOEXEC = 0x40000000 /* Set close_on_exit for file
167                                                    descriptor received through
168                                                    SCM_RIGHTS.  */
169           }
170     /* Standard well-known ports.  */
171     enum
172       {
173         IPPORT_ECHO = 7, /* Echo service.  */
174         IPPORT_DISCARD = 9, /* Discard transmissions service.  */
175         IPPORT_SYSTAT = 11, /* System status service.  */
176         IPPORT_DAYTIME = 13, /* Time of day service.  */
177         IPPORT_NETSTAT = 15, /* Network status service.  */
178         IPPORT_FTP = 21, /* File Transfer Protocol.  */
179         IPPORT_TELNET = 23, /* Telnet protocol.  */
180         IPPORT_SMTP = 25, /* Simple Mail Transfer Protocol.  */
181         IPPORT_TIMESERVER = 37, /* Timeserver service.  */
182         IPPORT_NAMESERVER = 42, /* Domain Name Service.  */
183         IPPORT_WHOIS = 43, /* Internet Whois service.  */
184         IPPORT_MTP = 57,
185         IPPORT_TFTP = 69, /* Trivial File Transfer Protocol.  */
186         IPPORT_RJE = 77,
187         IPPORT_FINGER = 79, /* Finger service.  */
188         IPPORT_TTYLINK = 87,
189         IPPORT_SUPDUP = 95, /* SUPDUP protocol.  */
190         IPPORT_EXECSERVER = 512, /* execd service.  */
191         IPPORT_LOGINSERVER = 513, /* rlogind service.  */
192         IPPORT_CMDSERVER = 514,
193         IPPORT_EFSSERVER = 520,
194         /* UDP ports.  */
195         IPPORT_BIFFUDP = 512,
196         IPPORT_WHOSERVER = 513,
197         IPPORT_ROUTESERVER = 520,
198         /* Ports less than this value are reserved for privileged processes.  */
199         IPPORT_RESERVED = 1024,
200         /* Ports greater this value are reserved for (non-privileged) servers.  */
201         IPPORT_USERRESERVED = 5000
202       }
203     enum
204     {
205       TCP_ESTABLISHED = 1,
206       TCP_SYN_SENT,
207       TCP_SYN_RECV,
208       TCP_FIN_WAIT1,
209       TCP_FIN_WAIT2,
210       TCP_TIME_WAIT,
211       TCP_CLOSE,
212       TCP_CLOSE_WAIT,
213       TCP_LAST_ACK,
214       TCP_LISTEN,
215       TCP_CLOSING /* now a valid state */
216     } +/