|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  * Copyright (C) Nginx, Inc. | 
 |  */ | 
 |  | 
 |  | 
 | #ifndef _NGX_SOCKET_H_INCLUDED_ | 
 | #define _NGX_SOCKET_H_INCLUDED_ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 |  | 
 |  | 
 | #define NGX_WRITE_SHUTDOWN SD_SEND | 
 |  | 
 |  | 
 | typedef SOCKET  ngx_socket_t; | 
 | typedef int     socklen_t; | 
 |  | 
 |  | 
 | #define ngx_socket(af, type, proto)                                          \ | 
 |     WSASocket(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED) | 
 |  | 
 | #define ngx_socket_n        "WSASocket()" | 
 |  | 
 | int ngx_nonblocking(ngx_socket_t s); | 
 | int ngx_blocking(ngx_socket_t s); | 
 |  | 
 | #define ngx_nonblocking_n   "ioctlsocket(FIONBIO)" | 
 | #define ngx_blocking_n      "ioctlsocket(!FIONBIO)" | 
 |  | 
 | #define ngx_shutdown_socket    shutdown | 
 | #define ngx_shutdown_socket_n  "shutdown()" | 
 |  | 
 | #define ngx_close_socket    closesocket | 
 | #define ngx_close_socket_n  "closesocket()" | 
 |  | 
 |  | 
 | #ifndef WSAID_ACCEPTEX | 
 |  | 
 | typedef BOOL (PASCAL FAR * LPFN_ACCEPTEX)( | 
 |     IN SOCKET sListenSocket, | 
 |     IN SOCKET sAcceptSocket, | 
 |     IN PVOID lpOutputBuffer, | 
 |     IN DWORD dwReceiveDataLength, | 
 |     IN DWORD dwLocalAddressLength, | 
 |     IN DWORD dwRemoteAddressLength, | 
 |     OUT LPDWORD lpdwBytesReceived, | 
 |     IN LPOVERLAPPED lpOverlapped | 
 |     ); | 
 |  | 
 | #define WSAID_ACCEPTEX                                                       \ | 
 |     {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #ifndef WSAID_GETACCEPTEXSOCKADDRS | 
 |  | 
 | typedef VOID (PASCAL FAR * LPFN_GETACCEPTEXSOCKADDRS)( | 
 |     IN PVOID lpOutputBuffer, | 
 |     IN DWORD dwReceiveDataLength, | 
 |     IN DWORD dwLocalAddressLength, | 
 |     IN DWORD dwRemoteAddressLength, | 
 |     OUT struct sockaddr **LocalSockaddr, | 
 |     OUT LPINT LocalSockaddrLength, | 
 |     OUT struct sockaddr **RemoteSockaddr, | 
 |     OUT LPINT RemoteSockaddrLength | 
 |     ); | 
 |  | 
 | #define WSAID_GETACCEPTEXSOCKADDRS                                           \ | 
 |         {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #ifndef WSAID_TRANSMITFILE | 
 |  | 
 | #ifndef TF_DISCONNECT | 
 |  | 
 | #define TF_DISCONNECT           1 | 
 | #define TF_REUSE_SOCKET         2 | 
 | #define TF_WRITE_BEHIND         4 | 
 | #define TF_USE_DEFAULT_WORKER   0 | 
 | #define TF_USE_SYSTEM_THREAD    16 | 
 | #define TF_USE_KERNEL_APC       32 | 
 |  | 
 | typedef struct _TRANSMIT_FILE_BUFFERS { | 
 |     LPVOID Head; | 
 |     DWORD HeadLength; | 
 |     LPVOID Tail; | 
 |     DWORD TailLength; | 
 | } TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS; | 
 |  | 
 | #endif | 
 |  | 
 | typedef BOOL (PASCAL FAR * LPFN_TRANSMITFILE)( | 
 |     IN SOCKET hSocket, | 
 |     IN HANDLE hFile, | 
 |     IN DWORD nNumberOfBytesToWrite, | 
 |     IN DWORD nNumberOfBytesPerSend, | 
 |     IN LPOVERLAPPED lpOverlapped, | 
 |     IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, | 
 |     IN DWORD dwReserved | 
 |     ); | 
 |  | 
 | #define WSAID_TRANSMITFILE                                                   \ | 
 |     {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #ifndef WSAID_TRANSMITPACKETS | 
 |  | 
 | /* OpenWatcom has a swapped TP_ELEMENT_FILE and TP_ELEMENT_MEMORY definition */ | 
 |  | 
 | #ifndef TP_ELEMENT_FILE | 
 |  | 
 | #ifdef _MSC_VER | 
 | #pragma warning(disable:4201) /* Nonstandard extension, nameless struct/union */ | 
 | #endif | 
 |  | 
 | typedef struct _TRANSMIT_PACKETS_ELEMENT { | 
 |     ULONG dwElFlags; | 
 | #define TP_ELEMENT_MEMORY   1 | 
 | #define TP_ELEMENT_FILE     2 | 
 | #define TP_ELEMENT_EOP      4 | 
 |     ULONG cLength; | 
 |     union { | 
 |         struct { | 
 |             LARGE_INTEGER nFileOffset; | 
 |             HANDLE        hFile; | 
 |         }; | 
 |         PVOID             pBuffer; | 
 |     }; | 
 | } TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT, | 
 |     FAR *LPTRANSMIT_PACKETS_ELEMENT; | 
 |  | 
 | #ifdef _MSC_VER | 
 | #pragma warning(default:4201) | 
 | #endif | 
 |  | 
 | #endif | 
 |  | 
 | typedef BOOL (PASCAL FAR * LPFN_TRANSMITPACKETS) ( | 
 |     SOCKET hSocket, | 
 |     TRANSMIT_PACKETS_ELEMENT *lpPacketArray, | 
 |     DWORD nElementCount, | 
 |     DWORD nSendSize, | 
 |     LPOVERLAPPED lpOverlapped, | 
 |     DWORD dwFlags | 
 |     ); | 
 |  | 
 | #define WSAID_TRANSMITPACKETS                                                \ | 
 |     {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}} | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #ifndef WSAID_CONNECTEX | 
 |  | 
 | typedef BOOL (PASCAL FAR * LPFN_CONNECTEX) ( | 
 |     IN SOCKET s, | 
 |     IN const struct sockaddr FAR *name, | 
 |     IN int namelen, | 
 |     IN PVOID lpSendBuffer OPTIONAL, | 
 |     IN DWORD dwSendDataLength, | 
 |     OUT LPDWORD lpdwBytesSent, | 
 |     IN LPOVERLAPPED lpOverlapped | 
 |     ); | 
 |  | 
 | #define WSAID_CONNECTEX \ | 
 |     {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}} | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #ifndef WSAID_DISCONNECTEX | 
 |  | 
 | typedef BOOL (PASCAL FAR * LPFN_DISCONNECTEX) ( | 
 |     IN SOCKET s, | 
 |     IN LPOVERLAPPED lpOverlapped, | 
 |     IN DWORD  dwFlags, | 
 |     IN DWORD  dwReserved | 
 |     ); | 
 |  | 
 | #define WSAID_DISCONNECTEX                                                   \ | 
 |     {0x7fda2e11,0x8630,0x436f,{0xa0,0x31,0xf5,0x36,0xa6,0xee,0xc1,0x57}} | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | extern LPFN_ACCEPTEX              ngx_acceptex; | 
 | extern LPFN_GETACCEPTEXSOCKADDRS  ngx_getacceptexsockaddrs; | 
 | extern LPFN_TRANSMITFILE          ngx_transmitfile; | 
 | extern LPFN_TRANSMITPACKETS       ngx_transmitpackets; | 
 | extern LPFN_CONNECTEX             ngx_connectex; | 
 | extern LPFN_DISCONNECTEX          ngx_disconnectex; | 
 |  | 
 |  | 
 | int ngx_tcp_push(ngx_socket_t s); | 
 | #define ngx_tcp_push_n            "tcp_push()" | 
 |  | 
 |  | 
 | #endif /* _NGX_SOCKET_H_INCLUDED_ */ |