From 022bb697820d0ddcfe70918a63c4fcfd9558df87 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 2 Jun 2025 11:29:52 +0300 Subject: [PATCH] LibC: Implement inet_aton This is not POSIX but IMO it makes sense to have the counter part to inet_ntoa --- userspace/libraries/LibC/arpa/inet.cpp | 51 ++++++++++++-------- userspace/libraries/LibC/include/arpa/inet.h | 1 + 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/userspace/libraries/LibC/arpa/inet.cpp b/userspace/libraries/LibC/arpa/inet.cpp index 15e98950a7..938f35f39d 100644 --- a/userspace/libraries/LibC/arpa/inet.cpp +++ b/userspace/libraries/LibC/arpa/inet.cpp @@ -27,28 +27,10 @@ uint16_t ntohs(uint16_t netshort) in_addr_t inet_addr(const char* cp) { - uint32_t a, b, c, d, n; - const int ret = sscanf(cp, "%i%n.%i%n.%i%n.%i%n", - &a, &n, &b, &n, &c, &n, &d, &n - ); - - if (ret < 1 || ret > 4 || cp[n] != '\0') + in_addr addr; + if (inet_aton(cp, &addr) == 0) return INADDR_NONE; - if (ret == 1 && (a > 0xFFFFFFFF)) - return INADDR_NONE; - if (ret == 2 && (a > 0xFF || b > 0xFFFFFF)) - return INADDR_NONE; - if (ret == 3 && (a > 0xFF || b > 0xFF || c > 0xFFFF)) - return INADDR_NONE; - if (ret == 4 && (a > 0xFF || b > 0xFF || c > 0xFF || d > 0xFF)) - return INADDR_NONE; - - uint32_t result = 0; - result |= (ret == 1) ? a : a << 24; - result |= (ret == 2) ? b : b << 16; - result |= (ret == 3) ? c : c << 8; - result |= (ret == 4) ? d : d << 0; - return htonl(result); + return addr.s_addr; } char* inet_ntoa(struct in_addr in) @@ -64,6 +46,33 @@ char* inet_ntoa(struct in_addr in) return buffer; } +int inet_aton(const char* cp, struct in_addr* inp) +{ + uint32_t a, b, c, d, n; + const int ret = sscanf(cp, "%i%n.%i%n.%i%n.%i%n", + &a, &n, &b, &n, &c, &n, &d, &n + ); + + if (ret < 1 || ret > 4 || cp[n] != '\0') + return 0; + if (ret == 1 && (a > 0xFFFFFFFF)) + return 0; + if (ret == 2 && (a > 0xFF || b > 0xFFFFFF)) + return 0; + if (ret == 3 && (a > 0xFF || b > 0xFF || c > 0xFFFF)) + return 0; + if (ret == 4 && (a > 0xFF || b > 0xFF || c > 0xFF || d > 0xFF)) + return 0; + + uint32_t result = 0; + result |= (ret == 1) ? a : a << 24; + result |= (ret == 2) ? b : b << 16; + result |= (ret == 3) ? c : c << 8; + result |= (ret == 4) ? d : d << 0; + inp->s_addr = htonl(result); + return 1; +} + const char* inet_ntop(int af, const void* __restrict src, char* __restrict dst, socklen_t size) { if (af == AF_INET) diff --git a/userspace/libraries/LibC/include/arpa/inet.h b/userspace/libraries/LibC/include/arpa/inet.h index 5db471ce22..674754ee7e 100644 --- a/userspace/libraries/LibC/include/arpa/inet.h +++ b/userspace/libraries/LibC/include/arpa/inet.h @@ -11,6 +11,7 @@ __BEGIN_DECLS #include in_addr_t inet_addr(const char* cp); +int inet_aton(const char* cp, struct in_addr* inp); char* inet_ntoa(struct in_addr in); const char* inet_ntop(int af, const void* __restrict src, char* __restrict dst, socklen_t size); int inet_pton(int af, const char* __restrict src, void* __restrict dst);