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