diff --git a/kernel/include/kernel/Networking/UNIX/Socket.h b/kernel/include/kernel/Networking/UNIX/Socket.h index 88143e11..362f2710 100644 --- a/kernel/include/kernel/Networking/UNIX/Socket.h +++ b/kernel/include/kernel/Networking/UNIX/Socket.h @@ -30,6 +30,7 @@ namespace Kernel virtual BAN::ErrorOr bind_impl(const sockaddr*, socklen_t) override; virtual BAN::ErrorOr recvmsg_impl(msghdr& message, int flags) override; virtual BAN::ErrorOr sendmsg_impl(const msghdr& message, int flags) override; + virtual BAN::ErrorOr getsockname_impl(sockaddr*, socklen_t*) override; virtual BAN::ErrorOr getpeername_impl(sockaddr*, socklen_t*) override; virtual BAN::ErrorOr getsockopt_impl(int, int, void*, socklen_t*) override; virtual BAN::ErrorOr setsockopt_impl(int, int, const void*, socklen_t) override; diff --git a/kernel/kernel/Networking/UNIX/Socket.cpp b/kernel/kernel/Networking/UNIX/Socket.cpp index 352162e9..d1ee526a 100644 --- a/kernel/kernel/Networking/UNIX/Socket.cpp +++ b/kernel/kernel/Networking/UNIX/Socket.cpp @@ -704,6 +704,25 @@ namespace Kernel } } + BAN::ErrorOr UnixDomainSocket::getsockname_impl(sockaddr* address, socklen_t* address_len) + { + sockaddr_un sa_un { + .sun_family = AF_UNIX, + .sun_path = {}, + }; + + { + LockGuard _(m_bind_mutex); + strcpy(sa_un.sun_path, m_bound_file.canonical_path.data()); + } + + const size_t to_copy = BAN::Math::min(sizeof(sockaddr_un), *address_len); + memcpy(address, &sa_un, to_copy); + *address_len = to_copy; + return {}; + } + + BAN::ErrorOr UnixDomainSocket::getpeername_impl(sockaddr* address, socklen_t* address_len) { if (!m_info.has()) @@ -713,20 +732,7 @@ namespace Kernel if (!connection) return BAN::Error::from_errno(ENOTCONN); - sockaddr_un sa_un { - .sun_family = AF_UNIX, - .sun_path = {}, - }; - - { - LockGuard _(m_bind_mutex); - strcpy(sa_un.sun_path, connection->m_bound_file.canonical_path.data()); - } - - const size_t to_copy = BAN::Math::min(sizeof(sockaddr_un), *address_len); - memcpy(address, &sa_un, to_copy); - *address_len = to_copy; - return {}; + return connection->getsockname_impl(address, address_len); } BAN::ErrorOr UnixDomainSocket::getsockopt_impl(int level, int option, void* value, socklen_t* value_len)