mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
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:
parent
b39ffab860
commit
8b2c706a9d
@ -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.
|
||||
|
@ -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 = \
|
||||
|
@ -265,6 +265,7 @@ libc {
|
||||
__semctl64;
|
||||
__semtimedop64;
|
||||
__sem_timedwait64;
|
||||
__sendmmsg64;
|
||||
__setitimer64;
|
||||
__settimeofday64;
|
||||
__shmctl64;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
1
sysdeps/unix/sysv/linux/tst-scm_rights-time64.c
Normal file
1
sysdeps/unix/sysv/linux/tst-scm_rights-time64.c
Normal file
@ -0,0 +1 @@
|
||||
#include "tst-scm_rights.c"
|
186
sysdeps/unix/sysv/linux/tst-scm_rights.c
Normal file
186
sysdeps/unix/sysv/linux/tst-scm_rights.c
Normal 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>
|
Loading…
Reference in New Issue
Block a user