• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) Red Hat Inc., 2008
4  * Copyright (c) Linux Test Project, 2006-2024
5  */
6 
7 /*\
8  * [Description]
9  *
10  * Verify that signalfd() works as expected.
11  *
12  * - signalfd() can create fd, and fd can receive signal.
13  * - signalfd() can reassign fd, and fd can receive signal.
14  */
15 
16 #include <sys/signalfd.h>
17 #include "tst_test.h"
18 
19 static int fd_signal = -1;
20 static sigset_t mask1;
21 static sigset_t mask2;
22 
check_signal(int fd,uint32_t signal)23 static void check_signal(int fd, uint32_t signal)
24 {
25 	pid_t pid = getpid();
26 	ssize_t bytes;
27 	struct signalfd_siginfo siginfo;
28 
29 	SAFE_KILL(pid, signal);
30 	bytes = SAFE_READ(0, fd, &siginfo, sizeof(siginfo));
31 	TST_EXP_EQ_LI(bytes, sizeof(siginfo));
32 	TST_EXP_EQ_LI(siginfo.ssi_signo, signal);
33 }
34 
setup(void)35 static void setup(void)
36 {
37 	SAFE_SIGEMPTYSET(&mask1);
38 	SAFE_SIGADDSET(&mask1, SIGUSR1);
39 	SAFE_SIGPROCMASK(SIG_BLOCK, &mask1, NULL);
40 	SAFE_SIGEMPTYSET(&mask2);
41 	SAFE_SIGADDSET(&mask2, SIGUSR2);
42 	SAFE_SIGPROCMASK(SIG_BLOCK, &mask2, NULL);
43 }
44 
cleanup(void)45 static void cleanup(void)
46 {
47 	if (fd_signal > 0)
48 		SAFE_CLOSE(fd_signal);
49 }
50 
verify_signalfd(void)51 static void verify_signalfd(void)
52 {
53 	/* create fd */
54 	TST_EXP_FD(signalfd(fd_signal, &mask1, 0),
55 		"%s", "signalfd() create fd");
56 	if (TST_RET == -1)
57 		return;
58 	fd_signal = TST_RET;
59 	check_signal(fd_signal, SIGUSR1);
60 	/* reassign fd */
61 	TST_EXP_FD(signalfd(fd_signal, &mask2, 0), "%s",
62 		"signalfd() reassign fd");
63 	if (TST_RET == -1)
64 		return;
65 	TST_EXP_EQ_LI(TST_RET, fd_signal);
66 	check_signal(fd_signal, SIGUSR2);
67 }
68 
69 static struct tst_test test = {
70 	.test_all = verify_signalfd,
71 	.setup = setup,
72 	.cleanup = cleanup,
73 };
74