Esempio n. 1
0
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();
}
Esempio n. 2
0
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();
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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();
}