From ee7c9b673187877d35fc51aa0249fd33da442072 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 27 May 2025 07:12:10 +0300 Subject: [PATCH] LibC: Add simple `getnameinfo` This doesn't actually do any name resolution but just formats input to string. --- userspace/libraries/LibC/netdb.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/userspace/libraries/LibC/netdb.cpp b/userspace/libraries/LibC/netdb.cpp index 09492686..584ac0cc 100644 --- a/userspace/libraries/LibC/netdb.cpp +++ b/userspace/libraries/LibC/netdb.cpp @@ -147,9 +147,34 @@ error_close_socket: return EAI_FAIL; } -int getnameinfo(const struct sockaddr* __restrict, socklen_t, char* __restrict, socklen_t, char* __restrict, socklen_t, int) +#include + +int getnameinfo(const struct sockaddr* __restrict sa, socklen_t salen, char* __restrict node, socklen_t nodelen, char* __restrict service, socklen_t servicelen, int flags) { - ASSERT_NOT_REACHED(); + printf("getnameinfo(%p, %p, %p, 0x%X)\n", sa, node, service, flags); + + switch (sa->sa_family) + { + case AF_INET: + if (salen < static_cast(sizeof(sockaddr_in))) + return EAI_FAMILY; + if (service && snprintf(service, servicelen, "%d", reinterpret_cast(service)->sin_port) < 0) + return EAI_SYSTEM; + break; + case AF_INET6: + if (salen < static_cast(sizeof(sockaddr_in6))) + return EAI_FAMILY; + if (service && snprintf(service, servicelen, "%d", reinterpret_cast(service)->sin6_port) < 0) + return EAI_SYSTEM; + break; + default: + return EAI_FAIL; + } + + if (node && inet_ntop(sa->sa_family, sa, node, nodelen) == nullptr) + return EAI_SYSTEM; + + return 0; } struct hostent* gethostbyname(const char* name)