int main(int ac, char **av) { sigset_t set, set1, set2; int lc; tst_parse_opts(ac, av, NULL, NULL); setup(); for (lc = 0; TEST_LOOPING(lc); ++lc) { tst_count = 0; if (sigemptyset(&set) < 0) tst_brkm(TFAIL | TERRNO, cleanup, "sigemptyset failed"); struct sigaction act, oact; memset(&act, 0, sizeof(act)); memset(&oact, 0, sizeof(oact)); act.sa_handler = sig_handler; TEST(ltp_rt_sigaction(SIGALRM, &act, &oact, SIGSETSIZE)); if (TEST_RETURN == -1) tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigaction failed"); TEST(ltp_syscall(__NR_rt_sigprocmask, SIG_UNBLOCK, 0, &set1, SIGSETSIZE)); if (TEST_RETURN == -1) tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigprocmask failed"); TEST(alarm(5)); int result; TEST(result = ltp_syscall(__NR_rt_sigsuspend, &set, SIGSETSIZE)); TEST(alarm(0)); if (result == -1 && TEST_ERRNO != EINTR) { TEST(ltp_syscall(__NR_rt_sigprocmask, SIG_UNBLOCK, 0, &set2, SIGSETSIZE)); if (TEST_RETURN == -1) { tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigprocmask failed"); } else if (set1.__val[0] != set2.__val[0]) { tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigsuspend failed to " "preserve signal mask"); } else { tst_resm(TPASS, "rt_sigsuspend PASSED"); } } else { tst_resm(TFAIL | TTERRNO, "rt_sigsuspend failed"); } } cleanup(); tst_exit(); }
int main(int ac, char **av) { unsigned int flag; int signal; int lc; tst_parse_opts(ac, av, NULL, NULL); setup(); for (lc = 0; TEST_LOOPING(lc); ++lc) { tst_count = 0; for (testno = 0; testno < TST_TOTAL; ++testno) { for (signal = SIGRTMIN; signal <= SIGRTMAX; signal++) { tst_resm(TINFO, "Signal %d", signal); for (flag = 0; flag < ARRAY_SIZE(test_flags); flag++) { /* * * long sys_rt_sigaction (int sig, const struct sigaction *act, * * truct sigaction *oact, size_t sigsetsize); * * EFAULT: * * An invalid act or oact value was specified * */ TEST(ltp_rt_sigaction(signal, INVAL_SA_PTR, NULL, SIGSETSIZE)); if ((TEST_RETURN == -1) && (TEST_ERRNO == test_cases[0].exp_errno)) { tst_resm(TINFO, "sa.sa_flags = %s ", test_flags_list[flag]); tst_resm(TPASS, "%s failure with sig: %d as expected errno = %s : %s", TCID, signal, test_cases[0].errdesc, strerror(TEST_ERRNO)); } else { tst_resm(TFAIL, "rt_sigaction call succeeded: result = %ld got error %d:but expected %d", TEST_RETURN, TEST_ERRNO, test_cases[0]. exp_errno); tst_resm(TINFO, "sa.sa_flags = %s ", test_flags_list[flag]); } } } } } cleanup(); tst_exit(); }
static int set_handler(int sig, int sig_to_mask, int mask_flags) { struct sigaction sa, oldaction; sa.sa_sigaction = (void *)handler; sa.sa_flags = mask_flags; sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, sig_to_mask); /* * * long sys_rt_sigaction (int sig, const struct sigaction *act, * * truct sigaction *oact, size_t sigsetsize); * * EINVAL: * * sigsetsize was not equivalent to the size of a sigset_t type * */ return ltp_rt_sigaction(sig, &sa, &oldaction, INVAL_SIGSETSIZE); }
int main(int ac, char **av) { struct sigaction act, oact; memset(&act, 0, sizeof(act)); memset(&oact, 0, sizeof(oact)); act.sa_handler = sig_handler; sigset_t set, oset; int lc; tst_parse_opts(ac, av, NULL, NULL); setup(); for (lc = 0; TEST_LOOPING(lc); ++lc) { tst_count = 0; for (testno = 0; testno < TST_TOTAL; ++testno) { if (sigemptyset(&set) < 0) tst_brkm(TFAIL | TERRNO, cleanup, "sigemptyset call failed"); if (sigaddset(&set, TEST_SIG) < 0) tst_brkm(TFAIL | TERRNO, cleanup, "sigaddset call failed"); /* call rt_sigaction() */ TEST(ltp_rt_sigaction(TEST_SIG, &act, &oact, SIGSETSIZE)); if (TEST_RETURN < 0) tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigaction call failed"); /* call rt_sigprocmask() to block signal#TEST_SIG */ TEST(ltp_syscall(__NR_rt_sigprocmask, SIG_BLOCK, &set, &oset, SIGSETSIZE)); if (TEST_RETURN == -1) tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigprocmask call failed"); /* Make sure that the masked process is indeed * masked. */ if (kill(getpid(), TEST_SIG) < 0) tst_brkm(TFAIL | TERRNO, cleanup, "call to kill() failed"); if (sig_count) { tst_brkm(TFAIL | TERRNO, cleanup, "rt_sigprocmask() failed to change " "the process's signal mask"); } else { /* call rt_sigpending() */ TEST(ltp_syscall(__NR_rt_sigpending, &oset, SIGSETSIZE)); if (TEST_RETURN == -1) tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigpending call failed"); TEST(sigismember(&oset, TEST_SIG)); if (TEST_RETURN == 0) tst_brkm(TFAIL | TTERRNO, cleanup, "sigismember call failed"); /* call rt_sigprocmask() to unblock * signal#TEST_SIG */ TEST(ltp_syscall(__NR_rt_sigprocmask, SIG_UNBLOCK, &set, &oset, SIGSETSIZE)); if (TEST_RETURN == -1) tst_brkm(TFAIL | TTERRNO, cleanup, "rt_sigprocmask call failed"); if (sig_count) { tst_resm(TPASS, "rt_sigprocmask " "functionality passed"); break; } else { tst_brkm(TFAIL | TERRNO, cleanup, "rt_sigprocmask " "functionality failed"); } } } tst_count++; } cleanup(); tst_exit(); }