2 * Check SIGCHLD siginfo_t decoding.
4 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
7 * SPDX-License-Identifier: GPL-2.0-or-later
17 static siginfo_t sinfo;
20 handler(int no, siginfo_t *si, void *uc)
22 memcpy(&sinfo, si, sizeof(sinfo));
32 perror_msg_and_fail("pipe");
36 perror_msg_and_fail("fork");
41 assert(read(0, &c, sizeof(c)) == 1);
47 struct sigaction sa = {
48 .sa_sigaction = handler,
49 .sa_flags = SA_SIGINFO
51 assert(sigaction(SIGCHLD, &sa, NULL) == 0);
53 sigset_t block_mask, unblock_mask;
54 assert(sigprocmask(SIG_SETMASK, NULL, &block_mask) == 0);
55 sigaddset(&block_mask, SIGCHLD);
56 assert(sigprocmask(SIG_SETMASK, &block_mask, NULL) == 0);
58 unblock_mask = block_mask;
59 sigdelset(&unblock_mask, SIGCHLD);
61 assert(write(1, "", 1) == 1);
64 sigsuspend(&unblock_mask);
65 tprintf("--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED"
66 ", si_pid=%d, si_uid=%u, si_status=%d"
67 ", si_utime=%llu, si_stime=%llu} ---\n",
68 sinfo.si_pid, sinfo.si_uid, sinfo.si_status,
69 zero_extend_signed_to_ull(sinfo.si_utime),
70 zero_extend_signed_to_ull(sinfo.si_stime));
73 assert(wait(&s) == pid);
74 assert(WIFEXITED(s) && WEXITSTATUS(s) == 42);
77 perror_msg_and_fail("pipe");
80 perror_msg_and_fail("fork");
85 assert(read(0, &c, sizeof(c)) == 1);
86 (void) raise(SIGUSR1);
92 assert(write(1, "", 1) == 1);
95 sigsuspend(&unblock_mask);
96 tprintf("--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED"
97 ", si_pid=%d, si_uid=%u, si_status=SIGUSR1"
98 ", si_utime=%llu, si_stime=%llu} ---\n",
99 sinfo.si_pid, sinfo.si_uid,
100 zero_extend_signed_to_ull(sinfo.si_utime),
101 zero_extend_signed_to_ull(sinfo.si_stime));
103 assert(wait(&s) == pid);
104 assert(WIFSIGNALED(s) && WTERMSIG(s) == SIGUSR1);
107 perror_msg_and_fail("pipe");
110 perror_msg_and_fail("fork");
116 assert(read(0, &c, sizeof(c)) == 1);
122 sigsuspend(&unblock_mask);
123 tprintf("--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_STOPPED"
124 ", si_pid=%d, si_uid=%u, si_status=SIGSTOP"
125 ", si_utime=%llu, si_stime=%llu} ---\n",
126 sinfo.si_pid, sinfo.si_uid,
127 zero_extend_signed_to_ull(sinfo.si_utime),
128 zero_extend_signed_to_ull(sinfo.si_stime));
130 assert(kill(pid, SIGCONT) == 0);
132 sigsuspend(&unblock_mask);
133 tprintf("--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_CONTINUED"
134 ", si_pid=%d, si_uid=%u, si_status=SIGCONT"
135 ", si_utime=%llu, si_stime=%llu} ---\n",
136 sinfo.si_pid, sinfo.si_uid,
137 zero_extend_signed_to_ull(sinfo.si_utime),
138 zero_extend_signed_to_ull(sinfo.si_stime));
140 assert(write(1, "", 1) == 1);
143 sigsuspend(&unblock_mask);
144 tprintf("--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED"
145 ", si_pid=%d, si_uid=%u, si_status=0"
146 ", si_utime=%llu, si_stime=%llu} ---\n",
147 sinfo.si_pid, sinfo.si_uid,
148 zero_extend_signed_to_ull(sinfo.si_utime),
149 zero_extend_signed_to_ull(sinfo.si_stime));
151 assert(wait(&s) == pid && s == 0);
153 tprintf("%s\n", "+++ exited with 0 +++");