[libc-commits] [libc] f6b4c34 - [libc] Add functions to send/recv messages (#106467)
via libc-commits
libc-commits at lists.llvm.org
Thu Sep 19 14:43:04 PDT 2024
Author: Michael Jones
Date: 2024-09-19T14:43:00-07:00
New Revision: f6b4c34d4f96ca705409f76b9bb48de7d2bec9bd
URL: https://github.com/llvm/llvm-project/commit/f6b4c34d4f96ca705409f76b9bb48de7d2bec9bd
DIFF: https://github.com/llvm/llvm-project/commit/f6b4c34d4f96ca705409f76b9bb48de7d2bec9bd.diff
LOG: [libc] Add functions to send/recv messages (#106467)
This patch adds the necessary functions to send and receive messages
over a socket. Those functions are: recv, recvfrom, recvmsg, send,
sendto, sendmsg, and socketpair for testing.
Added:
libc/hdr/types/socklen_t.h
libc/hdr/types/ssize_t.h
libc/hdr/types/struct_msghdr.h
libc/hdr/types/struct_sockaddr.h
libc/include/llvm-libc-types/struct_iovec.h
libc/include/llvm-libc-types/struct_msghdr.h
libc/src/sys/socket/linux/recv.cpp
libc/src/sys/socket/linux/recvfrom.cpp
libc/src/sys/socket/linux/recvmsg.cpp
libc/src/sys/socket/linux/send.cpp
libc/src/sys/socket/linux/sendmsg.cpp
libc/src/sys/socket/linux/sendto.cpp
libc/src/sys/socket/linux/socketpair.cpp
libc/src/sys/socket/recv.h
libc/src/sys/socket/recvfrom.h
libc/src/sys/socket/recvmsg.h
libc/src/sys/socket/send.h
libc/src/sys/socket/sendmsg.h
libc/src/sys/socket/sendto.h
libc/src/sys/socket/socketpair.h
libc/test/src/sys/socket/linux/send_recv_test.cpp
libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp
libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp
libc/test/src/sys/socket/linux/socketpair_test.cpp
utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel
Modified:
libc/config/linux/api.td
libc/config/linux/x86_64/entrypoints.txt
libc/hdr/types/CMakeLists.txt
libc/include/CMakeLists.txt
libc/include/llvm-libc-types/CMakeLists.txt
libc/newhdrgen/yaml/sys/socket.yaml
libc/spec/posix.td
libc/src/sys/socket/CMakeLists.txt
libc/src/sys/socket/linux/CMakeLists.txt
libc/test/src/sys/socket/linux/CMakeLists.txt
utils/bazel/llvm-project-overlay/libc/BUILD.bazel
Removed:
libc/src/sys/socket/bind.h
libc/src/sys/socket/linux/bind.cpp
libc/test/src/sys/socket/linux/bind_test.cpp
################################################################################
diff --git a/libc/config/linux/api.td b/libc/config/linux/api.td
index 6a7c64296bf922..46523b4ca4b8df 100644
--- a/libc/config/linux/api.td
+++ b/libc/config/linux/api.td
@@ -193,6 +193,10 @@ def SysSocketAPI : PublicAPI<"sys/socket.h"> {
"socklen_t",
"struct sockaddr",
"struct sockaddr_un",
+ "struct msghdr",
+ "struct iovec",
+ "size_t",
+ "ssize_t",
];
}
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 2a38db5bcdad8c..86fd33136832c7 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -1041,8 +1041,14 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.sys.select.select
# sys/socket.h entrypoints
- libc.src.sys.socket.bind
libc.src.sys.socket.socket
+ libc.src.sys.socket.socketpair
+ libc.src.sys.socket.send
+ libc.src.sys.socket.sendto
+ libc.src.sys.socket.sendmsg
+ libc.src.sys.socket.recv
+ libc.src.sys.socket.recvfrom
+ libc.src.sys.socket.recvmsg
)
endif()
diff --git a/libc/hdr/types/CMakeLists.txt b/libc/hdr/types/CMakeLists.txt
index 12641c4d93ffe8..2259ca02f2db69 100644
--- a/libc/hdr/types/CMakeLists.txt
+++ b/libc/hdr/types/CMakeLists.txt
@@ -199,3 +199,30 @@ add_proxy_header_library(
libc.include.setjmp
)
+
+add_proxy_header_library(
+ struct_msghdr
+ HDRS
+ struct_msghdr.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.struct_msghdr
+ libc.include.sys_socket
+)
+
+add_proxy_header_library(
+ struct_sockaddr
+ HDRS
+ struct_sockaddr.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.struct_sockaddr
+ libc.include.sys_socket
+)
+
+add_proxy_header_library(
+ socklen_t
+ HDRS
+ socklen_t.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.socklen_t
+ libc.include.sys_socket
+)
diff --git a/libc/hdr/types/socklen_t.h b/libc/hdr/types/socklen_t.h
new file mode 100644
index 00000000000000..79a6b9c7deadf0
--- /dev/null
+++ b/libc/hdr/types/socklen_t.h
@@ -0,0 +1,21 @@
+//===-- Proxy for socklen_t -----------------------------------------------===//
+//
+// 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_HDR_TYPES_SOCKLEN_T_H
+#define LLVM_LIBC_HDR_TYPES_SOCKLEN_T_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/socklen_t.h"
+
+#else
+
+#include <signal.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_SOCKLEN_T_H
diff --git a/libc/hdr/types/ssize_t.h b/libc/hdr/types/ssize_t.h
new file mode 100644
index 00000000000000..4d2000780ee11f
--- /dev/null
+++ b/libc/hdr/types/ssize_t.h
@@ -0,0 +1,23 @@
+//===-- Proxy for ssize_t -------------------------------------------------===//
+//
+// 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_HDR_TYPES_SSIZE_T_H
+#define LLVM_LIBC_HDR_TYPES_SSIZE_T_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/ssize_t.h"
+
+#else
+
+#define __need_ssize_t
+#include <stddef.h>
+#undef __need_ssize_t
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_SSIZE_T_H
diff --git a/libc/hdr/types/struct_msghdr.h b/libc/hdr/types/struct_msghdr.h
new file mode 100644
index 00000000000000..6a36af791e2147
--- /dev/null
+++ b/libc/hdr/types/struct_msghdr.h
@@ -0,0 +1,21 @@
+//===-- Proxy for struct msghdr ------------------------------------------===//
+//
+// 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_HDR_TYPES_STRUCT_MSGHDR_H
+#define LLVM_LIBC_HDR_TYPES_STRUCT_MSGHDR_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/struct_msghdr.h"
+
+#else
+
+#include <sys/socket.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_STRUCT_MSGHDR_H
diff --git a/libc/hdr/types/struct_sockaddr.h b/libc/hdr/types/struct_sockaddr.h
new file mode 100644
index 00000000000000..0fc31d53748540
--- /dev/null
+++ b/libc/hdr/types/struct_sockaddr.h
@@ -0,0 +1,21 @@
+//===-- Proxy for struct sockaddr ----------------------------------------===//
+//
+// 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_HDR_TYPES_STRUCT_SOCKADDR_H
+#define LLVM_LIBC_HDR_TYPES_STRUCT_SOCKADDR_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/struct_sockaddr.h"
+
+#else
+
+#include <sys/socket.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_STRUCT_SOCKADDR_H
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index dfa5063889e8ab..16c2ac5124c843 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -593,6 +593,8 @@ add_header_macro(
.llvm-libc-macros.sys_socket_macros
.llvm-libc-types.sa_family_t
.llvm-libc-types.socklen_t
+ .llvm-libc-types.struct_iovec
+ .llvm-libc-types.struct_msghdr
.llvm-libc-types.struct_sockaddr
.llvm-libc-types.struct_sockaddr_un
)
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index 583b84ccaae67c..a4cf4631c8470e 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -117,8 +117,10 @@ add_header(
add_header(wint_t HDR wint_t.h)
add_header(sa_family_t HDR sa_family_t.h)
add_header(socklen_t HDR socklen_t.h)
-add_header(struct_sockaddr_un HDR struct_sockaddr_un.h)
-add_header(struct_sockaddr HDR struct_sockaddr.h)
+add_header(struct_sockaddr_un HDR struct_sockaddr_un.h DEPENDS .sa_family_t)
+add_header(struct_sockaddr HDR struct_sockaddr.h DEPENDS .sa_family_t)
+add_header(struct_iovec HDR struct_iovec.h DEPENDS .size_t)
+add_header(struct_msghdr HDR struct_msghdr.h DEPENDS .size_t .socklen_t .struct_iovec)
add_header(rpc_opcodes_t HDR rpc_opcodes_t.h)
add_header(ACTION HDR ACTION.h)
add_header(ENTRY HDR ENTRY.h)
diff --git a/libc/include/llvm-libc-types/struct_iovec.h b/libc/include/llvm-libc-types/struct_iovec.h
new file mode 100644
index 00000000000000..db2ca64cc1a1d7
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_iovec.h
@@ -0,0 +1,19 @@
+//===-- Definition of struct iovec ----------------------------------------===//
+//
+// 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_TYPES_STRUCT_IOVEC_H
+#define LLVM_LIBC_TYPES_STRUCT_IOVEC_H
+
+#include "size_t.h"
+
+struct iovec {
+ void *iov_base;
+ size_t iov_len;
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_IOVEC_H
diff --git a/libc/include/llvm-libc-types/struct_msghdr.h b/libc/include/llvm-libc-types/struct_msghdr.h
new file mode 100644
index 00000000000000..7933de190f3497
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_msghdr.h
@@ -0,0 +1,26 @@
+//===-- Definition of struct msghdr ---------------------------------------===//
+//
+// 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_TYPES_STRUCT_MSGHDR_H
+#define LLVM_LIBC_TYPES_STRUCT_MSGHDR_H
+
+#include "size_t.h"
+#include "socklen_t.h"
+#include "struct_iovec.h"
+
+struct msghdr {
+ void *msg_name; /* Optional address */
+ socklen_t msg_namelen; /* Size of address */
+ struct iovec *msg_iov; /* Scatter/gather array */
+ size_t msg_iovlen; /* # elements in msg_iov */
+ void *msg_control; /* Ancillary data, see below */
+ size_t msg_controllen; /* Ancillary data buffer len */
+ int msg_flags; /* Flags (unused) */
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_MSGHDR_H
diff --git a/libc/newhdrgen/yaml/sys/socket.yaml b/libc/newhdrgen/yaml/sys/socket.yaml
index 3b8bf4cecfe5aa..accb4b14099e82 100644
--- a/libc/newhdrgen/yaml/sys/socket.yaml
+++ b/libc/newhdrgen/yaml/sys/socket.yaml
@@ -5,9 +5,21 @@ types:
- type_name: struct_sockaddr
- type_name: socklen_t
- type_name: sa_family_t
+ - type_name: struct_msghdr
+ - type_name: struct_iovec
+ - type_name: size_t
+ - type_name: ssize_t
enums: []
objects: []
functions:
+ - name: accept
+ standards:
+ - POSIX
+ return_type: int
+ arguments:
+ - type: int
+ - type: sockaddr *__restrict
+ - type: socklen_t *__restrict
- name: bind
standards:
- POSIX
@@ -16,6 +28,77 @@ functions:
- type: int
- type: const struct sockaddr *
- type: socklen_t
+ - name: connect
+ standards:
+ - POSIX
+ return_type: int
+ arguments:
+ - type: int
+ - type: const struct sockaddr *
+ - type: socklen_t
+ - name: listen
+ standards:
+ - POSIX
+ return_type: int
+ arguments:
+ - type: int
+ - type: int
+ - name: recv
+ standards:
+ - POSIX
+ return_type: ssize_t
+ arguments:
+ - type: int
+ - type: const void *
+ - type: size_t
+ - type: int
+ - name: recvfrom
+ standards:
+ - POSIX
+ return_type: ssize_t
+ arguments:
+ - type: int
+ - type: const void*
+ - type: size_t
+ - type: int
+ - type: const struct sockaddr *
+ - type: socklen_t
+ - name: recvmsg
+ standards:
+ - POSIX
+ return_type: ssize_t
+ arguments:
+ - type: int
+ - type: const struct msghdr *
+ - type: int
+ - name: send
+ standards:
+ - POSIX
+ return_type: ssize_t
+ arguments:
+ - type: int
+ - type: const void*
+ - type: size_t
+ - type: int
+ - name: sendmsg
+ standards:
+ - POSIX
+ return_type: ssize_t
+ arguments:
+ - type: int
+ - type: const struct msghdr *
+ - type: int
+ - name: sendto
+ standards:
+ - POSIX
+ return_type: ssize_t
+ arguments:
+ - type: int
+ - type: const void *
+ - type: size_t
+ - type: int
+ - type: const struct sockaddr *
+ - type: socklen_t
- name: socket
standards:
- POSIX
@@ -24,3 +107,12 @@ functions:
- type: int
- type: int
- type: int
+ - name: socketpair
+ standards:
+ - posix
+ return_type: int
+ arguments:
+ - type: int
+ - type: int
+ - type: int
+ - type: int*
diff --git a/libc/spec/posix.td b/libc/spec/posix.td
index 085f2ec34ab346..beede79a38ec24 100644
--- a/libc/spec/posix.td
+++ b/libc/spec/posix.td
@@ -80,11 +80,20 @@ def GetoptArgvT : NamedType<"__getoptargv_t">;
def SAFamilyType : NamedType<"sa_family_t">;
def SocklenType : NamedType<"socklen_t">;
+def SocklenPtr : PtrType<SocklenType>;
def StructSockAddr : NamedType<"struct sockaddr">;
def StructSockAddrPtr : PtrType<StructSockAddr>;
def ConstStructSockAddrPtr : ConstType<StructSockAddrPtr>;
+def StructMsghdr : NamedType<"struct msghdr">;
+def StructMsghdrPtr : PtrType<StructMsghdr>;
+def ConstStructMsghdrPtr : ConstType<StructMsghdrPtr>;
+
+def StructIovec : NamedType<"struct iovec">;
+def StructIovecPtr : PtrType<StructIovec>;
+def ConstStructIovecPtr : ConstType<StructIovecPtr>;
+
def StructSockAddrUn : NamedType<"struct sockaddr_un">;
def StructStatvfs : NamedType<"struct statvfs">;
@@ -1711,10 +1720,14 @@ def POSIX : StandardSpec<"POSIX"> {
Macro<"SOCK_PACKET">,
], // Macros
[
+ SizeTType,
+ SSizeTType,
SAFamilyType,
StructSockAddr,
StructSockAddrUn,
SocklenType,
+ StructIovec,
+ StructMsghdr,
], // Types
[], // Enumerations
[
@@ -1723,11 +1736,54 @@ def POSIX : StandardSpec<"POSIX"> {
RetValSpec<IntType>,
[ArgSpec<IntType>, ArgSpec<IntType>, ArgSpec<IntType>]
>,
+ FunctionSpec<
+ "socketpair",
+ RetValSpec<IntType>,
+ [ArgSpec<IntType>, ArgSpec<IntType>, ArgSpec<IntType>, ArgSpec<IntPtr>]
+ >,
FunctionSpec<
"bind",
RetValSpec<IntType>,
[ArgSpec<IntType>, ArgSpec<ConstStructSockAddrPtr>, ArgSpec<SocklenType>]
>,
+ FunctionSpec<
+ "send",
+ RetValSpec<SSizeTType>,
+ [ArgSpec<IntType>, ArgSpec<ConstVoidPtr>, ArgSpec<SizeTType>, ArgSpec<IntType>]
+ >,
+ FunctionSpec<
+ "sendto",
+ RetValSpec<SSizeTType>,
+ [
+ ArgSpec<IntType>, ArgSpec<ConstVoidPtr>, ArgSpec<SizeTType>,
+ ArgSpec<IntType>, ArgSpec<ConstStructSockAddrPtr>,
+ ArgSpec<SocklenType>
+ ]
+ >,
+ FunctionSpec<
+ "sendmsg",
+ RetValSpec<SSizeTType>,
+ [ArgSpec<IntType>, ArgSpec<ConstStructMsghdrPtr>, ArgSpec<IntType>]
+ >,
+ FunctionSpec<
+ "recv",
+ RetValSpec<SSizeTType>,
+ [ArgSpec<IntType>, ArgSpec<VoidPtr>, ArgSpec<SizeTType>, ArgSpec<IntType>]
+ >,
+ FunctionSpec<
+ "recvfrom",
+ RetValSpec<SSizeTType>,
+ [
+ ArgSpec<IntType>, ArgSpec<VoidPtr>, ArgSpec<SizeTType>,
+ ArgSpec<IntType>, ArgSpec<StructSockAddrPtr>,
+ ArgSpec<SocklenPtr>
+ ]
+ >,
+ FunctionSpec<
+ "recvmsg",
+ RetValSpec<SSizeTType>,
+ [ArgSpec<IntType>, ArgSpec<StructMsghdrPtr>, ArgSpec<IntType>]
+ >,
] // Functions
>;
diff --git a/libc/src/sys/socket/CMakeLists.txt b/libc/src/sys/socket/CMakeLists.txt
index e0bc48735a0314..e283c12abef378 100644
--- a/libc/src/sys/socket/CMakeLists.txt
+++ b/libc/src/sys/socket/CMakeLists.txt
@@ -10,8 +10,50 @@ add_entrypoint_object(
)
add_entrypoint_object(
- bind
+ socketpair
ALIAS
DEPENDS
- .${LIBC_TARGET_OS}.bind
+ .${LIBC_TARGET_OS}.socketpair
+)
+
+add_entrypoint_object(
+ send
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.send
+)
+
+add_entrypoint_object(
+ sendto
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.sendto
+)
+
+add_entrypoint_object(
+ sendmsg
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.sendmsg
+)
+
+add_entrypoint_object(
+ recv
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.recv
+)
+
+add_entrypoint_object(
+ recvfrom
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.recvfrom
+)
+
+add_entrypoint_object(
+ recvmsg
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.recvmsg
)
diff --git a/libc/src/sys/socket/linux/CMakeLists.txt b/libc/src/sys/socket/linux/CMakeLists.txt
index fc9febdec2cc3c..5ced5c5e310d6e 100644
--- a/libc/src/sys/socket/linux/CMakeLists.txt
+++ b/libc/src/sys/socket/linux/CMakeLists.txt
@@ -12,14 +12,95 @@ add_entrypoint_object(
)
add_entrypoint_object(
- bind
+ socketpair
SRCS
- bind.cpp
+ socketpair.cpp
HDRS
- ../bind.h
+ ../socketpair.h
DEPENDS
libc.include.sys_syscall
libc.include.sys_socket
libc.src.__support.OSUtil.osutil
libc.src.errno.errno
)
+
+add_entrypoint_object(
+ send
+ SRCS
+ send.cpp
+ HDRS
+ ../send.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.hdr.types.struct_sockaddr
+ libc.hdr.types.socklen_t
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ sendto
+ SRCS
+ sendto.cpp
+ HDRS
+ ../sendto.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.hdr.types.struct_sockaddr
+ libc.hdr.types.socklen_t
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ sendmsg
+ SRCS
+ sendmsg.cpp
+ HDRS
+ ../sendmsg.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.hdr.types.struct_msghdr
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+add_entrypoint_object(
+ recv
+ SRCS
+ recv.cpp
+ HDRS
+ ../recv.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.hdr.types.struct_sockaddr
+ libc.hdr.types.socklen_t
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ recvfrom
+ SRCS
+ recvfrom.cpp
+ HDRS
+ ../recvfrom.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.hdr.types.struct_sockaddr
+ libc.hdr.types.socklen_t
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ recvmsg
+ SRCS
+ recvmsg.cpp
+ HDRS
+ ../recvmsg.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.hdr.types.struct_msghdr
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
diff --git a/libc/src/sys/socket/linux/recv.cpp b/libc/src/sys/socket/linux/recv.cpp
new file mode 100644
index 00000000000000..96acf449dc4bfd
--- /dev/null
+++ b/libc/src/sys/socket/linux/recv.cpp
@@ -0,0 +1,47 @@
+//===-- Linux implementation of recv --------------------------------------===//
+//
+// 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/sys/socket/recv.h"
+
+#include "hdr/types/socklen_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_sockaddr.h"
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(ssize_t, recv,
+ (int sockfd, const void *buf, size_t len, int flags)) {
+#ifdef SYS_recv
+ ssize_t ret =
+ LIBC_NAMESPACE::syscall_impl<int>(SYS_recv, sockfd, buf, len, flags);
+#elif defined(SYS_recvfrom)
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_recvfrom, sockfd,
+ reinterpret_cast<long>(buf),
+ len, flags, nullptr, 0);
+#elif defined(SYS_socketcall)
+ unsigned long sockcall_args[4] = {
+ static_cast<unsigned long>(sockfd), reinterpret_cast<unsigned long>(buf),
+ static_cast<unsigned long>(len), static_cast<unsigned long>(flags)};
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_RECV,
+ sockcall_args);
+#else
+#error "socket and socketcall syscalls unavailable for this platform."
+#endif
+ if (ret < 0) {
+ libc_errno = static_cast<int>(-ret);
+ return -1;
+ }
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/socket/linux/recvfrom.cpp b/libc/src/sys/socket/linux/recvfrom.cpp
new file mode 100644
index 00000000000000..17489a99c922dc
--- /dev/null
+++ b/libc/src/sys/socket/linux/recvfrom.cpp
@@ -0,0 +1,49 @@
+//===-- Linux implementation of recvfrom ----------------------------------===//
+//
+// 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/sys/socket/recvfrom.h"
+
+#include "hdr/types/socklen_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_sockaddr.h"
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(ssize_t, recvfrom,
+ (int sockfd, const void *buf, size_t len, int flags,
+ const struct sockaddr *dest_addr, socklen_t addrlen)) {
+#ifdef SYS_recvfrom
+
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
+ SYS_recvfrom, sockfd, reinterpret_cast<long>(buf), len, flags,
+ reinterpret_cast<long>(dest_addr), addrlen);
+#elif defined(SYS_socketcall)
+ unsigned long sockcall_args[6] = {static_cast<unsigned long>(sockfd),
+ reinterpret_cast<unsigned long>(buf),
+ static_cast<unsigned long>(len),
+ static_cast<unsigned long>(flags),
+ reinterpret_cast<unsigned long>(dest_addr),
+ static_cast<unsigned long>(addrlen)};
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_RECVFROM,
+ sockcall_args);
+#else
+#error "socket and socketcall syscalls unavailable for this platform."
+#endif
+ if (ret < 0) {
+ libc_errno = static_cast<int>(-ret);
+ return -1;
+ }
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/socket/linux/recvmsg.cpp b/libc/src/sys/socket/linux/recvmsg.cpp
new file mode 100644
index 00000000000000..60045d6a80f535
--- /dev/null
+++ b/libc/src/sys/socket/linux/recvmsg.cpp
@@ -0,0 +1,42 @@
+//===-- Linux implementation of recvmsg -----------------------------------===//
+//
+// 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/sys/socket/recvmsg.h"
+
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_msghdr.h"
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(ssize_t, recvmsg,
+ (int sockfd, const struct msghdr *msg, int flags)) {
+#ifdef SYS_recvmsg
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
+ SYS_recvmsg, sockfd, reinterpret_cast<long>(msg), flags);
+#elif defined(SYS_socketcall)
+ unsigned long sockcall_args[3] = {static_cast<unsigned long>(sockfd),
+ reinterpret_cast<unsigned long>(msg),
+ static_cast<unsigned long>(flags)};
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_RECVMSG,
+ sockcall_args);
+#else
+#error "socket and socketcall syscalls unavailable for this platform."
+#endif
+ if (ret < 0) {
+ libc_errno = static_cast<int>(-ret);
+ return -1;
+ }
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/socket/linux/send.cpp b/libc/src/sys/socket/linux/send.cpp
new file mode 100644
index 00000000000000..0d29b6fd35b903
--- /dev/null
+++ b/libc/src/sys/socket/linux/send.cpp
@@ -0,0 +1,46 @@
+//===-- Linux implementation of send --------------------------------------===//
+//
+// 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/sys/socket/send.h"
+
+#include "hdr/types/socklen_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_sockaddr.h"
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(ssize_t, send,
+ (int sockfd, const void *buf, size_t len, int flags)) {
+#ifdef SYS_send
+ ssize_t ret =
+ LIBC_NAMESPACE::syscall_impl<int>(SYS_send, sockfd, buf, len, flags);
+#elif defined(SYS_sendto)
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
+ SYS_sendto, sockfd, reinterpret_cast<long>(buf), len, flags, nullptr, 0);
+#elif defined(SYS_socketcall)
+ unsigned long sockcall_args[4] = {
+ static_cast<unsigned long>(sockfd), reinterpret_cast<unsigned long>(buf),
+ static_cast<unsigned long>(len), static_cast<unsigned long>(flags)};
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_SEND,
+ sockcall_args);
+#else
+#error "socket and socketcall syscalls unavailable for this platform."
+#endif
+ if (ret < 0) {
+ libc_errno = static_cast<int>(-ret);
+ return -1;
+ }
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/socket/linux/sendmsg.cpp b/libc/src/sys/socket/linux/sendmsg.cpp
new file mode 100644
index 00000000000000..ba2b37768cc246
--- /dev/null
+++ b/libc/src/sys/socket/linux/sendmsg.cpp
@@ -0,0 +1,42 @@
+//===-- Linux implementation of sendmsg -----------------------------------===//
+//
+// 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/sys/socket/sendmsg.h"
+
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_msghdr.h"
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(ssize_t, sendmsg,
+ (int sockfd, const struct msghdr *msg, int flags)) {
+#ifdef SYS_sendmsg
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
+ SYS_sendmsg, sockfd, reinterpret_cast<long>(msg), flags);
+#elif defined(SYS_socketcall)
+ unsigned long sockcall_args[3] = {static_cast<unsigned long>(sockfd),
+ reinterpret_cast<unsigned long>(msg),
+ static_cast<unsigned long>(flags)};
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_SENDMSG,
+ sockcall_args);
+#else
+#error "socket and socketcall syscalls unavailable for this platform."
+#endif
+ if (ret < 0) {
+ libc_errno = static_cast<int>(-ret);
+ return -1;
+ }
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/socket/linux/sendto.cpp b/libc/src/sys/socket/linux/sendto.cpp
new file mode 100644
index 00000000000000..f5c3ffe8954da9
--- /dev/null
+++ b/libc/src/sys/socket/linux/sendto.cpp
@@ -0,0 +1,49 @@
+//===-- Linux implementation of sendto ------------------------------------===//
+//
+// 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/sys/socket/sendto.h"
+
+#include "hdr/types/socklen_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_sockaddr.h"
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(ssize_t, sendto,
+ (int sockfd, const void *buf, size_t len, int flags,
+ const struct sockaddr *dest_addr, socklen_t addrlen)) {
+#ifdef SYS_sendto
+
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
+ SYS_sendto, sockfd, reinterpret_cast<long>(buf), len, flags,
+ reinterpret_cast<long>(dest_addr), addrlen);
+#elif defined(SYS_socketcall)
+ unsigned long sockcall_args[6] = {static_cast<unsigned long>(sockfd),
+ reinterpret_cast<unsigned long>(buf),
+ static_cast<unsigned long>(len),
+ static_cast<unsigned long>(flags),
+ reinterpret_cast<unsigned long>(dest_addr),
+ static_cast<unsigned long>(addrlen)};
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_SENDTO,
+ sockcall_args);
+#else
+#error "socket and socketcall syscalls unavailable for this platform."
+#endif
+ if (ret < 0) {
+ libc_errno = static_cast<int>(-ret);
+ return -1;
+ }
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/socket/linux/bind.cpp b/libc/src/sys/socket/linux/socketpair.cpp
similarity index 62%
rename from libc/src/sys/socket/linux/bind.cpp
rename to libc/src/sys/socket/linux/socketpair.cpp
index 3289e9f0852e86..d459a74433906d 100644
--- a/libc/src/sys/socket/linux/bind.cpp
+++ b/libc/src/sys/socket/linux/socketpair.cpp
@@ -1,4 +1,4 @@
-//===-- Linux implementation of bind --------------------------------------===//
+//===-- Linux implementation of socketpair --------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/sys/socket/bind.h"
+#include "src/sys/socket/socketpair.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
@@ -19,17 +19,16 @@
namespace LIBC_NAMESPACE_DECL {
-LLVM_LIBC_FUNCTION(int, bind,
- (int domain, const struct sockaddr *address,
- socklen_t address_len)) {
-#ifdef SYS_socket
- int ret =
- LIBC_NAMESPACE::syscall_impl<int>(SYS_bind, domain, address, address_len);
+LLVM_LIBC_FUNCTION(int, socketpair,
+ (int domain, int type, int protocol, int sv[2])) {
+#ifdef SYS_socketpair
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketpair, domain, type,
+ protocol, sv);
#elif defined(SYS_socketcall)
- unsigned long sockcall_args[3] = {static_cast<unsigned long>(domain),
- reinterpret_cast<unsigned long>(address),
- static_cast<unsigned long>(address_len)};
- int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_BIND,
+ unsigned long sockcall_args[3] = {
+ static_cast<unsigned long>(domain), static_cast<unsigned long>(type),
+ static_cast<unsigned long>(protocol), static_cast<unsigned long>(sv)};
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_SOCKETPAIR,
sockcall_args);
#else
#error "socket and socketcall syscalls unavailable for this platform."
diff --git a/libc/src/sys/socket/bind.h b/libc/src/sys/socket/recv.h
similarity index 62%
rename from libc/src/sys/socket/bind.h
rename to libc/src/sys/socket/recv.h
index 1676ab6a003ad9..093e8ca9b12304 100644
--- a/libc/src/sys/socket/bind.h
+++ b/libc/src/sys/socket/recv.h
@@ -1,4 +1,4 @@
-//===-- Implementation header for bind --------------------------*- C++ -*-===//
+//===-- Implementation header for recv --------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,16 +6,16 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_SYS_SOCKET_BIND_H
-#define LLVM_LIBC_SRC_SYS_SOCKET_BIND_H
+#ifndef LLVM_LIBC_SRC_SYS_SOCKET_RECV_H
+#define LLVM_LIBC_SRC_SYS_SOCKET_RECV_H
#include "src/__support/macros/config.h"
#include <sys/socket.h>
namespace LIBC_NAMESPACE_DECL {
-int bind(int domain, const struct sockaddr *address, socklen_t address_len);
+ssize_t recv(int sockfd, const void *buf, size_t len, int flags);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_SYS_SOCKET_BIND_H
+#endif // LLVM_LIBC_SRC_SYS_SOCKET_RECV_H
diff --git a/libc/src/sys/socket/recvfrom.h b/libc/src/sys/socket/recvfrom.h
new file mode 100644
index 00000000000000..ee8d52157b705d
--- /dev/null
+++ b/libc/src/sys/socket/recvfrom.h
@@ -0,0 +1,25 @@
+//===-- Implementation header for recvfrom ----------------------*- 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_SYS_SOCKET_RECVFROM_H
+#define LLVM_LIBC_SRC_SYS_SOCKET_RECVFROM_H
+
+#include "hdr/types/socklen_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_sockaddr.h"
+#include "src/__support/macros/config.h"
+#include <stddef.h> // For size_t
+
+namespace LIBC_NAMESPACE_DECL {
+
+ssize_t recvfrom(int sockfd, const void *buf, size_t len, int flags,
+ const struct sockaddr *address, socklen_t addrlen);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_SOCKET_RECVFROM_H
diff --git a/libc/src/sys/socket/recvmsg.h b/libc/src/sys/socket/recvmsg.h
new file mode 100644
index 00000000000000..a506fb0ae68fa0
--- /dev/null
+++ b/libc/src/sys/socket/recvmsg.h
@@ -0,0 +1,22 @@
+//===-- Implementation header for recvmsg -----------------------*- 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_SYS_SOCKET_RECVMSG_H
+#define LLVM_LIBC_SRC_SYS_SOCKET_RECVMSG_H
+
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_msghdr.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+ssize_t recvmsg(int sockfd, const struct msghdr *msg, int flags);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_SOCKET_RECVMSG_H
diff --git a/libc/src/sys/socket/send.h b/libc/src/sys/socket/send.h
new file mode 100644
index 00000000000000..e1706694cd5f5d
--- /dev/null
+++ b/libc/src/sys/socket/send.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for send --------------------------*- 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_SYS_SOCKET_SEND_H
+#define LLVM_LIBC_SRC_SYS_SOCKET_SEND_H
+
+#include "src/__support/macros/config.h"
+#include <sys/socket.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+ssize_t send(int sockfd, const void *buf, size_t len, int flags);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_SOCKET_SEND_H
diff --git a/libc/src/sys/socket/sendmsg.h b/libc/src/sys/socket/sendmsg.h
new file mode 100644
index 00000000000000..c11f3bd4beb596
--- /dev/null
+++ b/libc/src/sys/socket/sendmsg.h
@@ -0,0 +1,22 @@
+//===-- Implementation header for sendmsg -----------------------*- 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_SYS_SOCKET_SENDMSG_H
+#define LLVM_LIBC_SRC_SYS_SOCKET_SENDMSG_H
+
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_msghdr.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_SOCKET_SENDMSG_H
diff --git a/libc/src/sys/socket/sendto.h b/libc/src/sys/socket/sendto.h
new file mode 100644
index 00000000000000..6e5e6d4cdab66f
--- /dev/null
+++ b/libc/src/sys/socket/sendto.h
@@ -0,0 +1,25 @@
+//===-- Implementation header for sendto ------------------------*- 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_SYS_SOCKET_SENDTO_H
+#define LLVM_LIBC_SRC_SYS_SOCKET_SENDTO_H
+
+#include "hdr/types/socklen_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/types/struct_sockaddr.h"
+#include "src/__support/macros/config.h"
+#include <stddef.h> // For size_t
+
+namespace LIBC_NAMESPACE_DECL {
+
+ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
+ const struct sockaddr *dest_addr, socklen_t addrlen);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_SOCKET_SENDTO_H
diff --git a/libc/src/sys/socket/socketpair.h b/libc/src/sys/socket/socketpair.h
new file mode 100644
index 00000000000000..1d847c3284708b
--- /dev/null
+++ b/libc/src/sys/socket/socketpair.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for socketpair --------------------*- 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_SYS_SOCKET_SOCKETPAIR_H
+#define LLVM_LIBC_SRC_SYS_SOCKET_SOCKETPAIR_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int socketpair(int domain, int type, int protocol, int sv[2]);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_SOCKET_SOCKETPAIR_H
diff --git a/libc/test/src/sys/socket/linux/CMakeLists.txt b/libc/test/src/sys/socket/linux/CMakeLists.txt
index 666dc28c7e4ee1..acbf26c45af981 100644
--- a/libc/test/src/sys/socket/linux/CMakeLists.txt
+++ b/libc/test/src/sys/socket/linux/CMakeLists.txt
@@ -13,18 +13,60 @@ add_libc_unittest(
libc.src.unistd.close
)
+add_libc_unittest(
+ socketpair_test
+ SUITE
+ libc_sys_socket_unittests
+ SRCS
+ socketpair_test.cpp
+ DEPENDS
+ libc.include.sys_socket
+ libc.src.errno.errno
+ libc.src.sys.socket.socketpair
+ libc.src.unistd.close
+)
add_libc_unittest(
- bind_test
+ send_recv_test
SUITE
libc_sys_socket_unittests
SRCS
- bind_test.cpp
+ send_recv_test.cpp
DEPENDS
libc.include.sys_socket
libc.src.errno.errno
- libc.src.sys.socket.socket
- libc.src.sys.socket.bind
- libc.src.stdio.remove
+ libc.src.sys.socket.socketpair
+ libc.src.sys.socket.send
+ libc.src.sys.socket.recv
+ libc.src.unistd.close
+)
+
+add_libc_unittest(
+ sendto_recvfrom_test
+ SUITE
+ libc_sys_socket_unittests
+ SRCS
+ sendto_recvfrom_test.cpp
+ DEPENDS
+ libc.include.sys_socket
+ libc.src.errno.errno
+ libc.src.sys.socket.socketpair
+ libc.src.sys.socket.sendto
+ libc.src.sys.socket.recvfrom
+ libc.src.unistd.close
+)
+
+add_libc_unittest(
+ sendmsg_recvmsg_test
+ SUITE
+ libc_sys_socket_unittests
+ SRCS
+ sendmsg_recvmsg_test.cpp
+ DEPENDS
+ libc.include.sys_socket
+ libc.src.errno.errno
+ libc.src.sys.socket.socketpair
+ libc.src.sys.socket.sendmsg
+ libc.src.sys.socket.recvmsg
libc.src.unistd.close
)
diff --git a/libc/test/src/sys/socket/linux/bind_test.cpp b/libc/test/src/sys/socket/linux/bind_test.cpp
deleted file mode 100644
index e70cbd578290ba..00000000000000
--- a/libc/test/src/sys/socket/linux/bind_test.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-//===-- Unittests for bind ------------------------------------------------===//
-//
-// 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/sys/socket/bind.h"
-#include "src/sys/socket/socket.h"
-
-#include "src/stdio/remove.h"
-#include "src/unistd/close.h"
-
-#include "src/errno/libc_errno.h"
-#include "test/UnitTest/Test.h"
-
-#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
-
-TEST(LlvmLibcSocketTest, BindLocalSocket) {
-
- const char *FILENAME = "bind_file.test";
- auto SOCK_PATH = libc_make_test_file_path(FILENAME);
-
- int sock = LIBC_NAMESPACE::socket(AF_UNIX, SOCK_DGRAM, 0);
- ASSERT_GE(sock, 0);
- ASSERT_ERRNO_SUCCESS();
-
- struct sockaddr_un my_addr;
-
- my_addr.sun_family = AF_UNIX;
- unsigned int i = 0;
- for (;
- SOCK_PATH[i] != '\0' && (i < sizeof(sockaddr_un) - sizeof(sa_family_t));
- ++i)
- my_addr.sun_path[i] = SOCK_PATH[i];
- my_addr.sun_path[i] = '\0';
-
- // It's important that the path fits in the struct, if it doesn't then we
- // can't try to bind to the file.
- ASSERT_LT(
- i, static_cast<unsigned int>(sizeof(sockaddr_un) - sizeof(sa_family_t)));
-
- int result =
- LIBC_NAMESPACE::bind(sock, reinterpret_cast<struct sockaddr *>(&my_addr),
- sizeof(struct sockaddr_un));
-
- ASSERT_EQ(result, 0);
- ASSERT_ERRNO_SUCCESS();
-
- LIBC_NAMESPACE::close(sock);
-
- LIBC_NAMESPACE::remove(SOCK_PATH);
-}
diff --git a/libc/test/src/sys/socket/linux/send_recv_test.cpp b/libc/test/src/sys/socket/linux/send_recv_test.cpp
new file mode 100644
index 00000000000000..a5d4880d934cc7
--- /dev/null
+++ b/libc/test/src/sys/socket/linux/send_recv_test.cpp
@@ -0,0 +1,73 @@
+//===-- Unittests for send/recv -------------------------------------------===//
+//
+// 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/sys/socket/recv.h"
+#include "src/sys/socket/send.h"
+#include "src/sys/socket/socketpair.h"
+
+#include "src/unistd/close.h"
+
+#include "src/errno/libc_errno.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
+
+TEST(LlvmLibcSendRecvTest, SucceedsWithSocketPair) {
+ const char TEST_MESSAGE[] = "connection successful";
+ const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
+
+ int sockpair[2] = {0, 0};
+
+ int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ ssize_t send_result =
+ LIBC_NAMESPACE::send(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 0);
+ EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN));
+ ASSERT_ERRNO_SUCCESS();
+
+ char buffer[256];
+
+ ssize_t recv_result =
+ LIBC_NAMESPACE::recv(sockpair[1], buffer, sizeof(buffer), 0);
+ ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN));
+ ASSERT_ERRNO_SUCCESS();
+
+ ASSERT_STREQ(buffer, TEST_MESSAGE);
+
+ // close both ends of the socket
+ result = LIBC_NAMESPACE::close(sockpair[0]);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ result = LIBC_NAMESPACE::close(sockpair[1]);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+}
+
+TEST(LlvmLibcSendRecvTest, SendFails) {
+ const char TEST_MESSAGE[] = "connection terminated";
+ const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
+
+ ssize_t send_result = LIBC_NAMESPACE::send(-1, TEST_MESSAGE, MESSAGE_LEN, 0);
+ EXPECT_EQ(send_result, ssize_t(-1));
+ ASSERT_ERRNO_FAILURE();
+
+ LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+}
+
+TEST(LlvmLibcSendRecvTest, RecvFails) {
+ char buffer[256];
+
+ ssize_t recv_result = LIBC_NAMESPACE::recv(-1, buffer, sizeof(buffer), 0);
+ ASSERT_EQ(recv_result, ssize_t(-1));
+ ASSERT_ERRNO_FAILURE();
+
+ LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+}
diff --git a/libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp b/libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp
new file mode 100644
index 00000000000000..abcb0a3e6e5062
--- /dev/null
+++ b/libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp
@@ -0,0 +1,125 @@
+//===-- Unittests for sendmsg/recvmsg -------------------------------------===//
+//
+// 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/sys/socket/recvmsg.h"
+#include "src/sys/socket/sendmsg.h"
+#include "src/sys/socket/socketpair.h"
+
+#include "src/unistd/close.h"
+
+#include "src/errno/libc_errno.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
+
+TEST(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
+ const char TEST_MESSAGE[] = "connection successful";
+ const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
+
+ int sockpair[2] = {0, 0};
+
+ int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ iovec send_msg_text;
+ send_msg_text.iov_base =
+ reinterpret_cast<void *>(const_cast<char *>(TEST_MESSAGE));
+ send_msg_text.iov_len = MESSAGE_LEN;
+
+ msghdr send_message;
+ send_message.msg_name = nullptr;
+ send_message.msg_namelen = 0;
+ send_message.msg_iov = &send_msg_text;
+ send_message.msg_iovlen = 1;
+ send_message.msg_control = nullptr;
+ send_message.msg_controllen = 0;
+ send_message.msg_flags = 0;
+
+ ssize_t send_result = LIBC_NAMESPACE::sendmsg(sockpair[0], &send_message, 0);
+ EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN));
+ ASSERT_ERRNO_SUCCESS();
+
+ char buffer[256];
+
+ iovec recv_msg_text;
+ recv_msg_text.iov_base = reinterpret_cast<void *>(buffer);
+ recv_msg_text.iov_len = sizeof(buffer);
+
+ msghdr recv_message;
+ recv_message.msg_name = nullptr;
+ recv_message.msg_namelen = 0;
+ recv_message.msg_iov = &recv_msg_text;
+ recv_message.msg_iovlen = 1;
+ recv_message.msg_control = nullptr;
+ recv_message.msg_controllen = 0;
+ recv_message.msg_flags = 0;
+
+ ssize_t recv_result = LIBC_NAMESPACE::recvmsg(sockpair[1], &recv_message, 0);
+ ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN));
+ ASSERT_ERRNO_SUCCESS();
+
+ ASSERT_STREQ(buffer, TEST_MESSAGE);
+
+ // close both ends of the socket
+ result = LIBC_NAMESPACE::close(sockpair[0]);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ result = LIBC_NAMESPACE::close(sockpair[1]);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+}
+
+TEST(LlvmLibcSendMsgRecvMsgTest, SendFails) {
+ const char TEST_MESSAGE[] = "connection terminated";
+ const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
+
+ iovec send_msg_text;
+ send_msg_text.iov_base =
+ reinterpret_cast<void *>(const_cast<char *>(TEST_MESSAGE));
+ send_msg_text.iov_len = MESSAGE_LEN;
+
+ msghdr send_message;
+ send_message.msg_name = nullptr;
+ send_message.msg_namelen = 0;
+ send_message.msg_iov = &send_msg_text;
+ send_message.msg_iovlen = 1;
+ send_message.msg_control = nullptr;
+ send_message.msg_controllen = 0;
+ send_message.msg_flags = 0;
+
+ ssize_t send_result = LIBC_NAMESPACE::sendmsg(-1, &send_message, 0);
+ EXPECT_EQ(send_result, ssize_t(-1));
+ ASSERT_ERRNO_FAILURE();
+
+ LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+}
+
+TEST(LlvmLibcSendMsgRecvMsgTest, RecvFails) {
+ char buffer[256];
+
+ iovec recv_msg_text;
+ recv_msg_text.iov_base = reinterpret_cast<void *>(buffer);
+ recv_msg_text.iov_len = sizeof(buffer);
+
+ msghdr recv_message;
+ recv_message.msg_name = nullptr;
+ recv_message.msg_namelen = 0;
+ recv_message.msg_iov = &recv_msg_text;
+ recv_message.msg_iovlen = 1;
+ recv_message.msg_control = nullptr;
+ recv_message.msg_controllen = 0;
+ recv_message.msg_flags = 0;
+
+ ssize_t recv_result = LIBC_NAMESPACE::recvmsg(-1, &recv_message, 0);
+ ASSERT_EQ(recv_result, ssize_t(-1));
+ ASSERT_ERRNO_FAILURE();
+
+ LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+}
diff --git a/libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp b/libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp
new file mode 100644
index 00000000000000..e91b333deac581
--- /dev/null
+++ b/libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp
@@ -0,0 +1,75 @@
+//===-- Unittests for sendto/recvfrom -------------------------------------===//
+//
+// 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/sys/socket/recvfrom.h"
+#include "src/sys/socket/sendto.h"
+#include "src/sys/socket/socketpair.h"
+
+#include "src/unistd/close.h"
+
+#include "src/errno/libc_errno.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
+
+TEST(LlvmLibcSendToRecvFromTest, SucceedsWithSocketPair) {
+ const char TEST_MESSAGE[] = "connection successful";
+ const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
+
+ int sockpair[2] = {0, 0};
+
+ int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ ssize_t send_result = LIBC_NAMESPACE::sendto(sockpair[0], TEST_MESSAGE,
+ MESSAGE_LEN, 0, nullptr, 0);
+ EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN));
+ ASSERT_ERRNO_SUCCESS();
+
+ char buffer[256];
+
+ ssize_t recv_result = LIBC_NAMESPACE::recvfrom(sockpair[1], buffer,
+ sizeof(buffer), 0, nullptr, 0);
+ ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN));
+ ASSERT_ERRNO_SUCCESS();
+
+ ASSERT_STREQ(buffer, TEST_MESSAGE);
+
+ // close both ends of the socket
+ result = LIBC_NAMESPACE::close(sockpair[0]);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ result = LIBC_NAMESPACE::close(sockpair[1]);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+}
+
+TEST(LlvmLibcSendToRecvFromTest, SendToFails) {
+ const char TEST_MESSAGE[] = "connection terminated";
+ const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
+
+ ssize_t send_result =
+ LIBC_NAMESPACE::sendto(-1, TEST_MESSAGE, MESSAGE_LEN, 0, nullptr, 0);
+ EXPECT_EQ(send_result, ssize_t(-1));
+ ASSERT_ERRNO_FAILURE();
+
+ LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+}
+
+TEST(LlvmLibcSendToRecvFromTest, RecvFromFails) {
+ char buffer[256];
+
+ ssize_t recv_result =
+ LIBC_NAMESPACE::recvfrom(-1, buffer, sizeof(buffer), 0, nullptr, 0);
+ ASSERT_EQ(recv_result, ssize_t(-1));
+ ASSERT_ERRNO_FAILURE();
+
+ LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+}
diff --git a/libc/test/src/sys/socket/linux/socketpair_test.cpp b/libc/test/src/sys/socket/linux/socketpair_test.cpp
new file mode 100644
index 00000000000000..9393ddd5c19d80
--- /dev/null
+++ b/libc/test/src/sys/socket/linux/socketpair_test.cpp
@@ -0,0 +1,37 @@
+//===-- Unittests for socketpair ------------------------------------------===//
+//
+// 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/sys/socket/socketpair.h"
+
+#include "src/unistd/close.h"
+
+#include "src/errno/libc_errno.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
+
+TEST(LlvmLibcSocketPairTest, LocalSocket) {
+ int sockpair[2] = {-1, -1};
+ int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_DGRAM, 0, sockpair);
+ ASSERT_EQ(result, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ ASSERT_GE(sockpair[0], 0);
+ ASSERT_GE(sockpair[1], 0);
+
+ LIBC_NAMESPACE::close(sockpair[0]);
+ LIBC_NAMESPACE::close(sockpair[1]);
+ ASSERT_ERRNO_SUCCESS();
+}
+
+TEST(LlvmLibcSocketPairTest, SocketFails) {
+ int sockpair[2] = {-1, -1};
+ int result = LIBC_NAMESPACE::socketpair(-1, -1, -1, sockpair);
+ ASSERT_EQ(result, -1);
+ ASSERT_ERRNO_FAILURE();
+}
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index f253f69b513354..0e39211988f891 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -217,6 +217,26 @@ libc_support_library(
hdrs = ["hdr/types/FILE.h"],
)
+libc_support_library(
+ name = "types_ssize_t",
+ hdrs = ["hdr/types/ssize_t.h"],
+)
+
+libc_support_library(
+ name = "types_socklen_t",
+ hdrs = ["hdr/types/socklen_t.h"],
+)
+
+libc_support_library(
+ name = "types_struct_sockaddr",
+ hdrs = ["hdr/types/struct_sockaddr.h"],
+)
+
+libc_support_library(
+ name = "types_struct_msghdr",
+ hdrs = ["hdr/types/struct_msghdr.h"],
+)
+
############################### Support libraries ##############################
libc_support_library(
@@ -4153,6 +4173,112 @@ libc_function(
],
)
+############################## sys/socket targets ##############################
+
+libc_function(
+ name = "socket",
+ srcs = ["src/sys/socket/linux/socket.cpp"],
+ hdrs = ["src/sys/socket/socket.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ],
+)
+
+libc_function(
+ name = "socketpair",
+ srcs = ["src/sys/socket/linux/socketpair.cpp"],
+ hdrs = ["src/sys/socket/socketpair.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ],
+)
+
+libc_function(
+ name = "send",
+ srcs = ["src/sys/socket/linux/send.cpp"],
+ hdrs = ["src/sys/socket/send.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ":types_socklen_t",
+ ":types_ssize_t",
+ ":types_struct_sockaddr",
+ ],
+)
+
+libc_function(
+ name = "sendto",
+ srcs = ["src/sys/socket/linux/sendto.cpp"],
+ hdrs = ["src/sys/socket/sendto.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ":types_socklen_t",
+ ":types_ssize_t",
+ ":types_struct_sockaddr",
+ ],
+)
+
+libc_function(
+ name = "sendmsg",
+ srcs = ["src/sys/socket/linux/sendmsg.cpp"],
+ hdrs = ["src/sys/socket/sendmsg.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ":types_ssize_t",
+ ":types_struct_msghdr",
+ ],
+)
+
+libc_function(
+ name = "recv",
+ srcs = ["src/sys/socket/linux/recv.cpp"],
+ hdrs = ["src/sys/socket/recv.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ":types_socklen_t",
+ ":types_ssize_t",
+ ":types_struct_sockaddr",
+ ],
+)
+
+libc_function(
+ name = "recvfrom",
+ srcs = ["src/sys/socket/linux/recvfrom.cpp"],
+ hdrs = ["src/sys/socket/recvfrom.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ":types_socklen_t",
+ ":types_ssize_t",
+ ":types_struct_sockaddr",
+ ],
+)
+
+libc_function(
+ name = "recvmsg",
+ srcs = ["src/sys/socket/linux/recvmsg.cpp"],
+ hdrs = ["src/sys/socket/recvmsg.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ":types_ssize_t",
+ ":types_struct_msghdr",
+ ],
+)
+
############################## sys/epoll targets ###############################
libc_function(
diff --git a/utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel
new file mode 100644
index 00000000000000..865f5e6f496179
--- /dev/null
+++ b/utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel
@@ -0,0 +1,62 @@
+# This file is licensed 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
+
+# Tests for LLVM libc string.h functions.
+
+load("//libc/test:libc_test_rules.bzl", "libc_test")
+
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])
+
+libc_test(
+ name = "socket_test",
+ srcs = ["linux/socket_test.cpp"],
+ libc_function_deps = [
+ "//libc:socket",
+ "//libc:close",
+ ],
+)
+
+libc_test(
+ name = "socketpair_test",
+ srcs = ["linux/socketpair_test.cpp"],
+ libc_function_deps = [
+ "//libc:socketpair",
+ "//libc:close",
+ ],
+)
+
+libc_test(
+ name = "send_recv_test",
+ srcs = ["linux/send_recv_test.cpp"],
+ libc_function_deps = [
+ "//libc:socketpair",
+ "//libc:send",
+ "//libc:recv",
+ "//libc:close",
+ ],
+)
+
+libc_test(
+ name = "sendto_recvfrom_test",
+ srcs = ["linux/sendto_recvfrom_test.cpp"],
+ libc_function_deps = [
+ "//libc:socketpair",
+ "//libc:sendto",
+ "//libc:recvfrom",
+ "//libc:close",
+ ],
+)
+
+libc_test(
+ name = "sendmsg_recvmsg_test",
+ srcs = ["linux/sendmsg_recvmsg_test.cpp"],
+ libc_function_deps = [
+ "//libc:socketpair",
+ "//libc:sendmsg",
+ "//libc:recvmsg",
+ "//libc:close",
+ ],
+)
More information about the libc-commits
mailing list