socket: Add time64 alias for sendmmsg

Reviewed-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Florian Weimer 2021-07-21 11:42:31 +02:00
parent b39ffab860
commit 8b2c706a9d
25 changed files with 225 additions and 1 deletions

View File

@ -179,9 +179,21 @@ extern ssize_t sendmsg (int __fd, const struct msghdr *__message,
This function is a cancellation point and therefore not marked with
__THROW. */
# ifndef __USE_TIME_BITS64
extern int sendmmsg (int __fd, struct mmsghdr *__vmessages,
unsigned int __vlen, int __flags);
#endif
# else
# ifdef __REDIRECT
extern int __REDIRECT (sendmmsg, (int __fd, struct mmsghdr *__vmessages,
unsigned int __vlen, int __flags),
__sendmmsg64);
# else
extern int __sendmmsg64 (int __fd, struct mmsghdr *__vmessages,
unsigned int __vlen, int __flags);
# define sendmmsg __sendmmsg64
# endif
# endif /* __USE_TIME_BITS64 */
#endif /* __USE_GNU */
/* Receive a message as described by MESSAGE from socket FD.
Returns the number of bytes read or -1 for errors.

View File

@ -122,6 +122,7 @@ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
tst-ntp_gettimex tst-sigtimedwait tst-misalign-clone \
tst-close_range \
tst-prctl \
tst-scm_rights \
# tests
# Test for the symbol version of fcntl that was replaced in glibc 2.28.
@ -141,6 +142,7 @@ tests-time64 += \
tst-sigtimedwait-time64 \
tst-timerfd-time64 \
tst-prctl-time64 \
tst-scm_rights-time64 \
# tests-time64
tests-clone-internal = \

View File

@ -265,6 +265,7 @@ libc {
__semctl64;
__semtimedop64;
__sem_timedwait64;
__sendmmsg64;
__setitimer64;
__settimeofday64;
__shmctl64;

View File

@ -266,6 +266,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -263,6 +263,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2422,6 +2422,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2373,6 +2373,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2557,6 +2557,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -267,6 +267,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2500,6 +2500,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2473,6 +2473,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2470,6 +2470,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2465,6 +2465,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2463,6 +2463,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2471,6 +2471,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2512,6 +2512,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2527,6 +2527,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2560,6 +2560,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2525,6 +2525,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -35,3 +35,6 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
}
libc_hidden_def (__sendmmsg)
weak_alias (__sendmmsg, sendmmsg)
#if __TIMESIZE != 64
weak_alias (__sendmmsg, __sendmmsg64)
#endif

View File

@ -2380,6 +2380,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2377,6 +2377,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -2520,6 +2520,7 @@ GLIBC_2.34 __sem_clockwait64 F
GLIBC_2.34 __sem_timedwait64 F
GLIBC_2.34 __semctl64 F
GLIBC_2.34 __semtimedop64 F
GLIBC_2.34 __sendmmsg64 F
GLIBC_2.34 __setitimer64 F
GLIBC_2.34 __settimeofday64 F
GLIBC_2.34 __shmctl64 F

View File

@ -0,0 +1 @@
#include "tst-scm_rights.c"

View File

@ -0,0 +1,186 @@
/* Smoke test for SCM_RIGHTS.
Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
/* This test passes a file descriptor from a subprocess to the parent
process, using recvmsg/sendmsg or recvmmsg/sendmmsg. */
#include <fcntl.h>
#include <signal.h>
#include <stdbool.h>
#include <string.h>
#include <support/check.h>
#include <support/xunistd.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
/* String sent over the socket. */
static char DATA[] = "descriptor";
/* Path that is to be opened and sent over the socket. */
#define PATH "/etc"
/* True if sendmmsg/recvmmsg is to be used. */
static bool use_multi_call;
/* The pair of sockets used for coordination. The subprocess uses
sockets[1]. */
static int sockets[2];
/* Subprocess side of one send/receive test. */
_Noreturn static void
subprocess (void)
{
/* The file descriptor to send. */
int fd = xopen (PATH, O_RDONLY, 0);
struct iovec iov = { .iov_base = DATA, .iov_len = sizeof (DATA) };
union
{
struct cmsghdr header;
char bytes[CMSG_SPACE (sizeof (int))];
} cmsg_storage;
struct mmsghdr mmhdr =
{
.msg_hdr =
{
.msg_iov = &iov,
.msg_iovlen = 1,
.msg_control = cmsg_storage.bytes,
.msg_controllen = sizeof (cmsg_storage),
},
};
/* Configure the file descriptor for sending. */
struct cmsghdr *cmsg = CMSG_FIRSTHDR (&mmhdr.msg_hdr);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN (sizeof (int));
memcpy (CMSG_DATA (cmsg), &fd, sizeof (fd));
mmhdr.msg_hdr.msg_controllen = cmsg->cmsg_len;
/* Perform the send operation. */
int ret;
if (use_multi_call)
{
ret = sendmmsg (sockets[1], &mmhdr, 1, 0);
if (ret >= 0)
ret = mmhdr.msg_len;
}
else
ret = sendmsg (sockets[1], &mmhdr.msg_hdr, 0);
TEST_COMPARE (ret, sizeof (DATA));
xclose (fd);
/* Stop the process from exiting. */
while (true)
pause ();
}
/* Performs one send/receive test. */
static void
one_test (void)
{
TEST_COMPARE (socketpair (AF_UNIX, SOCK_STREAM, 0, sockets), 0);
pid_t pid = xfork ();
if (pid == 0)
subprocess ();
char data_storage[sizeof (DATA) + 1];
struct iovec iov =
{
.iov_base = data_storage,
.iov_len = sizeof (data_storage)
};
union
{
struct cmsghdr header;
char bytes[CMSG_SPACE (sizeof (int))];
} cmsg_storage;
struct mmsghdr mmhdr =
{
.msg_hdr =
{
.msg_iov = &iov,
.msg_iovlen = 1,
.msg_control = cmsg_storage.bytes,
.msg_controllen = sizeof (cmsg_storage),
},
};
/* Set up the space for receiving the file descriptor. */
struct cmsghdr *cmsg = CMSG_FIRSTHDR (&mmhdr.msg_hdr);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN (sizeof (int));
mmhdr.msg_hdr.msg_controllen = cmsg->cmsg_len;
/* Perform the receive operation. */
int ret;
if (use_multi_call)
{
ret = recvmmsg (sockets[0], &mmhdr, 1, 0, NULL);
if (ret >= 0)
ret = mmhdr.msg_len;
}
else
ret = recvmsg (sockets[0], &mmhdr.msg_hdr, 0);
TEST_COMPARE (ret, sizeof (DATA));
TEST_COMPARE_BLOB (data_storage, sizeof (DATA), DATA, sizeof (DATA));
/* Extract the file descriptor. */
TEST_VERIFY (CMSG_FIRSTHDR (&mmhdr.msg_hdr) != NULL);
TEST_COMPARE (CMSG_FIRSTHDR (&mmhdr.msg_hdr)->cmsg_len,
CMSG_LEN (sizeof (int)));
TEST_VERIFY (&cmsg_storage.header == CMSG_FIRSTHDR (&mmhdr.msg_hdr));
int fd;
memcpy (&fd, CMSG_DATA (CMSG_FIRSTHDR (&mmhdr.msg_hdr)), sizeof (fd));
/* Verify the received file descriptor. */
TEST_VERIFY (fd > 2);
struct stat64 st_fd;
TEST_COMPARE (fstat64 (fd, &st_fd), 0);
struct stat64 st_path;
TEST_COMPARE (stat64 (PATH, &st_path), 0);
TEST_COMPARE (st_fd.st_ino, st_path.st_ino);
TEST_COMPARE (st_fd.st_dev, st_path.st_dev);
xclose (fd);
/* Terminate the subprocess. */
TEST_COMPARE (kill (pid, SIGUSR1), 0);
int status;
TEST_COMPARE (xwaitpid (pid, &status, 0), pid);
TEST_VERIFY (WIFSIGNALED (status));
TEST_COMPARE (WTERMSIG (status), SIGUSR1);
xclose (sockets[0]);
xclose (sockets[1]);
}
static int
do_test (void)
{
one_test ();
use_multi_call = true;
one_test ();
return 0;
}
#include <support/test-driver.c>