1 /**
2  * \file
3  *
4  * Copyright 2016 Microsoft
5  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
6  */
7 #ifndef __MONO_METADATA_W32SOCKET_INTERNALS_H__
8 #define __MONO_METADATA_W32SOCKET_INTERNALS_H__
9 
10 #include <config.h>
11 #include <glib.h>
12 
13 #ifdef HAVE_SYS_TIME_H
14 #include <sys/time.h>
15 #endif
16 #ifdef HAVE_SYS_SOCKET_H
17 #include <sys/socket.h>
18 #endif
19 
20 #include <mono/utils/w32api.h>
21 
22 #ifndef HAVE_SOCKLEN_T
23 #define socklen_t int
24 #endif
25 
26 #ifndef HOST_WIN32
27 
28 #define TF_DISCONNECT 0x01
29 #define TF_REUSE_SOCKET 0x02
30 
31 typedef struct {
32 	gpointer Head;
33 	guint32 HeadLength;
34 	gpointer Tail;
35 	guint32 TailLength;
36 } TRANSMIT_FILE_BUFFERS, *LPTRANSMIT_FILE_BUFFERS;
37 
38 typedef struct {
39 	guint32 Data1;
40 	guint16 Data2;
41 	guint16 Data3;
42 	guint8 Data4[8];
43 } GUID;
44 
45 typedef struct {
46 	guint32 Internal;
47 	guint32 InternalHigh;
48 	guint32 Offset;
49 	guint32 OffsetHigh;
50 	gpointer hEvent;
51 	gpointer handle1;
52 	gpointer handle2;
53 } OVERLAPPED;
54 
55 #endif
56 
57 void
58 mono_w32socket_initialize (void);
59 
60 void
61 mono_w32socket_cleanup (void);
62 
63 SOCKET
64 mono_w32socket_accept (SOCKET s, struct sockaddr *addr, socklen_t *addrlen, gboolean blocking);
65 
66 int
67 mono_w32socket_connect (SOCKET s, const struct sockaddr *name, int namelen, gboolean blocking);
68 
69 int
70 mono_w32socket_recv (SOCKET s, char *buf, int len, int flags, gboolean blocking);
71 
72 int
73 mono_w32socket_recvfrom (SOCKET s, char *buf, int len, int flags, struct sockaddr *from, socklen_t *fromlen, gboolean blocking);
74 
75 int
76 mono_w32socket_recvbuffers (SOCKET s, LPWSABUF lpBuffers, guint32 dwBufferCount, guint32 *lpNumberOfBytesRecvd, guint32 *lpFlags, gpointer lpOverlapped, gpointer lpCompletionRoutine, gboolean blocking);
77 
78 int
79 mono_w32socket_send (SOCKET s, char *buf, int len, int flags, gboolean blocking);
80 
81 int
82 mono_w32socket_sendto (SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen, gboolean blocking);
83 
84 int
85 mono_w32socket_sendbuffers (SOCKET s, LPWSABUF lpBuffers, guint32 dwBufferCount, guint32 *lpNumberOfBytesRecvd, guint32 lpFlags, gpointer lpOverlapped, gpointer lpCompletionRoutine, gboolean blocking);
86 
87 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT | HAVE_UWP_WINAPI_SUPPORT)
88 
89 BOOL
90 mono_w32socket_transmit_file (SOCKET hSocket, gpointer hFile, LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, guint32 dwReserved, gboolean blocking);
91 
92 #endif
93 
94 #ifndef HOST_WIN32
95 
96 SOCKET
97 mono_w32socket_socket (int domain, int type, int protocol);
98 
99 gint
100 mono_w32socket_bind (SOCKET sock, struct sockaddr *addr, socklen_t addrlen);
101 
102 gint
103 mono_w32socket_getpeername (SOCKET sock, struct sockaddr *name, socklen_t *namelen);
104 
105 gint
106 mono_w32socket_getsockname (SOCKET sock, struct sockaddr *name, socklen_t *namelen);
107 
108 gint
109 mono_w32socket_getsockopt (SOCKET sock, gint level, gint optname, gpointer optval, socklen_t *optlen);
110 
111 gint
112 mono_w32socket_setsockopt (SOCKET sock, gint level, gint optname, const gpointer optval, socklen_t optlen);
113 
114 gint
115 mono_w32socket_listen (SOCKET sock, gint backlog);
116 
117 gint
118 mono_w32socket_shutdown (SOCKET sock, gint how);
119 
120 gint
121 mono_w32socket_ioctl (SOCKET sock, gint32 command, gchar *input, gint inputlen, gchar *output, gint outputlen, glong *written);
122 
123 gboolean
124 mono_w32socket_close (SOCKET sock);
125 
126 #endif /* HOST_WIN32 */
127 
128 gint
129 mono_w32socket_disconnect (SOCKET sock, gboolean reuse);
130 
131 gint
132 mono_w32socket_set_blocking (SOCKET socket, gboolean blocking);
133 
134 gint
135 mono_w32socket_get_available (SOCKET socket, guint64 *amount);
136 
137 void
138 mono_w32socket_set_last_error (gint32 error);
139 
140 gint32
141 mono_w32socket_get_last_error (void);
142 
143 gint32
144 mono_w32socket_convert_error (gint error);
145 
146 gboolean
147 mono_w32socket_duplicate (gpointer handle, gint32 targetProcessId, gpointer *duplicate_handle);
148 
149 #endif // __MONO_METADATA_W32SOCKET_INTERNALS_H__
150