diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 42571862b24b2..acfd4c8a14acb 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -945,6 +945,7 @@ if(LLVM_LIBC_FULL_BUILD) # arpa/inet.h entrypoints libc.src.arpa.inet.htonl libc.src.arpa.inet.htons + libc.src.arpa.inet.inet_addr libc.src.arpa.inet.inet_aton libc.src.arpa.inet.ntohl libc.src.arpa.inet.ntohs diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index b62a46b7178d5..83d5c42816632 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -1078,6 +1078,7 @@ if(LLVM_LIBC_FULL_BUILD) # arpa/inet.h entrypoints libc.src.arpa.inet.htonl libc.src.arpa.inet.htons + libc.src.arpa.inet.inet_addr libc.src.arpa.inet.inet_aton libc.src.arpa.inet.ntohl libc.src.arpa.inet.ntohs diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 8a46a7a1baae3..017822dc864a2 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -1116,6 +1116,7 @@ if(LLVM_LIBC_FULL_BUILD) # arpa/inet.h entrypoints libc.src.arpa.inet.htonl libc.src.arpa.inet.htons + libc.src.arpa.inet.inet_addr libc.src.arpa.inet.inet_aton libc.src.arpa.inet.ntohl libc.src.arpa.inet.ntohs diff --git a/libc/include/arpa/inet.yaml b/libc/include/arpa/inet.yaml index 6e0629072b6ef..350a4d74e5bec 100644 --- a/libc/include/arpa/inet.yaml +++ b/libc/include/arpa/inet.yaml @@ -3,6 +3,7 @@ header_template: inet.h.def macros: [] types: - type_name: in_addr + - type_name: in_addr_t enums: [] objects: [] functions: @@ -18,6 +19,12 @@ functions: return_type: uint16_t arguments: - type: uint16_t + - name: inet_addr + standards: + - POSIX + return_type: in_addr_t + arguments: + - type: const char * - name: inet_aton standards: - llvm_libc_ext diff --git a/libc/include/llvm-libc-macros/netinet-in-macros.h b/libc/include/llvm-libc-macros/netinet-in-macros.h index 2011c34e288cd..7a4d26d832114 100644 --- a/libc/include/llvm-libc-macros/netinet-in-macros.h +++ b/libc/include/llvm-libc-macros/netinet-in-macros.h @@ -29,6 +29,7 @@ #define INADDR_ANY __LLVM_LIBC_CAST(static_cast, in_addr_t, 0x00000000) #define INADDR_BROADCAST __LLVM_LIBC_CAST(static_cast, in_addr_t, 0xffffffff) +#define INADDR_NONE __LLVM_LIBC_CAST(static_cast, in_addr_t, 0xffffffff) #define INET_ADDRSTRLEN 16 #define INET6_ADDRSTRLEN 46 diff --git a/libc/src/arpa/inet/CMakeLists.txt b/libc/src/arpa/inet/CMakeLists.txt index bb43e24ec9d0b..3b3d0f43b8586 100644 --- a/libc/src/arpa/inet/CMakeLists.txt +++ b/libc/src/arpa/inet/CMakeLists.txt @@ -35,6 +35,21 @@ add_entrypoint_object( libc.src.__support.str_to_integer ) +add_entrypoint_object( + inet_addr + SRCS + inet_addr.cpp + HDRS + inet_addr.h + DEPENDS + libc.include.arpa_inet + libc.include.llvm-libc-macros.netinet_in_macros + libc.include.llvm-libc-types.in_addr + libc.include.llvm-libc-types.in_addr_t + libc.src.__support.common + libc.src.arpa.inet.inet_aton +) + add_entrypoint_object( ntohl SRCS diff --git a/libc/src/arpa/inet/inet_addr.cpp b/libc/src/arpa/inet/inet_addr.cpp new file mode 100644 index 0000000000000..8ce88c0df8aec --- /dev/null +++ b/libc/src/arpa/inet/inet_addr.cpp @@ -0,0 +1,23 @@ +//===-- Implementation of inet_addr function ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/arpa/inet/inet_addr.h" +#include "include/llvm-libc-macros/netinet-in-macros.h" +#include "include/llvm-libc-types/in_addr.h" +#include "include/llvm-libc-types/in_addr_t.h" +#include "src/__support/common.h" +#include "src/arpa/inet/inet_aton.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(in_addr_t, inet_addr, (const char *cp)) { + in_addr addr; + return inet_aton(cp, &addr) ? addr.s_addr : INADDR_NONE; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/arpa/inet/inet_addr.h b/libc/src/arpa/inet/inet_addr.h new file mode 100644 index 0000000000000..66f1ae80dd5a0 --- /dev/null +++ b/libc/src/arpa/inet/inet_addr.h @@ -0,0 +1,21 @@ +//===-- Implementation header of inet_addr ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_ARPA_INET_INET_ADDR_H +#define LLVM_LIBC_SRC_ARPA_INET_INET_ADDR_H + +#include "include/llvm-libc-types/in_addr_t.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +in_addr_t inet_addr(const char *cp); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_ARPA_INET_INET_ADDR_H diff --git a/libc/test/src/arpa/inet/CMakeLists.txt b/libc/test/src/arpa/inet/CMakeLists.txt index 690f751bef5e1..1d400c4374f70 100644 --- a/libc/test/src/arpa/inet/CMakeLists.txt +++ b/libc/test/src/arpa/inet/CMakeLists.txt @@ -22,6 +22,17 @@ add_libc_unittest( libc.src.arpa.inet.ntohs ) +add_libc_unittest( + inet_addr + SUITE + libc_arpa_inet_unittests + SRCS + inet_addr_test.cpp + DEPENDS + libc.src.arpa.inet.htonl + libc.src.arpa.inet.inet_addr +) + add_libc_unittest( inet_aton SUITE diff --git a/libc/test/src/arpa/inet/inet_addr_test.cpp b/libc/test/src/arpa/inet/inet_addr_test.cpp new file mode 100644 index 0000000000000..3f0ea0fc3b3f3 --- /dev/null +++ b/libc/test/src/arpa/inet/inet_addr_test.cpp @@ -0,0 +1,25 @@ +//===-- Unittests for inet_addr -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/arpa/inet/htonl.h" +#include "src/arpa/inet/inet_addr.h" +#include "test/UnitTest/Test.h" + +namespace LIBC_NAMESPACE_DECL { + +TEST(LlvmLibcInetAddr, ValidTest) { + ASSERT_EQ(htonl(0x7f010204), inet_addr("127.1.2.4")); + ASSERT_EQ(htonl(0x7f010004), inet_addr("127.1.4")); +} + +TEST(LlvmLibcInetAddr, InvalidTest) { + ASSERT_EQ(htonl(0xffffffff), inet_addr("")); + ASSERT_EQ(htonl(0xffffffff), inet_addr("x")); +} + +} // namespace LIBC_NAMESPACE_DECL