1 /*
2 * Wrappers for recvmmsg and sendmmsg syscalls.
3 *
4 * Copyright (c) 2016-2018 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2016-2023 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "tests.h"
12 #include <errno.h>
13 #include "scno.h"
14
15 #ifndef __NR_recvmmsg
16 # define __NR_recvmmsg -1
17 #endif
18 #define SC_recvmmsg 19
19
20 #ifndef __NR_sendmmsg
21 # define __NR_sendmmsg -1
22 #endif
23 #define SC_sendmmsg 20
24
25 int
26 recv_mmsg(const int fd, struct mmsghdr *const vec,
27 const unsigned int vlen, const unsigned int flags,
28 kernel_old_timespec_t *const timeout)
29 {
30 int rc = socketcall(__NR_recvmmsg, SC_recvmmsg,
31 fd, (long) vec, vlen, flags, (long) timeout);
32
33 if (rc < 0 && ENOSYS == errno)
34 perror_msg_and_skip("recvmmsg");
35
36 return rc;
37 }
38
39 int
40 send_mmsg(const int fd, struct mmsghdr *const vec,
41 const unsigned int vlen, const unsigned int flags)
42 {
43 int rc = socketcall(__NR_sendmmsg, SC_sendmmsg,
44 fd, (long) vec, vlen, flags, 0);
45
46 if (rc < 0 && ENOSYS == errno)
47 perror_msg_and_skip("sendmmsg");
48
49 return rc;
50 }