summaryrefslogtreecommitdiff
path: root/libphobos/libdruntime/core/sys/windows/mswsock.d
blob: d8beee421a1ed97e88791196c1a3d389b85ec674 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/**
 * Windows API header module
 *
 * Translated from MinGW Windows headers
 *
 * Authors: Daniel Keep
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
 * Source: $(DRUNTIMESRC core/sys/windows/_mswsock.d)
 */
module core.sys.windows.mswsock;
version (Windows):

import core.sys.windows.winbase, core.sys.windows.windef;
import core.sys.windows.basetyps, core.sys.windows.w32api;

import core.sys.windows.winsock2;

//static if (_WIN32_WINNT >= 0x500) {
    enum {
        /* WinNT5+:
           ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
        SO_MAXDG             = 0x7009,
        SO_MAXPATHDG         = 0x700A,
    }
//}

enum {
    /* WinNT4+:
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options_for_windows_nt_4_0_2.htm */
    SO_CONNDATA              = 0x7000,
    SO_CONNOPT               = 0x7001,
    SO_DISCDATA              = 0x7002,
    SO_DISCOPT               = 0x7003,
    SO_CONNDATALEN           = 0x7004,
    SO_CONNOPTLEN            = 0x7005,
    SO_DISCDATALEN           = 0x7006,
    SO_DISCOPTLEN            = 0x7007,

    /* WinNT4:
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
    SO_UPDATE_ACCEPT_CONTENT = 0x700B,
}

enum {
    /* Win95+, WinNT4+ but apparently shouldn't used: mark as deprecated?
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
    SO_OPENTYPE                  = 0x7008,

    /* Win95+; these two are passed to the SO_OPENTYPE option as arguments,
       so would they be deprecated as well?
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
    SO_SYNCHRONOUS_ALERT         = 0x0010,
    SO_SYNCHRONOUS_NONALERT      = 0x0020,

    /* Win95:
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
    SO_CONNECT_TIME              = 0x700C,
}


enum {
    TCP_BSDURGENT = 0x7000,
}

/* These *appear* to be constants for passing to the TransmitFile /
   TransmitPackets functions, which are available in WinNT3.51+
   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
enum {
    TF_DISCONNECT         = 1,
    TF_REUSE_SOCKET       = 2,
    TF_WRITE_BEHIND       = 4,
    TF_USE_DEFAULT_WORKER = 0,
    TF_USE_SYSTEM_THREAD  = 16,
    TF_USE_KERNEL_APC     = 32
}

/* Win95+, WinNT3.51+
   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_file_buffers_2.htm */
struct TRANSMIT_FILE_BUFFERS {
    PVOID Head;
    DWORD HeadLength;
    PVOID Tail;
    DWORD TailLength;
}
alias TRANSMIT_FILE_BUFFERS* PTRANSMIT_FILE_BUFFERS, LPTRANSMIT_FILE_BUFFERS;

extern(Windows) {
    /* Win95+, WinNT3.51+
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvex_2.htm */
    int WSARecvEx(SOCKET, char*, int, int*);

    /* Win95+, WinNT3.51+
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/getacceptexSOCKADDRs_2.htm */
    VOID GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, SOCKADDR**, LPINT, SOCKADDR**, LPINT);

    /* WinNT3.51+
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
    BOOL TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD);

    /* WinNT3.51+
       ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/acceptex_2.htm */
    alias BOOL function(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED) LPFN_ACCEPTEX;
    const GUID WSAID_ACCEPTEX = {0xb5367df1,0xcbac,0x11cf,[0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]};

    alias BOOL function(SOCKET, SOCKADDR*, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED) LPFN_CONNECTEX;
    const GUID WSAID_CONNECTEX = {0x25a207b9,0xddf3,0x4660,[0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]};
}

static if (_WIN32_WINNT >= 0x501) {
    /*  These appear to be constants for the TRANSMIT_PACKETS_ELEMENT
     *  structure below, so I've given them the same minimum version
     */
    enum {
        TP_ELEMENT_FILE   = 1,
        TP_ELEMENT_MEMORY = 2,
        TP_ELEMENT_EOP    = 4
    }

    /*  WinXP+, Srv2k3+
     *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_packets_element_2.htm
     */
    struct TRANSMIT_PACKETS_ELEMENT {
        ULONG dwElFlags;
        ULONG cLength;
        union {
            struct {
                LARGE_INTEGER nFileOffset;
                HANDLE        hFile;
            }
            PVOID pBuffer;
        }
    }

    struct WSABUF {
        ULONG len;
        CHAR* buf;
    }

    alias WSABUF* LPWSABUF;

    /*  WinXP+, Server2003+:
     *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsamsg_2.htm
     */
    struct WSAMSG {
        LPSOCKADDR name;
        INT        namelen;
        LPWSABUF   lpBuffers;
        DWORD      dwBufferCount;
        WSABUF     Control;
        DWORD      dwFlags;
    }

    alias WSAMSG* PWSAMSG, LPWSAMSG;

    /* According to MSDN docs, the WSAMSG.Control buffer starts with a
       cmsghdr header of the following form.  See also RFC 2292. */
    /* DK: Confirmed.  So I suppose these should get the same version as
       WSAMSG... */
    struct WSACMSGHDR {
        SIZE_T cmsg_len;
        INT  cmsg_level;
        INT  cmsg_type;
        // followed by UCHAR cmsg_data[];
    }
}

static if (_WIN32_WINNT >= 0x600) {
    /* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */
    /* DK: MinGW doesn't define these, and neither does the MSDN docs.  Might have
       to actually look up RFC 2292... */
    /+
    #if 0
    #define WSA_CMSG_FIRSTHDR(mhdr)
    #define WSA_CMSG_NXTHDR(mhdr, cmsg)
    #define WSA_CMSG_SPACE(length)
    #define WSA_CMSG_LEN(length)
    #endif
    +/

    /*  Win Vista+, Srv2k3+
     *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/disconnectex_2.htm
     */
    extern(Windows) BOOL DisconnectEx(SOCKET, LPOVERLAPPED, DWORD, DWORD);
}

static if (_WIN32_WINNT >= 0x501) {
    /*  WinXP+, Srv2k3+
     *  ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvmsg_2.htm
     */
    extern(Windows) int WSARecvMsg(SOCKET, LPWSAMSG, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
}