diff options
Diffstat (limited to 'src/os/win32')
| -rw-r--r-- | src/os/win32/ngx_sendfile.c | 70 | ||||
| -rw-r--r-- | src/os/win32/ngx_socket.c | 64 | ||||
| -rw-r--r-- | src/os/win32/ngx_socket.h | 9 |
3 files changed, 127 insertions, 16 deletions
diff --git a/src/os/win32/ngx_sendfile.c b/src/os/win32/ngx_sendfile.c index 560f50f7b..ce43b37b3 100644 --- a/src/os/win32/ngx_sendfile.c +++ b/src/os/win32/ngx_sendfile.c @@ -6,6 +6,7 @@ #include <ngx_socket.h> #include <ngx_errno.h> #include <ngx_log.h> +#include <ngx_connection.h> #include <ngx_sendv.h> #include <ngx_sendfile.h> @@ -17,18 +18,51 @@ #if (HAVE_WIN32_TRANSMITFILE) -int ngx_sendfile(ngx_socket_t s, +int ngx_sendfile(ngx_connection_t *c, ngx_iovec_t *headers, int hdr_cnt, ngx_fd_t fd, off_t offset, size_t nbytes, ngx_iovec_t *trailers, int trl_cnt, - off_t *sent, - ngx_log_t *log) + off_t *sent, u_int flags) { int tfrc, rc; ngx_err_t tf_err, err; OVERLAPPED olp; TRANSMIT_FILE_BUFFERS tfb, *ptfb; +#if 0 + ev = c->write; + + if (ev->timedout) { + ngx_set_socket_errno(NGX_ETIMEDOUT); + ngx_log_error(NGX_LOG_ERR, ev->log, 0, "TransmitFile() timed out"); + + return NGX_ERROR; + } + + if (ev->ready) { + ev->ready = 0; + +#if (HAVE_IOCP_EVENT) /* iocp */ + + if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) { + if (ev->ovlp.error) { + ngx_log_error(NGX_LOG_ERR, ev->log, 0, "TransmitFile() failed"); + return NGX_ERROR; + } + + return ev->available; + } + } + +#endif + + /* TODO: WSAGetOverlappedResult stuff */ + + } + +#endif + + tf_err = 0; err = 0; @@ -49,40 +83,54 @@ int ngx_sendfile(ngx_socket_t s, ptfb = NULL; } +#if 0 + flags = TF_DISCONNECT|TF_REUSE_SOCKET; +#endif + + tfrc = TransmitFile(c->fd, fd, nbytes, 0, &olp, ptfb, flags); + +#if 0 #if 1 - tfrc = TransmitFile(s, fd, nbytes, 0, &olp, ptfb, 0); + tfrc = TransmitFile(c->fd, fd, nbytes, 0, &olp, ptfb, 0); #else - tfrc = TransmitFile(s, fd, nbytes, 0, NULL, ptfb, 0); + tfrc = TransmitFile(c->fd, fd, nbytes, 0, NULL, ptfb, 0); +#endif #endif - if (tfrc == 0) + if (tfrc == 0) { tf_err = ngx_socket_errno; + ngx_log_error(NGX_LOG_NOTICE, c->log, tf_err, + "ngx_sendfile: TransmitFile failed"); + if (tf_err == WSA_IO_PENDING) { + return NGX_AGAIN; + } + } /* set sent */ #if 0 - rc = WSAGetOverlappedResult(s, &olp, (unsigned long *) sent, 0, NULL); + rc = WSAGetOverlappedResult(c->fd, &olp, (unsigned long *) sent, 0, NULL); #else *sent = olp.InternalHigh; rc = 1; #endif - ngx_log_debug(log, "ngx_sendfile: %d, @%I64d %I64d:%d" _ + ngx_log_debug(c->log, "TransmitFile: %d, @%I64d %I64d:%d" _ tfrc _ offset _ *sent _ nbytes); if (rc == 0) { err = ngx_socket_errno; - ngx_log_error(NGX_LOG_ERR, log, err, + ngx_log_error(NGX_LOG_ERR, c->log, err, "ngx_sendfile: WSAGetOverlappedResult failed"); } if (tfrc == 0) { if (tf_err != NGX_EAGAIN) { - ngx_log_error(NGX_LOG_ERR, log, tf_err, + ngx_log_error(NGX_LOG_ERR, c->log, tf_err, "ngx_sendfile: TransmitFile failed"); return NGX_ERROR; } - ngx_log_error(NGX_LOG_INFO, log, tf_err, + ngx_log_error(NGX_LOG_INFO, c->log, tf_err, "ngx_sendfile: TransmitFile sent only %I64d bytes", *sent); } diff --git a/src/os/win32/ngx_socket.c b/src/os/win32/ngx_socket.c index d0e547ca6..09cbddf6b 100644 --- a/src/os/win32/ngx_socket.c +++ b/src/os/win32/ngx_socket.c @@ -1,19 +1,75 @@ + #include <ngx_config.h> +#include <ngx_core.h> #include <ngx_log.h> #include <ngx_errno.h> #include <ngx_socket.h> -void ngx_init_sockets(ngx_log_t *log) +/* These pointers should be per protocol ? */ +LPFN_ACCEPTEX AcceptEx; +LPFN_GETACCEPTEXSOCKADDRS GetAcceptExSockaddrs; +LPFN_TRANSMITFILE TransmitFile; + +static GUID ae_guid = WSAID_ACCEPTEX; +static GUID as_guid = WSAID_GETACCEPTEXSOCKADDRS; +static GUID tf_guid = WSAID_TRANSMITFILE; + + +int ngx_init_sockets(ngx_log_t *log) { + DWORD bytes; + SOCKET s; WSADATA wsd; - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) + if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - "ngx_init_sockets: WSAStartup failed"); + "WSAStartup failed"); + return NGX_ERROR; + } + + s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0); + if (s == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, + ngx_socket_n " %s falied"); + return NGX_ERROR; + } + + if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ae_guid, sizeof(GUID), + &AcceptEx, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL) == -1) { + + ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, + "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " + "WSAID_ACCEPTEX) failed"); + return NGX_ERROR; + } + + if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID), + &GetAcceptExSockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS), + &bytes, NULL, NULL) == -1) { + + ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, + "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " + "WSAID_ACCEPTEX) failed"); + return NGX_ERROR; + } + + if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID), + &TransmitFile, sizeof(LPFN_TRANSMITFILE), &bytes, + NULL, NULL) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, + "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " + "WSAID_TRANSMITFILE) failed"); + return NGX_ERROR; + } + + if (ngx_close_socket(s) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, + ngx_close_socket_n " failed"); + } - /* get AcceptEx(), TransmitFile() functions */ + return NGX_OK; } int ngx_nonblocking(ngx_socket_t s) diff --git a/src/os/win32/ngx_socket.h b/src/os/win32/ngx_socket.h index 98e15207c..f94d45c31 100644 --- a/src/os/win32/ngx_socket.h +++ b/src/os/win32/ngx_socket.h @@ -12,14 +12,17 @@ typedef SOCKET ngx_socket_t; typedef int socklen_t; -void ngx_init_sockets(ngx_log_t *log); +int ngx_init_sockets(ngx_log_t *log); #define ngx_socket(af, type, proto, flags) \ WSASocket(af, type, proto, NULL, 0, flags) #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()" @@ -28,5 +31,9 @@ int ngx_nonblocking(ngx_socket_t s); #define ngx_close_socket_n "closesocket()" +extern LPFN_ACCEPTEX acceptex; +extern LPFN_GETACCEPTEXSOCKADDRS getacceptexsockaddrs; +extern LPFN_TRANSMITFILE transmitfile; + #endif /* _NGX_SOCKET_H_INCLUDED_ */ |
