#ifndef _WAPI_SOCKETS_H_
#define _WAPI_SOCKETS_H_
-#include <config.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <netdb.h>
-#include <arpa/inet.h>
-
-#ifdef HAVE_SYS_FILIO_H
-#include <sys/filio.h> /* defines FIONBIO and FIONREAD */
-#endif
-#ifdef HAVE_SYS_SOCKIO_H
-#include <sys/sockio.h> /* defines SIOCATMARK */
-#endif
-
#include "mono/io-layer/wapi.h"
+G_BEGIN_DECLS
+
#define WSADESCRIPTION_LEN 256
#define WSASYS_STATUS_LEN 128
#define INVALID_SOCKET (guint32)(~0)
#define SOCKET_ERROR -1
+#define WSAID_DISCONNECTEX {0x7fda2e11,0x8630,0x436f,{0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
+#define WSAID_TRANSMITFILE {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
+
+typedef struct
+{
+ guint32 Data1;
+ guint16 Data2;
+ guint16 Data3;
+ guint8 Data4[8];
+} WapiGuid;
+
+typedef struct
+{
+ gpointer Head;
+ guint32 HeadLength;
+ gpointer Tail;
+ guint32 TailLength;
+} WapiTransmitFileBuffers;
+
+typedef enum {
+ TF_USE_DEFAULT_WORKER = 0,
+ TF_DISCONNECT = 0x01,
+ TF_REUSE_SOCKET = 0x02,
+ TF_WRITE_BEHIND = 0x04,
+ TF_USE_SYSTEM_THREAD = 0x10,
+ TF_USE_KERNEL_APC = 0x20
+} WapiTransmitFileFlags;
+
+typedef struct
+{
+ guint32 len;
+ gpointer buf;
+} WapiWSABuf;
+
+/* If we need to support more WSAIoctl commands then define these
+ * using the bitfield flags method
+ */
+#define SIO_GET_EXTENSION_FUNCTION_POINTER 0xC8000006
+#define SIO_KEEPALIVE_VALS 0x98000004
+
+typedef gboolean (*WapiDisconnectExFn)(guint32, WapiOverlapped *, guint32,
+ WapiTransmitFileFlags);
+typedef gboolean (*WapiTransmitFileFn)(guint32, gpointer, guint32, guint32,
+ WapiOverlapped *,
+ WapiTransmitFileBuffers *,
+ WapiTransmitFileFlags);
+
+
extern int WSAStartup(guint32 requested, WapiWSAData *data);
extern int WSACleanup(void);
extern void WSASetLastError(int error);
extern int WSAGetLastError(void);
extern int closesocket(guint32 handle);
-#ifndef _WAPI_BUILDING
-#define accept _wapi_accept
-#define bind _wapi_bind
-#define connect _wapi_connect
-#define getpeername _wapi_getpeername
-#define getsockname _wapi_getsockname
-#define getsockopt _wapi_getsockopt
-#define listen _wapi_listen
-#define recv _wapi_recv
-#define recvfrom _wapi_recvfrom
-#define send _wapi_send
-#define sendto _wapi_sendto
-#define setsockopt _wapi_setsockopt
-#define shutdown _wapi_shutdown
-#define socket _wapi_socket
-#define gethostbyname _wapi_gethostbyname
-#define select _wapi_select
-
-#ifdef FD_CLR
-#undef FD_CLR
-#endif
-
-#ifdef FD_ISSET
-#undef FD_ISSET
-#endif
-
-#ifdef FD_SET
-#undef FD_SET
-#endif
-
-/* No need to wrap FD_ZERO because it doesnt involve file
- * descriptors
-*/
-#define FD_CLR _wapi_FD_CLR
-#define FD_ISSET _wapi_FD_ISSET
-#define FD_SET _wapi_FD_SET
-
-#endif /* _WAPI_BUILDING */
-
-extern guint32 _wapi_accept(guint32 handle, struct sockaddr *addr,
- socklen_t *addrlen);
-extern int _wapi_bind(guint32 handle, struct sockaddr *my_addr,
- socklen_t addrlen);
-extern int _wapi_connect(guint32 handle, const struct sockaddr *serv_addr,
- socklen_t addrlen);
-extern int _wapi_getpeername(guint32 handle, struct sockaddr *name,
- socklen_t *namelen);
-extern int _wapi_getsockname(guint32 handle, struct sockaddr *name,
- socklen_t *namelen);
-extern int _wapi_getsockopt(guint32 handle, int level, int optname,
- void *optval, socklen_t *optlen);
-extern int _wapi_listen(guint32 handle, int backlog);
-extern int _wapi_recv(guint32 handle, void *buf, size_t len, int recv_flags);
-extern int _wapi_recvfrom(guint32 handle, void *buf, size_t len,
- int recv_flags, struct sockaddr *from,
- socklen_t *fromlen);
-extern int _wapi_send(guint32 handle, const void *msg, size_t len,
- int send_flags);
-extern int _wapi_sendto(guint32 handle, const void *msg, size_t len,
- int send_flags, const struct sockaddr *to,
- socklen_t tolen);
-extern int _wapi_setsockopt(guint32 handle, int level, int optname,
- const void *optval, socklen_t optlen);
-extern int _wapi_shutdown(guint32 handle, int how);
-extern guint32 _wapi_socket(int domain, int type, int protocol);;
-extern struct hostent *_wapi_gethostbyname(const char *hostname);
-extern int _wapi_select(int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, struct timeval *timeout);
-extern void _wapi_FD_CLR(guint32 handle, fd_set *set);
-extern int _wapi_FD_ISSET(guint32 handle, fd_set *set);
-extern void _wapi_FD_SET(guint32 handle, fd_set *set);
-
extern int ioctlsocket(guint32 handle, gint32 command, gpointer arg);
-
+extern int WSAIoctl (guint32 handle, gint32 command,
+ gchar *input, gint i_len,
+ gchar *output, gint o_len, glong *written,
+ void *unused1, void *unused2);
+extern int WSARecv (guint32 handle, WapiWSABuf *buffers, guint32 count,
+ guint32 *received, guint32 *flags,
+ WapiOverlapped *overlapped, WapiOverlappedCB *complete);
+extern int WSASend (guint32 handle, WapiWSABuf *buffers, guint32 count,
+ guint32 *sent, guint32 flags,
+ WapiOverlapped *overlapped, WapiOverlappedCB *complete);
+
+gboolean TransmitFile (guint32 socket, gpointer file, guint32 bytes_to_write, guint32 bytes_per_send, WapiOverlapped *ol,
+ WapiTransmitFileBuffers *tb, guint32 flags);
+G_END_DECLS
#endif /* _WAPI_SOCKETS_H_ */