From 3b3df30374b9c222a5a401779e84306988e76f49 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Sun, 12 Jun 2011 14:53:07 +0200 Subject: [PATCH] Windows: uv_tcp_init before uv_accept --- uv-win.c | 55 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/uv-win.c b/uv-win.c index 6fc84bbb..65a436ab 100644 --- a/uv-win.c +++ b/uv-win.c @@ -456,19 +456,10 @@ static uv_req_t* uv_remove_pending_req() { } -static int uv_tcp_init_socket(uv_tcp_t* handle, SOCKET socket) { +static int uv_tcp_set_socket(uv_tcp_t* handle, SOCKET socket) { DWORD yes = 1; - uv_cnt_handle_init++; - uv_cnt_tcp_init++; - - handle->socket = socket; - handle->write_queue_size = 0; - handle->type = UV_TCP; - handle->flags = 0; - handle->reqs_pending = 0; - handle->error = uv_ok_; - handle->accept_socket = INVALID_SOCKET; + assert(handle->socket == INVALID_SOCKET); /* Set the socket to nonblocking mode */ if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { @@ -492,7 +483,7 @@ static int uv_tcp_init_socket(uv_tcp_t* handle, SOCKET socket) { return -1; } - uv_refs_++; + handle->socket = socket; return 0; } @@ -508,16 +499,18 @@ static void uv_tcp_init_connection(uv_tcp_t* handle) { int uv_tcp_init(uv_tcp_t* handle) { SOCKET sock; - sock = socket(AF_INET, SOCK_STREAM, 0); - if (handle->socket == INVALID_SOCKET) { - uv_set_sys_error(WSAGetLastError()); - return -1; - } + handle->socket = INVALID_SOCKET; + handle->write_queue_size = 0; + handle->type = UV_TCP; + handle->flags = 0; + handle->reqs_pending = 0; + handle->error = uv_ok_; + handle->accept_socket = INVALID_SOCKET; - if (uv_tcp_init_socket(handle, sock) == -1) { - closesocket(sock); - return -1; - } + uv_cnt_handle_init++; + uv_cnt_tcp_init++; + + uv_refs_++; return 0; } @@ -726,6 +719,7 @@ struct sockaddr_in uv_ip4_addr(char* ip, int port) { int uv_bind(uv_tcp_t* handle, struct sockaddr_in addr) { DWORD err; int r; + SOCKET sock; int addrsize = sizeof(struct sockaddr_in); if (addr.sin_family != AF_INET) { @@ -733,6 +727,19 @@ int uv_bind(uv_tcp_t* handle, struct sockaddr_in addr) { return -1; } + if (handle->socket == INVALID_SOCKET) { + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == INVALID_SOCKET) { + uv_set_sys_error(WSAGetLastError()); + return -1; + } + + if (uv_tcp_set_socket(handle, sock) == -1) { + closesocket(sock); + return -1; + } + } + r = bind(handle->socket, (struct sockaddr*) &addr, addrsize); if (r == SOCKET_ERROR) { @@ -878,13 +885,13 @@ int uv_accept(uv_tcp_t* server, uv_tcp_t* client) { return -1; } - if (uv_tcp_init_socket(client, server->accept_socket) == -1) { + if (uv_tcp_set_socket(client, server->accept_socket) == -1) { closesocket(server->accept_socket); rv = -1; + } else { + uv_tcp_init_connection(client); } - uv_tcp_init_connection(client); - server->accept_socket = INVALID_SOCKET; if (!(server->flags & UV_HANDLE_CLOSING)) {