[libc-commits] [libc] [libc] Implement accept4 on linux (PR #192927)

via libc-commits libc-commits at lists.llvm.org
Mon Apr 20 02:57:54 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc

@llvm/pr-subscribers-backend-risc-v

Author: Pavel Labath (labath)

<details>
<summary>Changes</summary>

Testing funcitonality by checking the flags on the returned FD.

---
Full diff: https://github.com/llvm/llvm-project/pull/192927.diff


10 Files Affected:

- (modified) libc/config/linux/aarch64/entrypoints.txt (+1) 
- (modified) libc/config/linux/riscv/entrypoints.txt (+1) 
- (modified) libc/config/linux/x86_64/entrypoints.txt (+1) 
- (modified) libc/include/llvm-libc-macros/linux/sys-socket-macros.h (+3) 
- (modified) libc/include/sys/socket.yaml (+9) 
- (modified) libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt (+14) 
- (modified) libc/src/sys/socket/CMakeLists.txt (+7) 
- (modified) libc/src/sys/socket/linux/CMakeLists.txt (+14) 
- (modified) libc/test/src/sys/socket/linux/CMakeLists.txt (+3) 
- (modified) libc/test/src/sys/socket/linux/connect_accept_test.cpp (+53) 


``````````diff
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 87bd5461496b3..15d7c799883c0 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -1214,6 +1214,7 @@ if(LLVM_LIBC_FULL_BUILD)
 
     # sys/socket.h entrypoints
     libc.src.sys.socket.accept
+    libc.src.sys.socket.accept4
     libc.src.sys.socket.bind
     libc.src.sys.socket.connect
     libc.src.sys.socket.getsockopt
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index ea117c1d83c24..554641d4fc5d4 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -1348,6 +1348,7 @@ if(LLVM_LIBC_FULL_BUILD)
 
     # sys/socket.h entrypoints
     libc.src.sys.socket.accept
+    libc.src.sys.socket.accept4
     libc.src.sys.socket.bind
     libc.src.sys.socket.connect
     libc.src.sys.socket.getsockopt
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 5c69c8808b2c1..5ce78e755a110 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -1422,6 +1422,7 @@ if(LLVM_LIBC_FULL_BUILD)
 
     # sys/socket.h entrypoints
     libc.src.sys.socket.accept
+    libc.src.sys.socket.accept4
     libc.src.sys.socket.socket
     libc.src.sys.socket.bind
     libc.src.sys.socket.connect
diff --git a/libc/include/llvm-libc-macros/linux/sys-socket-macros.h b/libc/include/llvm-libc-macros/linux/sys-socket-macros.h
index 5a5cfd578dcbf..b7c52b9b0c349 100644
--- a/libc/include/llvm-libc-macros/linux/sys-socket-macros.h
+++ b/libc/include/llvm-libc-macros/linux/sys-socket-macros.h
@@ -25,6 +25,9 @@
 #define SOCK_SEQPACKET 5
 #define SOCK_PACKET 10
 
+#define SOCK_CLOEXEC 0x80000
+#define SOCK_NONBLOCK 0x800
+
 #define SOL_SOCKET 1
 
 #define SO_DEBUG 1
diff --git a/libc/include/sys/socket.yaml b/libc/include/sys/socket.yaml
index 28a81328a3559..e6b93827e3646 100644
--- a/libc/include/sys/socket.yaml
+++ b/libc/include/sys/socket.yaml
@@ -24,6 +24,15 @@ functions:
       - type: int
       - type: struct sockaddr *__restrict
       - type: socklen_t *__restrict
+  - name: accept4
+    standards:
+      - Linux
+    return_type: int
+    arguments:
+      - type: int
+      - type: struct sockaddr *__restrict
+      - type: socklen_t *__restrict
+      - type: int
   - name: bind
     standards:
       - POSIX
diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt b/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt
index f00fa9668afe7..049eeac913780 100644
--- a/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt
@@ -38,6 +38,20 @@ add_header_library(
     libc.include.sys_syscall
 )
 
+add_header_library(
+  accept4
+  HDRS
+    accept4.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.error_or
+    libc.src.__support.libc_errno
+    libc.src.__support.macros.config
+    libc.hdr.types.socklen_t
+    libc.hdr.types.struct_sockaddr
+    libc.include.sys_syscall
+)
+
 add_header_library(
   connect
   HDRS
diff --git a/libc/src/sys/socket/CMakeLists.txt b/libc/src/sys/socket/CMakeLists.txt
index 50558c667c78a..70be4c048d90f 100644
--- a/libc/src/sys/socket/CMakeLists.txt
+++ b/libc/src/sys/socket/CMakeLists.txt
@@ -16,6 +16,13 @@ add_entrypoint_object(
     .${LIBC_TARGET_OS}.accept
 )
 
+add_entrypoint_object(
+  accept4
+  ALIAS
+  DEPENDS
+    .${LIBC_TARGET_OS}.accept4
+)
+
 add_entrypoint_object(
   bind
   ALIAS
diff --git a/libc/src/sys/socket/linux/CMakeLists.txt b/libc/src/sys/socket/linux/CMakeLists.txt
index c63a8e1fafe19..417a00e552f82 100644
--- a/libc/src/sys/socket/linux/CMakeLists.txt
+++ b/libc/src/sys/socket/linux/CMakeLists.txt
@@ -38,6 +38,20 @@ add_entrypoint_object(
     libc.src.errno.errno
 )
 
+add_entrypoint_object(
+  accept4
+  SRCS
+    accept4.cpp
+  HDRS
+    ../accept4.h
+  DEPENDS
+    libc.include.sys_socket
+    libc.src.__support.OSUtil.osutil
+    libc.hdr.types.struct_sockaddr
+    libc.hdr.types.socklen_t
+    libc.src.errno.errno
+)
+
 add_entrypoint_object(
   connect
   SRCS
diff --git a/libc/test/src/sys/socket/linux/CMakeLists.txt b/libc/test/src/sys/socket/linux/CMakeLists.txt
index af0a46e9a06bb..10ca9039f5b9d 100644
--- a/libc/test/src/sys/socket/linux/CMakeLists.txt
+++ b/libc/test/src/sys/socket/linux/CMakeLists.txt
@@ -42,11 +42,14 @@ add_libc_unittest(
     connect_accept_test.cpp
   DEPENDS
     libc.include.sys_socket
+    libc.hdr.fcntl_macros
     libc.hdr.sys_socket_macros
     libc.hdr.types.size_t
     libc.hdr.types.struct_sockaddr_un
     libc.src.errno.errno
+    libc.src.fcntl.fcntl
     libc.src.sys.socket.accept
+    libc.src.sys.socket.accept4
     libc.src.sys.socket.bind
     libc.src.sys.socket.connect
     libc.src.sys.socket.listen
diff --git a/libc/test/src/sys/socket/linux/connect_accept_test.cpp b/libc/test/src/sys/socket/linux/connect_accept_test.cpp
index b95992d030324..c523d470f616f 100644
--- a/libc/test/src/sys/socket/linux/connect_accept_test.cpp
+++ b/libc/test/src/sys/socket/linux/connect_accept_test.cpp
@@ -6,10 +6,13 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "hdr/fcntl_macros.h"
 #include "hdr/sys_socket_macros.h"
 #include "hdr/types/size_t.h"
 #include "hdr/types/struct_sockaddr_un.h"
+#include "src/fcntl/fcntl.h"
 #include "src/sys/socket/accept.h"
+#include "src/sys/socket/accept4.h"
 #include "src/sys/socket/bind.h"
 #include "src/sys/socket/connect.h"
 #include "src/sys/socket/listen.h"
@@ -123,3 +126,53 @@ TEST_F(LlvmLibcConnectAcceptTest, ConnectLocalSocket) {
   ASSERT_THAT(LIBC_NAMESPACE::remove(ACCEPT_PATH), Succeeds(0));
   ASSERT_THAT(LIBC_NAMESPACE::remove(CONNECT_PATH), Succeeds(0));
 }
+
+TEST_F(LlvmLibcConnectAcceptTest, Accept4Flags) {
+  const char *ACCEPT_FILE = "accept4_file.test";
+  auto ACCEPT_PATH = libc_make_test_file_path(ACCEPT_FILE);
+  ASSERT_LT(LIBC_NAMESPACE::strlen(ACCEPT_PATH), MAX_SOCKET_PATH);
+  const struct sockaddr_un ACCEPT_ADDR = make_sockaddr(ACCEPT_PATH);
+
+  int accepting_socket = LIBC_NAMESPACE::socket(AF_UNIX, SOCK_STREAM, 0);
+  ASSERT_GE(accepting_socket, 0);
+  ASSERT_ERRNO_SUCCESS();
+
+  ASSERT_THAT(LIBC_NAMESPACE::bind(
+                  accepting_socket,
+                  reinterpret_cast<const struct sockaddr *>(&ACCEPT_ADDR),
+                  sizeof(struct sockaddr_un)),
+              Succeeds(0));
+
+  ASSERT_THAT(LIBC_NAMESPACE::listen(accepting_socket, 1), Succeeds(0));
+
+  int connecting_socket = LIBC_NAMESPACE::socket(AF_UNIX, SOCK_STREAM, 0);
+  ASSERT_GE(connecting_socket, 0);
+  ASSERT_ERRNO_SUCCESS();
+
+  ASSERT_THAT(LIBC_NAMESPACE::connect(
+                  connecting_socket,
+                  reinterpret_cast<const struct sockaddr *>(&ACCEPT_ADDR),
+                  sizeof(struct sockaddr_un)),
+              Succeeds(0));
+
+  int accepted_socket = LIBC_NAMESPACE::accept4(
+      accepting_socket, nullptr, nullptr, SOCK_CLOEXEC | SOCK_NONBLOCK);
+  ASSERT_GE(accepted_socket, 0);
+  ASSERT_ERRNO_SUCCESS();
+
+  ASSERT_THAT(LIBC_NAMESPACE::close(connecting_socket), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::close(accepting_socket), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::remove(ACCEPT_PATH), Succeeds(0));
+
+  // Check FD_CLOEXEC
+  int fd_flags = LIBC_NAMESPACE::fcntl(accepted_socket, F_GETFD);
+  ASSERT_GE(fd_flags, 0);
+  ASSERT_NE(fd_flags & FD_CLOEXEC, 0);
+
+  // Check O_NONBLOCK
+  int fl_flags = LIBC_NAMESPACE::fcntl(accepted_socket, F_GETFL);
+  ASSERT_GE(fl_flags, 0);
+  ASSERT_NE(fl_flags & O_NONBLOCK, 0);
+
+  ASSERT_THAT(LIBC_NAMESPACE::close(accepted_socket), Succeeds(0));
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/192927


More information about the libc-commits mailing list