Kernel: Make the getsockname/getpeername syscall helper a bit nicer

Instead of templatizing on a bool parameter, use an enum for clarity.
This commit is contained in:
Andreas Kling 2023-04-03 18:26:46 +02:00
parent 5bc7882b68
commit 3371165588
Notes: sideshowbarker 2024-07-17 22:09:47 +09:00
2 changed files with 9 additions and 5 deletions

View file

@ -454,7 +454,11 @@ public:
ErrorOr<FlatPtr> sys$jail_attach(Userspace<Syscall::SC_jail_attach_params const*> user_params);
ErrorOr<FlatPtr> sys$get_root_session_id(pid_t force_sid);
template<bool sockname, typename Params>
enum SockOrPeerName {
SockName,
PeerName,
};
template<SockOrPeerName, typename Params>
ErrorOr<void> get_sock_or_peer_name(Params const&);
static void initialize();

View file

@ -325,7 +325,7 @@ ErrorOr<FlatPtr> Process::sys$recvmsg(int sockfd, Userspace<struct msghdr*> user
return result.value();
}
template<bool sockname, typename Params>
template<Process::SockOrPeerName sock_or_peer_name, typename Params>
ErrorOr<void> Process::get_sock_or_peer_name(Params const& params)
{
socklen_t addrlen_value;
@ -343,7 +343,7 @@ ErrorOr<void> Process::get_sock_or_peer_name(Params const& params)
sockaddr_un address_buffer {};
addrlen_value = min(sizeof(sockaddr_un), static_cast<size_t>(addrlen_value));
if constexpr (sockname)
if constexpr (sock_or_peer_name == SockOrPeerName::SockName)
socket.get_local_address((sockaddr*)&address_buffer, &addrlen_value);
else
socket.get_peer_address((sockaddr*)&address_buffer, &addrlen_value);
@ -355,7 +355,7 @@ ErrorOr<FlatPtr> Process::sys$getsockname(Userspace<Syscall::SC_getsockname_para
{
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
auto params = TRY(copy_typed_from_user(user_params));
TRY(get_sock_or_peer_name<true>(params));
TRY(get_sock_or_peer_name<SockOrPeerName::SockName>(params));
return 0;
}
@ -363,7 +363,7 @@ ErrorOr<FlatPtr> Process::sys$getpeername(Userspace<Syscall::SC_getpeername_para
{
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
auto params = TRY(copy_typed_from_user(user_params));
TRY(get_sock_or_peer_name<false>(params));
TRY(get_sock_or_peer_name<SockOrPeerName::PeerName>(params));
return 0;
}