| |
| /* |
| * 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) \ |
| WSASocketW(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED) |
| |
| #define ngx_socket_n "WSASocketW()" |
| |
| 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)" |
| |
| int ngx_socket_nread(ngx_socket_t s, int *n); |
| #define ngx_socket_nread_n "ioctlsocket(FIONREAD)" |
| |
| #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; |
| |
| |
| #if (NGX_HAVE_POLL && !defined POLLIN) |
| |
| /* |
| * WSAPoll() is only available if _WIN32_WINNT >= 0x0600. |
| * If it is not available during compilation, we try to |
| * load it dynamically at runtime. |
| */ |
| |
| #define NGX_LOAD_WSAPOLL 1 |
| |
| #define POLLRDNORM 0x0100 |
| #define POLLRDBAND 0x0200 |
| #define POLLIN (POLLRDNORM | POLLRDBAND) |
| #define POLLPRI 0x0400 |
| |
| #define POLLWRNORM 0x0010 |
| #define POLLOUT (POLLWRNORM) |
| #define POLLWRBAND 0x0020 |
| |
| #define POLLERR 0x0001 |
| #define POLLHUP 0x0002 |
| #define POLLNVAL 0x0004 |
| |
| typedef struct pollfd { |
| |
| SOCKET fd; |
| SHORT events; |
| SHORT revents; |
| |
| } WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD; |
| |
| typedef int (WSAAPI *ngx_wsapoll_pt)( |
| LPWSAPOLLFD fdArray, |
| ULONG fds, |
| INT timeout |
| ); |
| |
| extern ngx_wsapoll_pt WSAPoll; |
| extern ngx_uint_t ngx_have_wsapoll; |
| |
| #endif |
| |
| |
| int ngx_tcp_push(ngx_socket_t s); |
| #define ngx_tcp_push_n "tcp_push()" |
| |
| |
| #endif /* _NGX_SOCKET_H_INCLUDED_ */ |