[io-layer] Extract socket (#4241)
[mono.git] / mono / metadata / w32socket.h
1 /*
2  * w32socket.h: System.Net.Sockets.Socket support
3  *
4  * Author:
5  *      Dick Porter (dick@ximian.com)
6  *
7  * (C) 2001 Ximian, Inc.
8  */
9
10 #ifndef _MONO_METADATA_W32SOCKET_H_
11 #define _MONO_METADATA_W32SOCKET_H_
12
13 #include <config.h>
14 #include <glib.h>
15
16 #include <mono/metadata/object-internals.h>
17
18 #define INVALID_SOCKET ((SOCKET)(guint32)(~0))
19 #define SOCKET_ERROR (-1)
20
21 #ifndef HOST_WIN32
22 typedef gint SOCKET;
23 #endif
24
25 /* This is a copy of System.Net.Sockets.SocketType */
26 typedef enum {
27         SocketType_Stream=1,
28         SocketType_Dgram=2,
29         SocketType_Raw=3,
30         SocketType_Rdm=4,
31         SocketType_Seqpacket=5,
32         SocketType_Unknown=-1
33 } MonoSocketType;
34
35 /* This is a copy of System.Net.Sockets.AddressFamily */
36 typedef enum {
37         AddressFamily_Unknown=-1,
38         AddressFamily_Unspecified=0,
39         AddressFamily_Unix=1,
40         AddressFamily_InterNetwork=2,
41         AddressFamily_ImpLink=3,
42         AddressFamily_Pup=4,
43         AddressFamily_Chaos=5,
44         AddressFamily_NS=6,
45         AddressFamily_Ipx=6,
46         AddressFamily_Iso=7,
47         AddressFamily_Osi=7,
48         AddressFamily_Ecma=8,
49         AddressFamily_DataKit=9,
50         AddressFamily_Ccitt=10,
51         AddressFamily_Sna=11,
52         AddressFamily_DecNet=12,
53         AddressFamily_DataLink=13,
54         AddressFamily_Lat=14,
55         AddressFamily_HyperChannel=15,
56         AddressFamily_AppleTalk=16,
57         AddressFamily_NetBios=17,
58         AddressFamily_VoiceView=18,
59         AddressFamily_FireFox=19,
60         AddressFamily_Banyan=21,
61         AddressFamily_Atm=22,
62         AddressFamily_InterNetworkV6=23,
63         AddressFamily_Cluster=24,
64         AddressFamily_Ieee12844=25,
65         AddressFamily_Irda=26,
66         AddressFamily_NetworkDesigners=28
67 } MonoAddressFamily;
68
69 /* This is a copy of System.Net.Sockets.ProtocolType */
70 typedef enum {
71         ProtocolType_IP=0,
72         ProtocolType_Icmp=1,
73         ProtocolType_Igmp=2,
74         ProtocolType_Ggp=3,
75         ProtocolType_Tcp=6,
76         ProtocolType_Pup=12,
77         ProtocolType_Udp=17,
78         ProtocolType_Idp=22,
79         ProtocolType_IPv6=41,
80         ProtocolType_ND=77,
81         ProtocolType_Raw=255,
82         ProtocolType_Unspecified=0,
83         ProtocolType_Ipx=1000,
84         ProtocolType_Spx=1256,
85         ProtocolType_SpxII=1257,
86         ProtocolType_Unknown=-1
87 } MonoProtocolType;
88
89 /* This is a copy of System.Net.Sockets.SocketOptionLevel */
90 typedef enum {
91         SocketOptionLevel_Socket=65535,
92         SocketOptionLevel_IP=0,
93         SocketOptionLevel_IPv6=41,
94         SocketOptionLevel_Tcp=6,
95         SocketOptionLevel_Udp=17
96 } MonoSocketOptionLevel;
97
98 /* This is a copy of System.Net.Sockets.SocketOptionName */
99 typedef enum {
100         SocketOptionName_Debug=1,
101         SocketOptionName_AcceptConnection=2,
102         SocketOptionName_ReuseAddress=4,
103         SocketOptionName_KeepAlive=8,
104         SocketOptionName_DontRoute=16,
105         SocketOptionName_IPProtectionLevel = 23,
106         SocketOptionName_IPv6Only = 27,
107         SocketOptionName_Broadcast=32,
108         SocketOptionName_UseLoopback=64,
109         SocketOptionName_Linger=128,
110         SocketOptionName_OutOfBandInline=256,
111         SocketOptionName_DontLinger= -129,
112         SocketOptionName_ExclusiveAddressUse= -5,
113         SocketOptionName_SendBuffer= 4097,
114         SocketOptionName_ReceiveBuffer=4098,
115         SocketOptionName_SendLowWater=4099,
116         SocketOptionName_ReceiveLowWater=4100,
117         SocketOptionName_SendTimeout=4101,
118         SocketOptionName_ReceiveTimeout=4102,
119         SocketOptionName_Error=4103,
120         SocketOptionName_Type=4104,
121         SocketOptionName_MaxConnections=2147483647,
122         SocketOptionName_IPOptions=1,
123         SocketOptionName_HeaderIncluded=2,
124         SocketOptionName_TypeOfService=3,
125         SocketOptionName_IpTimeToLive=4,
126         SocketOptionName_MulticastInterface=9,
127         SocketOptionName_MulticastTimeToLive=10,
128         SocketOptionName_MulticastLoopback=11,
129         SocketOptionName_AddMembership=12,
130         SocketOptionName_DropMembership=13,
131         SocketOptionName_DontFragment=14,
132         SocketOptionName_AddSourceMembership=15,
133         SocketOptionName_DropSourceMembership=16,
134         SocketOptionName_BlockSource=17,
135         SocketOptionName_UnblockSource=18,
136         SocketOptionName_PacketInformation=19,
137         SocketOptionName_NoDelay=1,
138         SocketOptionName_BsdUrgent=2,
139         SocketOptionName_Expedited=2,
140         SocketOptionName_NoChecksum=1,
141         SocketOptionName_ChecksumCoverage=20,
142         SocketOptionName_HopLimit=21,
143
144         /* This is Mono-specific, keep it in sync with
145          * Mono.Posix/PeerCred.cs
146          */
147         SocketOptionName_PeerCred=10001
148 } MonoSocketOptionName;
149
150 /* This is a copy of System.Net.Sockets.SocketFlags */
151 typedef enum {
152         SocketFlags_None = 0x0000,
153         SocketFlags_OutOfBand = 0x0001,
154         SocketFlags_MaxIOVectorLength = 0x0010,
155         SocketFlags_Peek = 0x0002,
156         SocketFlags_DontRoute = 0x0004,
157         SocketFlags_Partial = 0x8000
158 } MonoSocketFlags;
159
160 typedef struct
161 {
162         MonoObject obj;
163         gint pid;
164         gint uid;
165         gint gid;
166 } MonoPeerCredData;
167
168 gpointer
169 ves_icall_System_Net_Sockets_Socket_Socket_internal (MonoObject *this_obj, gint32 family, gint32 type, gint32 proto,
170         gint32 *error);
171
172 void
173 ves_icall_System_Net_Sockets_Socket_Close_internal (gsize sock, gint32 *error);
174
175 gint32
176 ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal (void);
177
178 gint32
179 ves_icall_System_Net_Sockets_Socket_Available_internal (gsize sock, gint32 *error);
180
181 void
182 ves_icall_System_Net_Sockets_Socket_Blocking_internal (gsize sock, gboolean block, gint32 *error);
183
184 gpointer
185 ves_icall_System_Net_Sockets_Socket_Accept_internal (gsize sock, gint32 *error, gboolean blocking);
186
187 void
188 ves_icall_System_Net_Sockets_Socket_Listen_internal (gsize sock, guint32 backlog, gint32 *error);
189
190 MonoObject*
191 ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal (gsize sock, gint32 af, gint32 *error);
192
193 MonoObject*
194 ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal (gsize sock, gint32 af, gint32 *error);
195
196 void
197 ves_icall_System_Net_Sockets_Socket_Bind_internal (gsize sock, MonoObject *sockaddr, gint32 *error);
198
199 void
200 ves_icall_System_Net_Sockets_Socket_Connect_internal (gsize sock, MonoObject *sockaddr, gint32 *error, gboolean blocking);
201
202 gint32
203 ves_icall_System_Net_Sockets_Socket_Receive_internal (gsize sock, MonoArray *buffer, gint32 offset, gint32 count,
204         gint32 flags, gint32 *error, gboolean blocking);
205
206 gint32
207 ves_icall_System_Net_Sockets_Socket_Receive_array_internal (gsize sock, MonoArray *buffers, gint32 flags, gint32 *error,
208         gboolean blocking);
209
210 gint32
211 ves_icall_System_Net_Sockets_Socket_ReceiveFrom_internal (gsize sock, MonoArray *buffer, gint32 offset, gint32 count,
212         gint32 flags, MonoObject **sockaddr, gint32 *error, gboolean blocking);
213
214 gint32
215 ves_icall_System_Net_Sockets_Socket_Send_internal (gsize sock, MonoArray *buffer, gint32 offset, gint32 count,
216         gint32 flags, gint32 *error, gboolean blocking);
217
218 gint32
219 ves_icall_System_Net_Sockets_Socket_Send_array_internal (gsize sock, MonoArray *buffers, gint32 flags, gint32 *error,
220         gboolean blocking);
221
222 gint32
223 ves_icall_System_Net_Sockets_Socket_SendTo_internal (gsize sock, MonoArray *buffer, gint32 offset, gint32 count,
224         gint32 flags, MonoObject *sockaddr, gint32 *error, gboolean blocking);
225
226 void
227 ves_icall_System_Net_Sockets_Socket_Select_internal (MonoArray **sockets, gint32 timeout, gint32 *error);
228
229 void
230 ves_icall_System_Net_Sockets_Socket_Shutdown_internal (gsize sock, gint32 how, gint32 *error);
231
232 void
233 ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (gsize sock, gint32 level, gint32 name,
234         MonoObject **obj_val, gint32 *error);
235
236 void
237 ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal (gsize sock, gint32 level, gint32 name,
238         MonoArray **byte_val, gint32 *error);
239
240 void
241 ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (gsize sock, gint32 level, gint32 name,
242         MonoObject *obj_val, MonoArray *byte_val, gint32 int_val, gint32 *error);
243
244 int
245 ves_icall_System_Net_Sockets_Socket_IOControl_internal (gsize sock, gint32 code, MonoArray *input, MonoArray *output,
246         gint32 *error);
247
248 MonoBoolean
249 ves_icall_System_Net_Dns_GetHostByName_internal (MonoString *host, MonoString **h_name, MonoArray **h_aliases,
250         MonoArray **h_addr_list, gint32 hint);
251
252 MonoBoolean
253 ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **h_name, MonoArray **h_aliases,
254         MonoArray **h_addr_list, gint32 hint);
255
256 MonoBoolean
257 ves_icall_System_Net_Dns_GetHostName_internal (MonoString **h_name);
258
259 MonoBoolean
260 ves_icall_System_Net_Sockets_Socket_Poll_internal (gsize sock, gint mode, gint timeout, gint32 *error);
261
262 void
263 ves_icall_System_Net_Sockets_Socket_Disconnect_internal (gsize sock, MonoBoolean reuse, gint32 *error);
264
265 gboolean
266 ves_icall_System_Net_Sockets_Socket_SendFile_internal (gsize sock, MonoString *filename, MonoArray *pre_buffer,
267         MonoArray *post_buffer, gint flags, gint32 *error, gboolean blocking);
268
269 void
270 icall_cancel_blocking_socket_operation (MonoThread *thread);
271
272 gboolean
273 ves_icall_System_Net_Sockets_Socket_SupportPortReuse (MonoProtocolType proto);
274
275 void
276 mono_network_init(void);
277
278 void
279 mono_network_cleanup(void);
280
281 #endif /* _MONO_METADATA_W32SOCKET_H_ */