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;
}