From: Garrett C. <yab...@us...> - 2009-11-30 20:39:01
|
Update of /cvsroot/ltp/ltp/testcases/kernel/syscalls/rt_sigaction In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv5822/testcases/kernel/syscalls/rt_sigaction Modified Files: rt_sigaction01.c Log Message: Commit changes which provide a functional fix for the rt_sigaction(2) tests on x86_64, apart from SIGRTMIN (still crashes, but it keeps on going..). The test is now disabled on platforms where sa_handler isn't present in struct sigaction, which includes ia64, mips, and powerpc. Signed-off-by: Garrett Cooper <yan...@gm...> Index: rt_sigaction01.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** rt_sigaction01.c 26 Nov 2009 14:30:42 -0000 1.6 --- rt_sigaction01.c 30 Nov 2009 20:38:48 -0000 1.7 *************** *** 44,48 **** /******************************************************************************/ #define _GNU_SOURCE - #include <stdio.h> #include <stdlib.h> --- 44,47 ---- *************** *** 57,60 **** --- 56,60 ---- #include "usctest.h" #include "linux_syscall_numbers.h" + #define LTP_RT_SIG_TEST #include "ltp_signal.h" *************** *** 65,71 **** --- 65,88 ---- /* Global Variables */ char *TCID = "rt_sigaction01"; /* Test program identifier.*/ + int expected_signal_number = 0; + int pass_count = 0; int testno; int TST_TOTAL = 1; /* total number of tests in this file. */ + int test_flags[] = { + SA_RESETHAND|SA_SIGINFO, + SA_RESETHAND, + SA_RESETHAND|SA_SIGINFO, + SA_RESETHAND|SA_SIGINFO, + SA_NOMASK + }; + char *test_flags_list[] = { + "SA_RESETHAND|SA_SIGINFO", + "SA_RESETHAND", + "SA_RESETHAND|SA_SIGINFO", + "SA_RESETHAND|SA_SIGINFO", + "SA_NOMASK" + }; + /* Extern Global Functions */ /******************************************************************************/ *************** *** 86,96 **** /* */ /******************************************************************************/ ! extern void cleanup() { /* Remove tmp dir and all files in it */ TEST_CLEANUP; tst_rmdir(); - - /* Exit with appropriate return code. */ - tst_exit(); } --- 103,110 ---- /* */ /******************************************************************************/ ! static void cleanup() { /* Remove tmp dir and all files in it */ TEST_CLEANUP; tst_rmdir(); } *************** *** 113,148 **** /* */ /******************************************************************************/ ! void setup() { ! /* Capture signals if any */ ! /* Create temporary directories */ TEST_PAUSE; tst_tmpdir(); } - int test_flags[] = { - SA_RESETHAND|SA_SIGINFO, - SA_RESETHAND, - SA_RESETHAND|SA_SIGINFO, - SA_RESETHAND|SA_SIGINFO, - SA_NOMASK - }; - char *test_flags_list[] = { - "SA_RESETHAND|SA_SIGINFO", - "SA_RESETHAND", - "SA_RESETHAND|SA_SIGINFO", - "SA_RESETHAND|SA_SIGINFO", - "SA_NOMASK" - }; - void handler(int sig) { ! tst_resm(TINFO, "Signal Handler Called with signal number %d", sig); ! return; } void ! restorer(void) { ! } --- 127,152 ---- /* */ /******************************************************************************/ ! void ! setup() ! { ! (void) setup_sigsegv_sigaction_handler(); ! /* Wait for SIGUSR1 if requested */ TEST_PAUSE; + /* Create temporary directories */ tst_tmpdir(); } void handler(int sig) { ! tst_resm(TINFO, "Signal handler (non-sigaction) called with signal number %d", sig); ! pass_count++; } void ! sigaction_handler(int sig, siginfo_t *siginfo, void *ucontext) { ! tst_resm(TINFO, "Signal handler (sigaction) called with signal number %d", sig); ! if (sig == expected_signal_number) ! pass_count++; } *************** *** 151,166 **** { int rc = -1; ! struct sigaction sa, oldaction; ! memset(&sa, 0, SIGSETSIZE); - sa.sa_sigaction = (void *)handler; sa.sa_flags = mask_flags; if (sigemptyset(&sa.sa_mask) < 0) { tst_resm(TINFO, "sigemptyset(..) failed"); } else if (sigaddset(&sa.sa_mask, sig) < 0) { tst_resm(TFAIL | TINFO, "sigaddset(..) failed"); ! } else if (syscall(__NR_rt_sigaction, sig, &sa, &oldaction, SIGSETSIZE)) { tst_resm(TFAIL | TERRNO, "rt_sigaction(%d, ..) failed", sig); } else { --- 155,186 ---- { int rc = -1; ! struct sigaction sa; ! //memset(&sa, 0, SIGSETSIZE); sa.sa_flags = mask_flags; + ARCH_SPECIFIC_RT_SIGACTION_SETUP(sa); + + #if HAVE_STRUCT_SIGACTION_SA_SIGACTION + /* + * SA_SIGINFO (since Linux 2.2) + * The signal handler takes 3 arguments, not one. In this + * case, sa_sigaction should be set instead of sa_handler. + * This flag is only meaningful when establishing a signal han- + * dler. + * + */ + if (sa.sa_flags & SA_SIGINFO) + sa.sa_sigaction = (void *) sigaction_handler; + else + #endif + sa.sa_handler = (void *) handler; + if (sigemptyset(&sa.sa_mask) < 0) { tst_resm(TINFO, "sigemptyset(..) failed"); } else if (sigaddset(&sa.sa_mask, sig) < 0) { tst_resm(TFAIL | TINFO, "sigaddset(..) failed"); ! } else if (syscall(__NR_rt_sigaction, sig, &sa, (struct sigaction*) NULL, SIGSETSIZE)) { tst_resm(TFAIL | TERRNO, "rt_sigaction(%d, ..) failed", sig); } else { *************** *** 170,176 **** } ! int main(int ac, char **av) { ! int signal, flag; ! int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ --- 190,196 ---- } ! int ! main(int ac, char **av) { ! char *msg; /* message returned from parse_opts */ *************** *** 183,186 **** --- 203,216 ---- setup(); + #if HAVE_STRUCT_SIGACTION_SA_SIGACTION + int flag; + int last_pass_count; + int num_tests_per_signal = sizeof(test_flags) / sizeof(*test_flags); + int tests_passed; + int lc; /* loop counter */ + + tst_resm(TINFO, "Will run %d tests per signal in set [%d, %d]", + num_tests_per_signal, SIGRTMIN, SIGRTMAX); + /* Check looping state if -i option given */ for (lc = 0; TEST_LOOPING(lc); ++lc) { *************** *** 191,216 **** /* 34 (NPTL) or 35 (LinuxThreads) to 65 (or 128 on mips). */ ! for (signal = SIGRTMIN; signal <= SIGRTMAX; signal++) { ! tst_resm(TINFO, "signal: %d ", signal); ! for (flag = 0; flag < sizeof(test_flags) / sizeof(int); flag++) { - if (set_handler(signal, test_flags[flag]) == 0) { tst_resm(TINFO, ! "sa.sa_flags = %s", test_flags_list[flag]); ! kill(getpid(), signal); } } - - } } - } cleanup(); tst_exit(); --- 221,264 ---- /* 34 (NPTL) or 35 (LinuxThreads) to 65 (or 128 on mips). */ ! for (expected_signal_number = SIGRTMIN; expected_signal_number <= SIGRTMAX; expected_signal_number++) { ! last_pass_count = pass_count; ! tst_resm(TINFO, "signal: %d ", expected_signal_number); ! ! for (flag = 0; flag < num_tests_per_signal; flag++) { ! ! if (set_handler(expected_signal_number, test_flags[flag]) == 0) { tst_resm(TINFO, ! "\tsa.sa_flags = %s", test_flags_list[flag]); ! ! if (kill(getpid(), expected_signal_number) < 0) { ! tst_resm(TINFO | TERRNO, "kill failed"); ! } ! } } + tests_passed = ((pass_count - last_pass_count) == + num_tests_per_signal); + + tst_resm(tests_passed ? TPASS : TFAIL, + "tests %s for signal = %d", + tests_passed ? "passed" : "failed", + expected_signal_number); + } } + } + #else + tst_brkm(TCONF, NULL, + "Your architecture doesn't support this test (no " + "sa_sigaction field in struct sigaction)."); + #endif cleanup(); tst_exit(); |