void test_masked_matching_rt(swi_func sigwaitinfo, int signo) { sigset_t sigs, oldmask; siginfo_t si; pid_t child[2]; signo = SIGRTMIN + 1; SUCCEED_OR_DIE(sigemptyset, "sigemptyset failed", &sigs); SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, signo); SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, signo + 1); /* let's not get interrupted by our dying child */ SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, SIGCHLD); SUCCEED_OR_DIE(sigprocmask, "sigprocmask failed", SIG_SETMASK, &sigs, &oldmask); /* don't wait on a SIGCHLD */ SUCCEED_OR_DIE(sigdelset, "sigdelset failed", &sigs, SIGCHLD); /* Run a child that will wake us up */ child[0] = create_sig_proc(0, signo, 1); child[1] = create_sig_proc(0, signo + 1, 1); TEST(sigwaitinfo(&sigs, &si, NULL)); REPORT_SUCCESS_COND(signo, 0, si.si_pid == child[0] && si.si_code == SI_USER && si.si_signo == signo, "Struct siginfo mismatch"); /* eat the other signal */ Tst_count--; TEST(sigwaitinfo(&sigs, &si, NULL)); REPORT_SUCCESS_COND(signo + 1, 0, si.si_pid == child[1] && si.si_code == SI_USER && si.si_signo == signo + 1, "Struct siginfo mismatch"); SUCCEED_OR_DIE(sigprocmask, "restoring original signal mask failed", SIG_SETMASK, &oldmask, &oldmask); Tst_count--; if (sigismember(&oldmask, signo)) tst_resm(TPASS, "sigwaitinfo restored the original mask"); else tst_resm(TFAIL, "sigwaitinfo failed to restore the original mask"); }
void test_bad_address(swi_func sigwaitinfo, int signo) { sigset_t sigs, oldmask; pid_t child; SUCCEED_OR_DIE(sigemptyset, "sigemptyset failed", &sigs); SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, signo); /* let's not get interrupted by our dying child */ SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, SIGCHLD); SUCCEED_OR_DIE(sigprocmask, "sigprocmask failed", SIG_SETMASK, &sigs, &oldmask); /* don't wait on a SIGCHLD */ SUCCEED_OR_DIE(sigdelset, "sigaddset failed", &sigs, SIGCHLD); /* Run a child that will wake us up */ child=create_sig_proc(0, signo, 1); TEST(sigwaitinfo(&sigs, (void*)1, NULL)); REPORT_SUCCESS(-1, EFAULT); SUCCEED_OR_DIE(sigprocmask, "sigprocmask failed", SIG_SETMASK, &oldmask, &oldmask); kill(child, SIGTERM); }
void test_masked_matching_noinfo(swi_func sigwaitinfo, int signo) { sigset_t sigs, oldmask; pid_t child; SUCCEED_OR_DIE(sigemptyset, "sigemptyset failed", &sigs); SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, signo); /* let's not get interrupted by our dying child */ SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, SIGCHLD); SUCCEED_OR_DIE(sigprocmask, "sigprocmask failed", SIG_SETMASK, &sigs, &oldmask); /* don't wait on a SIGCHLD */ SUCCEED_OR_DIE(sigdelset, "sigaddset failed", &sigs, SIGCHLD); /* Run a child that will wake us up */ child=create_sig_proc(0, signo, 1); TEST(sigwaitinfo(&sigs, NULL, NULL)); REPORT_SUCCESS(signo, 0); SUCCEED_OR_DIE(sigprocmask, "restoring original signal mask failed", SIG_SETMASK, &oldmask, &oldmask); Tst_count--; if(sigismember(&oldmask, signo)) tst_resm(TPASS, "sigwaitinfo restored the original mask"); else tst_resm(TFAIL, "sigwaitinfo failed to restore the original mask"); }
void test_timeout(swi_func sigwaitinfo, int signo) { sigset_t sigs; siginfo_t si; pid_t child; struct timespec ts = {.tv_sec = 1 }; SUCCEED_OR_DIE(sigemptyset, "sigemptyset failed", &sigs); /* Run a child that will wake us up */ child = create_sig_proc(100000, signo, UINT_MAX); TEST(sigwaitinfo(&sigs, &si, &ts)); REPORT_SUCCESS(-1, EAGAIN); kill(child, SIGTERM); } /* Note: sigwait-ing for a signal that is not blocked is unspecified * by POSIX; but works for non-ignored signals under Linux */ void test_unmasked_matching(swi_func sigwaitinfo, int signo) { sigset_t sigs; siginfo_t si; pid_t child; SUCCEED_OR_DIE(sigemptyset, "sigemptyset failed", &sigs); SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, signo); /* Run a child that will wake us up */ child = create_sig_proc(100000, signo, UINT_MAX); TEST(sigwaitinfo(&sigs, &si, NULL)); REPORT_SUCCESS_COND(signo, 0, si.si_pid == child && si.si_code == SI_USER && si.si_signo == signo, "Struct siginfo mismatch"); kill(child, SIGTERM); }
void test_unmasked_matching_noinfo(swi_func sigwaitinfo, int signo) { sigset_t sigs; pid_t child; SUCCEED_OR_DIE(sigemptyset, "sigemptyset failed", &sigs); SUCCEED_OR_DIE(sigaddset, "sigaddset failed", &sigs, signo); /* Run a child that will wake us up */ child=create_sig_proc(100000, signo, UINT_MAX); TEST(sigwaitinfo(&sigs, NULL, NULL)); REPORT_SUCCESS(signo, 0); kill(child, SIGTERM); }
void test_empty_set(swi_func sigwaitinfo, int signo) { sigset_t sigs; siginfo_t si; pid_t child; SUCCEED_OR_DIE(sigemptyset, "sigemptyset failed", &sigs); /* Run a child that will wake us up */ child=create_sig_proc(100000, signo, UINT_MAX); TEST(sigwaitinfo(&sigs, &si, NULL)); REPORT_SUCCESS(-1, EINTR); kill(child, SIGTERM); }