2 * This file is part of rt_sigsuspend strace test.
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
5 * Copyright (c) 2016-2019 The strace developers.
8 * SPDX-License-Identifier: GPL-2.0-or-later
14 #ifdef __NR_rt_sigsuspend
25 k_sigsuspend(const sigset_t *const set, const unsigned long size)
27 return syscall(__NR_rt_sigsuspend, set, size);
31 iterate(const char *const text, const int sig,
32 const void *const set, unsigned int size)
36 for (mask = set;; size >>= 1, mask += size) {
38 assert(k_sigsuspend(mask, size) == -1);
40 tprintf("rt_sigsuspend(%s, %u) = ? ERESTARTNOHAND"
41 " (To be restarted if no handler)\n",
44 if (size < sizeof(long))
45 tprintf("rt_sigsuspend(%p, %u)"
46 " = -1 EINVAL (%m)\n",
49 tprintf("rt_sigsuspend(%s, %u)"
50 " = -1 EINVAL (%m)\n",
51 set == mask ? text : "~[]", size);
68 const unsigned int big_size = 1024 / 8;
69 void *k_set = tail_alloc(big_size);
70 memset(k_set, 0, big_size);
72 TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set);
73 sigemptyset(libc_set);
74 sigaddset(libc_set, SIGUSR1);
75 if (sigprocmask(SIG_SETMASK, libc_set, NULL))
76 perror_msg_and_fail("sigprocmask");
78 const struct sigaction sa = {
81 if (sigaction(SIGUSR1, &sa, NULL))
82 perror_msg_and_fail("sigaction");
85 unsigned int set_size = big_size;
86 for (; set_size; set_size >>= 1, k_set += set_size) {
87 assert(k_sigsuspend(k_set, set_size) == -1);
90 tprintf("rt_sigsuspend(%p, %u) = -1 EINVAL (%m)\n",
94 perror_msg_and_fail("rt_sigsuspend");
95 tprintf("rt_sigsuspend([], %u) = ? ERESTARTNOHAND"
96 " (To be restarted if no handler)\n", set_size);
98 sigemptyset(libc_set);
99 sigaddset(libc_set, SIGUSR2);
100 memcpy(k_set, libc_set, set_size);
102 assert(k_sigsuspend(k_set, set_size) == -1);
103 assert(EINTR == errno);
104 tprintf("rt_sigsuspend([USR2], %u) = ? ERESTARTNOHAND"
105 " (To be restarted if no handler)\n", set_size);
107 sigaddset(libc_set, SIGHUP);
108 memcpy(k_set, libc_set, set_size);
110 assert(k_sigsuspend(k_set, set_size) == -1);
111 assert(EINTR == errno);
112 tprintf("rt_sigsuspend([HUP USR2], %u) = ? ERESTARTNOHAND"
113 " (To be restarted if no handler)\n", set_size);
115 sigaddset(libc_set, SIGINT);
116 memcpy(k_set, libc_set, set_size);
118 assert(k_sigsuspend(k_set, set_size) == -1);
119 assert(EINTR == errno);
120 tprintf("rt_sigsuspend([HUP INT USR2], %u) = ? ERESTARTNOHAND"
121 " (To be restarted if no handler)\n", set_size);
123 memset(libc_set, -1, sizeof(*libc_set));
124 sigdelset(libc_set, SIGUSR1);
125 memcpy(k_set, libc_set, set_size);
127 assert(k_sigsuspend(k_set, set_size) == -1);
128 assert(EINTR == errno);
129 tprintf("rt_sigsuspend(~[USR1], %u) = ? ERESTARTNOHAND"
130 " (To be restarted if no handler)\n", set_size);
132 assert(k_sigsuspend(k_set - set_size, set_size << 1) == -1);
133 tprintf("rt_sigsuspend(%p, %u) = -1 EINVAL (%m)\n",
134 k_set - set_size, set_size << 1);
136 iterate("~[USR1]", SIGUSR1, k_set, set_size >> 1);
138 tprintf("+++ exited with 0 +++\n");
144 SKIP_MAIN_UNDEFINED("__NR_rt_sigsuspend")