From c29a7780db495de065748cc97fd248799bafe6bc Mon Sep 17 00:00:00 2001 From: Leorize Date: Wed, 26 Sep 2018 09:52:34 +0700 Subject: [PATCH] net_socket: getsockname() now works with unnamed sockets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getsockname() now set the socket family and zero all other fields of sockaddr if an unnamed socket is passed as an argument. This allows retrieving the socket family from an unnamed socket. This change is compatible with POSIX and appears to aligns with Linux, FreeBSD, DragonflyBSD and OpenBSD behaviors. Fixes #14312 Change-Id: I55dbf4d6738399941bef71e6b3d7201cf78876df Reviewed-on: https://review.haiku-os.org/594 Reviewed-by: Axel Dörfler Reviewed-by: Jérôme Duval --- src/add-ons/kernel/network/stack/net_socket.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/network/stack/net_socket.cpp b/src/add-ons/kernel/network/stack/net_socket.cpp index 0eef150683..16efa8f2e9 100644 --- a/src/add-ons/kernel/network/stack/net_socket.cpp +++ b/src/add-ons/kernel/network/stack/net_socket.cpp @@ -1066,8 +1066,15 @@ int socket_getsockname(net_socket* socket, struct sockaddr* address, socklen_t* _addressLength) { - if (socket->address.ss_len == 0) - return ENOTCONN; + if (socket->address.ss_len == 0) { + struct sockaddr buffer; + memset(&buffer, 0, sizeof(buffer)); + buffer.sa_family = socket->family; + + memcpy(address, &buffer, min_c(*_addressLength, sizeof(buffer))); + *_addressLength = sizeof(buffer); + return B_OK; + } memcpy(address, &socket->address, min_c(*_addressLength, socket->address.ss_len));