From: Subrata <sub...@us...> - 2009-07-06 15:46:09
|
Update of /cvsroot/ltp/ltp/testcases/kernel/syscalls/rt_sigaction In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv5632/ltp/testcases/kernel/syscalls/rt_sigaction Modified Files: rt_sigaction01.c Added Files: rt_sigaction02.c rt_sigaction03.c Log Message: I have divided rt_sigaction01.c test case in to three test cases 1. rt_sigaction01.c (Functionality) 2. rt_sigaction02.c (EFAULT) 3. rt_sigaction03.c (EINVAL) In these test cases rt_sigaction use signal number from SIGRTMIN (34) to SIGRTMAX (64).The Real Time (RT) signals will start from 34 to 64 as per signal.h because sigaction is testing from 1 to 30 signals I hope. If you want to test 1 to 64 signals by rt_sigaction signal number 9 and 19 i.e SIGKILL and SIGTERM will FAIL, because as per Specifications we should not use SIGKILL and SIGTERM signals with rt_sigaction/sigaction. long sys_rt_sigaction (int sig, const struct sigaction *act, struct sigaction *oact, size_t sigsetsize). SIGSETSIZE is different for different architectures that is taken care for ARM, PowerPC, X86 and MIPS in this patch. Subrata, Coding style is not as LTP, I did not get much time to fix this. If you are using any indent for LTP, please share I will use those script to fix coding style. If any body is interested to fix coding style issue please welcome... :-). I have attached fix patch and below. Please review the same. /*******************************************************/ Test Start Time: Fri Jul 3 07:52:04 2009 ----------------------------------------- Testcase Result Exit Value -------- ------ ---------- rt_sigaction01 PASS 0 rt_sigaction02 PASS 0 rt_sigaction03 PASS 0 ----------------------------------------------- Total Tests: 3 Total Failures: 0 Kernel Version: 2.6.23.17-alp_nl-pc-g56b4520c-dirty Machine Architecture: i686 Hostname: 43.88.101.228 ************************************************************/ Signed-off-by: Naresh Kamboju < nar...@gm... >. --- NEW FILE: rt_sigaction02.c --- /******************************************************************************/ /* Copyright (c) Crackerjack Project., 2007 */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ /* the GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* File: rt_sigaction02.c */ /* */ /* Description: This tests the rt_sigaction() syscall */ /* rt_sigaction Expected EFAULT error check */ /* */ /* Usage: <for command-line> */ /* rt_sigaction02 [-c n] [-e][-i n] [-I x] [-p x] [-t] */ /* where, -c n : Run n copies concurrently. */ /* -e : Turn on errno logging. */ /* -i n : Execute test n times. */ /* -I x : Execute test for x seconds. */ /* -P x : Pause for x seconds between iterations. */ /* -t : Turn on syscall timing. */ /* */ /* Total Tests: 1 */ /* */ /* Test Name: rt_sigaction02 */ /* History: Porting from Crackerjack to LTP is done by */ /* Manas Kumar Nayak mak...@in...> */ /******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <sys/syscall.h> #include <string.h> /* Harness Specific Include Files. */ #include "test.h" #include "usctest.h" #include "linux_syscall_numbers.h" #if defined __mips__ #define SIGSETSIZE 16 #endif #if defined __arm__ || __i386__ || __powerpc__ #define SIGSETSIZE 8 #endif #define INVAL_STRUCT -1 /* Extern Global Variables */ extern int Tst_count; /* counter for tst_xxx routines. */ extern char *TESTDIR; /* temporary dir created by tst_tmpdir() */ /* Global Variables */ char *TCID = "rt_sigaction02"; /* Test program identifier.*/ int testno; int TST_TOTAL = 1; /* total number of tests in this file. */ /* Extern Global Functions */ /******************************************************************************/ /* */ /* Function: cleanup */ /* */ /* Description: Performs all one time clean up for this test on successful */ /* completion, premature exit or failure. Closes all temporary */ /* files, removes all temporary directories exits the test with */ /* appropriate return code by calling tst_exit() function. */ /* */ /* Input: None. */ /* */ /* Output: None. */ /* */ /* Return: On failure - Exits calling tst_exit(). Non '0' return code. */ /* On success - Exits calling tst_exit(). With '0' return code. */ /* */ /******************************************************************************/ extern void cleanup() { /* Remove tmp dir and all files in it */ TEST_CLEANUP; tst_rmdir(); /* Exit with appropriate return code. */ tst_exit(); } /* Local Functions */ /******************************************************************************/ /* */ /* Function: setup */ /* */ /* Description: Performs all one time setup for this test. This function is */ /* typically used to capture signals, create temporary dirs */ /* and temporary files that may be used in the course of this */ /* test. */ /* */ /* Input: None. */ /* */ /* Output: None. */ /* */ /* Return: On failure - Exits by calling cleanup(). */ /* On success - returns 0. */ /* */ /******************************************************************************/ 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"}; struct test_case_t { int exp_errno; char *errdesc; } test_cases[] = { { EFAULT, "EFAULT" } }; int main(int ac, char **av) { int signal, flag; int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ /* parse standard options */ if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); tst_exit(); } setup(); /* Check looping state if -i option given */ for (lc = 0; TEST_LOOPING(lc); ++lc) { Tst_count = 0; for (testno = 0; testno < TST_TOTAL; ++testno) { for (signal = SIGRTMIN; signal <= (SIGRTMAX ); signal++){//signal for 34 to 65 for(flag=0; flag<5;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(syscall(__NR_rt_sigaction,signal, INVAL_STRUCT, 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 = %d 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]); } } printf("\n"); } } } cleanup(); tst_exit(); } --- NEW FILE: rt_sigaction03.c --- /******************************************************************************/ /* Copyright (c) Crackerjack Project., 2007 */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ /* the GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* File: rt_sigaction03.c */ /* */ /* Description: This tests the rt_sigaction() syscall */ /* rt_sigaction Expected EINVAL error check */ /* */ /* Usage: <for command-line> */ /* rt_sigaction03 [-c n] [-e][-i n] [-I x] [-p x] [-t] */ /* where, -c n : Run n copies concurrently. */ /* -e : Turn on errno logging. */ /* -i n : Execute test n times. */ /* -I x : Execute test for x seconds. */ /* -P x : Pause for x seconds between iterations. */ /* -t : Turn on syscall timing. */ /* */ /* Total Tests: 1 */ /* */ /* Test Name: rt_sigaction03 */ /* History: Porting from Crackerjack to LTP is done by */ /* Manas Kumar Nayak mak...@in...> */ /******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <sys/syscall.h> #include <string.h> /* Harness Specific Include Files. */ #include "test.h" #include "usctest.h" #include "linux_syscall_numbers.h" #define INVAL_SIGSETSIZE -1 /* Extern Global Variables */ extern int Tst_count; /* counter for tst_xxx routines. */ extern char *TESTDIR; /* temporary dir created by tst_tmpdir() */ /* Global Variables */ char *TCID = "rt_sigaction03"; /* Test program identifier.*/ int testno; int TST_TOTAL = 1; /* total number of tests in this file. */ /* Extern Global Functions */ /******************************************************************************/ /* */ /* Function: cleanup */ /* */ /* Description: Performs all one time clean up for this test on successful */ /* completion, premature exit or failure. Closes all temporary */ /* files, removes all temporary directories exits the test with */ /* appropriate return code by calling tst_exit() function. */ /* */ /* Input: None. */ /* */ /* Output: None. */ /* */ /* Return: On failure - Exits calling tst_exit(). Non '0' return code. */ /* On success - Exits calling tst_exit(). With '0' return code. */ /* */ /******************************************************************************/ extern void cleanup() { /* Remove tmp dir and all files in it */ TEST_CLEANUP; tst_rmdir(); /* Exit with appropriate return code. */ tst_exit(); } /* Local Functions */ /******************************************************************************/ /* */ /* Function: setup */ /* */ /* Description: Performs all one time setup for this test. This function is */ /* typically used to capture signals, create temporary dirs */ /* and temporary files that may be used in the course of this */ /* test. */ /* */ /* Input: None. */ /* */ /* Output: None. */ /* */ /* Return: On failure - Exits by calling cleanup(). */ /* On success - returns 0. */ /* */ /******************************************************************************/ 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"}; struct test_case_t { int exp_errno; char *errdesc; } test_cases[] = { { EINVAL, "EINVAL" } }; void handler(int sig) { tst_resm(TINFO,"Signal Handler Called with signal number %d\n",sig); return; } 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 * */ TEST(syscall(__NR_rt_sigaction,sig, &sa , &oldaction,INVAL_SIGSETSIZE)); if (TEST_RETURN == 0) { return 0; } else { return TEST_RETURN; } } int main(int ac, char **av) { int signal, flag; int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ /* parse standard options */ if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); tst_exit(); } setup(); /* Check looping state if -i option given */ for (lc = 0; TEST_LOOPING(lc); ++lc) { Tst_count = 0; for (testno = 0; testno < TST_TOTAL; ++testno) { for (signal = SIGRTMIN; signal <= (SIGRTMAX ); signal++){//signal for 34 to 65 for(flag=0; flag<5;flag++) { TEST(set_handler(signal, 0, test_flags[flag])); 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 = %d 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]); } } printf("\n"); } } } cleanup(); tst_exit(); } Index: rt_sigaction01.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** rt_sigaction01.c 21 May 2009 18:20:58 -0000 1.1 --- rt_sigaction01.c 6 Jul 2009 15:24:06 -0000 1.2 *************** *** 56,59 **** --- 56,68 ---- #include "linux_syscall_numbers.h" + #if defined __mips__ + #define SIGSETSIZE 16 + #endif + + #if defined __arm__ || __i386__ || __powerpc__ + #define SIGSETSIZE 8 + #endif + + /* Extern Global Variables */ extern int Tst_count; /* counter for tst_xxx routines. */ *************** *** 118,167 **** int test_flags[] = {SA_RESETHAND|SA_SIGINFO, SA_RESETHAND, SA_RESETHAND|SA_SIGINFO, SA_RESETHAND|SA_SIGINFO, SA_NOMASK}; void handler(int sig) { ! tst_resm(TINFO,"Here is signal handler. Got signal: %d, do nothing here\n", sig); return; } int ! set_handler(int sig, int sig_to_mask, int flag, int mask_flags) { struct sigaction sa, oldaction; - int err = 0; - if (flag == 0) { - tst_resm(TINFO,"flag0 - "); - sa.sa_sigaction = (void *)handler; - sa.sa_flags = mask_flags; - TEST(sigemptyset(&sa.sa_mask)); - TEST(sigaddset(&sa.sa_mask, sig_to_mask)); - TEST(err = syscall(__NR_rt_sigaction,sig, &sa, NULL,8)); - } else if (flag == 1) { - tst_resm(TINFO,"flag1 - "); - TEST(err = syscall(__NR_rt_sigaction,sig, (void *)-1, NULL,8)); - } else if (flag == 2) { - tst_resm(TINFO,"flag2 - "); - TEST(err = syscall(__NR_rt_sigaction,sig, NULL, (void *)-1,8)); - } else if (flag == 3) { - tst_resm(TINFO,"flag3 - "); sa.sa_sigaction = (void *)handler; sa.sa_flags = mask_flags; ! TEST(sigemptyset(&sa.sa_mask)); ! TEST(sigaddset(&sa.sa_mask, sig_to_mask)); ! TEST(err = syscall(__NR_rt_sigaction,sig, &sa, &oldaction, 8)); ! if (TEST_RETURN == 0) { ! return 0; ! } else { ! return TEST_ERRNO; ! } ! } else if (flag == 4){ ! TEST(err = syscall(__NR_rt_sigaction,sig, &sa, NULL,9)); ! } if (TEST_RETURN == 0) { return 0; } else { ! return TEST_ERRNO; } } --- 127,153 ---- 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\n",sig); return; } 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); ! TEST(syscall(__NR_rt_sigaction,sig, &sa, &oldaction,SIGSETSIZE)); if (TEST_RETURN == 0) { return 0; } else { ! return TEST_RETURN; } } *************** *** 169,173 **** int main(int ac, char **av) { ! int retnval, i, j; int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ --- 155,159 ---- int main(int ac, char **av) { ! int signal, flag; int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ *************** *** 186,201 **** for (testno = 0; testno < TST_TOTAL; ++testno) { ! for (i = 0; i <= (SIGRTMAX + 1); i++){//signal for 0 to 65 ! tst_resm(TINFO,"Signal : %d",i); ! for (j = 0; j < 4; j++){ ! TEST(retnval = set_handler(i, 0, j, test_flags[j])); if (TEST_RETURN == 0) { ! tst_resm(TPASS, "rt_sigaction call succeeded: result = %d",TEST_RETURN); } else { tst_resm(TFAIL, "%s failed - errno = %d : %s", TCID, TEST_ERRNO, strerror(TEST_ERRNO)); - cleanup(); - tst_exit(); } } } --- 172,188 ---- for (testno = 0; testno < TST_TOTAL; ++testno) { ! for (signal = SIGRTMIN; signal <= (SIGRTMAX ); signal++){//signal for 34 to 65 ! for(flag=0; flag<5;flag++) { ! TEST(set_handler(signal, 0, test_flags[flag])); if (TEST_RETURN == 0) { ! tst_resm(TINFO,"signal: %d ", signal); ! tst_resm(TPASS, "rt_sigaction call succeeded: result = %d ",TEST_RETURN ); ! tst_resm(TINFO, "sa.sa_flags = %s ",test_flags_list[flag]); ! kill(getpid(),signal); } else { tst_resm(TFAIL, "%s failed - errno = %d : %s", TCID, TEST_ERRNO, strerror(TEST_ERRNO)); } } + printf("\n"); } *************** *** 204,207 **** --- 191,195 ---- } } + cleanup(); tst_exit(); } |