Kernel: Implement getsockname for UNIX sockets
This commit is contained in:
@@ -30,6 +30,7 @@ namespace Kernel
|
|||||||
virtual BAN::ErrorOr<void> bind_impl(const sockaddr*, socklen_t) override;
|
virtual BAN::ErrorOr<void> bind_impl(const sockaddr*, socklen_t) override;
|
||||||
virtual BAN::ErrorOr<size_t> recvmsg_impl(msghdr& message, int flags) override;
|
virtual BAN::ErrorOr<size_t> recvmsg_impl(msghdr& message, int flags) override;
|
||||||
virtual BAN::ErrorOr<size_t> sendmsg_impl(const msghdr& message, int flags) override;
|
virtual BAN::ErrorOr<size_t> sendmsg_impl(const msghdr& message, int flags) override;
|
||||||
|
virtual BAN::ErrorOr<void> getsockname_impl(sockaddr*, socklen_t*) override;
|
||||||
virtual BAN::ErrorOr<void> getpeername_impl(sockaddr*, socklen_t*) override;
|
virtual BAN::ErrorOr<void> getpeername_impl(sockaddr*, socklen_t*) override;
|
||||||
virtual BAN::ErrorOr<void> getsockopt_impl(int, int, void*, socklen_t*) override;
|
virtual BAN::ErrorOr<void> getsockopt_impl(int, int, void*, socklen_t*) override;
|
||||||
virtual BAN::ErrorOr<void> setsockopt_impl(int, int, const void*, socklen_t) override;
|
virtual BAN::ErrorOr<void> setsockopt_impl(int, int, const void*, socklen_t) override;
|
||||||
|
|||||||
@@ -704,6 +704,25 @@ namespace Kernel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> 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<socklen_t>(sizeof(sockaddr_un), *address_len);
|
||||||
|
memcpy(address, &sa_un, to_copy);
|
||||||
|
*address_len = to_copy;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BAN::ErrorOr<void> UnixDomainSocket::getpeername_impl(sockaddr* address, socklen_t* address_len)
|
BAN::ErrorOr<void> UnixDomainSocket::getpeername_impl(sockaddr* address, socklen_t* address_len)
|
||||||
{
|
{
|
||||||
if (!m_info.has<ConnectionInfo>())
|
if (!m_info.has<ConnectionInfo>())
|
||||||
@@ -713,20 +732,7 @@ namespace Kernel
|
|||||||
if (!connection)
|
if (!connection)
|
||||||
return BAN::Error::from_errno(ENOTCONN);
|
return BAN::Error::from_errno(ENOTCONN);
|
||||||
|
|
||||||
sockaddr_un sa_un {
|
return connection->getsockname_impl(address, address_len);
|
||||||
.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<socklen_t>(sizeof(sockaddr_un), *address_len);
|
|
||||||
memcpy(address, &sa_un, to_copy);
|
|
||||||
*address_len = to_copy;
|
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> UnixDomainSocket::getsockopt_impl(int level, int option, void* value, socklen_t* value_len)
|
BAN::ErrorOr<void> UnixDomainSocket::getsockopt_impl(int level, int option, void* value, socklen_t* value_len)
|
||||||
|
|||||||
Reference in New Issue
Block a user