Windows: uv_tcp_init before uv_accept

This commit is contained in:
Bert Belder 2011-06-12 14:53:07 +02:00
parent ebc73022f8
commit 3b3df30374

View File

@ -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)) {