diff --git a/src/io/asyncsocket.c b/src/io/asyncsocket.c index 09f56bc3ae..135c91a613 100644 --- a/src/io/asyncsocket.c +++ b/src/io/asyncsocket.c @@ -633,6 +633,33 @@ typedef struct { int backlog; } ListenInfo; + +static void push_name_and_port(MVMThreadContext *tc, struct sockaddr_storage *name, MVMObject *arr) { + char addrstr[INET6_ADDRSTRLEN + 1]; + in_port_t port; + MVMObject *host_o; + MVMObject *port_o; + switch (name->ss_family) { + case AF_INET6: { + uv_ip6_name((struct sockaddr_in6*)name, addrstr, INET6_ADDRSTRLEN + 1); + port = ((struct sockaddr_in6*)name)->sin6_port; + break; + } + case AF_INET: { + uv_ip4_name((struct sockaddr_in*)name, addrstr, INET6_ADDRSTRLEN + 1); + port = ((struct sockaddr_in*)name)->sin_port; + break; + } + } + MVMROOT(tc, arr, { + port_o = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, port); + MVMROOT(tc, port, { + host_o = (MVMObject *)MVM_string_ascii_decode_nt(tc, tc->instance->boot_types.BOOTStr, addrstr); + }); + }); + MVM_repr_push_o(tc, arr, host_o); + MVM_repr_push_o(tc, arr, port_o); +} /* Handles an incoming connection. */ static void on_connection(uv_stream_t *server, int status) { ListenInfo *li = (ListenInfo *)server->data; @@ -654,8 +681,20 @@ static void on_connection(uv_stream_t *server, int status) { data->handle = (uv_stream_t *)client; result->body.ops = &op_table; result->body.data = data; + MVM_repr_push_o(tc, arr, (MVMObject *)result); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); + + MVMROOT(tc, result, { + struct sockaddr_storage sockaddr; + int name_len = sizeof(struct sockaddr_storage); + + uv_tcp_getpeername(client, (struct sockaddr *)&sockaddr, &name_len); + push_name_and_port(tc, &sockaddr, arr); + + uv_tcp_getsockname(client, (struct sockaddr *)&sockaddr, &name_len); + push_name_and_port(tc, &sockaddr, arr); + }); }); }); }