ext/noderb_extension/libuv/src/win/tcp.c in noderb-0.0.8 vs ext/noderb_extension/libuv/src/win/tcp.c in noderb-0.0.9

- old
+ new

@@ -417,10 +417,12 @@ if (uv_tcp_set_socket(client->loop, client, req->accept_socket) == -1) { closesocket(req->accept_socket); rv = -1; } else { uv_connection_init((uv_stream_t*) client); + /* AcceptEx() implicitly binds the accepted socket. */ + client->flags |= UV_HANDLE_BOUND; } /* Prepare the req to pick up a new connection */ server->pending_accepts = req->next_pending; req->next_pending = NULL; @@ -571,19 +573,50 @@ return 0; } -int uv_tcp_getsockname(uv_loop_t* loop, uv_tcp_t* handle, - struct sockaddr* name, int* namelen) { +int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name, + int* namelen) { + uv_loop_t* loop = handle->loop; int result; - if (handle->flags & UV_HANDLE_SHUTTING) { - uv_set_sys_error(loop, WSAESHUTDOWN); + if (!(handle->flags & UV_HANDLE_BOUND)) { + uv_set_sys_error(loop, WSAEINVAL); return -1; } + if (handle->flags & UV_HANDLE_BIND_ERROR) { + loop->last_error = handle->bind_error; + return -1; + } + result = getsockname(handle->socket, name, namelen); + if (result != 0) { + uv_set_sys_error(loop, WSAGetLastError()); + return -1; + } + + return 0; +} + + +int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name, + int* namelen) { + uv_loop_t* loop = handle->loop; + int result; + + if (!(handle->flags & UV_HANDLE_BOUND)) { + uv_set_sys_error(loop, WSAEINVAL); + return -1; + } + + if (handle->flags & UV_HANDLE_BIND_ERROR) { + loop->last_error = handle->bind_error; + return -1; + } + + result = getpeername(handle->socket, name, namelen); if (result != 0) { uv_set_sys_error(loop, WSAGetLastError()); return -1; }