public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [FIX PATCHE] rt_sigaction
@ 2009-07-03 15:46 naresh kamboju
  2009-07-06 15:50 ` Subrata Modak
  0 siblings, 1 reply; 10+ messages in thread
From: naresh kamboju @ 2009-07-03 15:46 UTC (permalink / raw)
  To: ltp-list; +Cc: Jiri Palecek, maxin john, brinda_mn, Manas Kumar Nayak

[-- Attachment #1: Type: text/plain, Size: 22148 bytes --]

Hi,

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.

Best regards
Naresh Kamboju

/*******************************************************/
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 < naresh.kernel@gmail.com >

diff -Naurb a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c	2009-05-21
23:50:58.000000000 +0530
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c	2009-07-03
19:38:41.000000000 +0530
@@ -55,6 +55,15 @@
 #include "usctest.h"
 #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.         */
 extern char *TESTDIR;           /* temporary dir created by tst_tmpdir() */
@@ -117,58 +126,35 @@
 }

 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,"Here is signal handler. Got signal: %d, do
nothing here\n", sig);
+        tst_resm(TINFO,"Signal Handler Called with signal number %d\n",sig);
         return;
 }

 int
-set_handler(int sig, int sig_to_mask, int flag, int mask_flags)
+set_handler(int sig, int sig_to_mask, 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));
-        }
+                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_ERRNO;
+                        return TEST_RETURN;
         }
 }


 int main(int ac, char **av) {
-	int retnval, i, j;
+	int signal, flag;
         int lc;                 /* loop counter */
         char *msg;              /* message returned from parse_opts */
 	
@@ -185,24 +171,26 @@
                 Tst_count = 0;
                 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]));
+			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(TPASS, "rt_sigaction call succeeded: result =
%d",TEST_RETURN);
+        					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));
-							cleanup();
-							tst_exit();
                        				}
                 			}
+		 	printf("\n");	
         		}



                 }
         }	
+	cleanup();
         tst_exit();
 }

diff -Naurb a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c
b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c	1970-01-01
05:30:00.000000000 +0530
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c	2009-07-03
19:24:26.000000000 +0530
@@ -0,0 +1,183 @@
+/******************************************************************************/
+/* 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 maknayak@in.ibm.com>
        */
+/******************************************************************************/
+#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();
+}
+
diff -Naurb a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c
b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c	1970-01-01
05:30:00.000000000 +0530
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c	2009-07-03
19:24:12.000000000 +0530
@@ -0,0 +1,200 @@
+/******************************************************************************/
+/* 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 maknayak@in.ibm.com>
        */
+/******************************************************************************/
+#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();
+}
+

[-- Attachment #2: ltp-rt_sigaction.patch --]
[-- Type: application/octet-stream, Size: 24739 bytes --]

diff -Naurb a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c	2009-05-21 23:50:58.000000000 +0530
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c	2009-07-03 19:38:41.000000000 +0530
@@ -55,6 +55,15 @@
 #include "usctest.h"
 #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.         */
 extern char *TESTDIR;           /* temporary dir created by tst_tmpdir() */
@@ -117,58 +126,35 @@
 }
 
 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,"Here is signal handler. Got signal: %d, do nothing here\n", sig);
+        tst_resm(TINFO,"Signal Handler Called with signal number %d\n",sig);
         return;
 }
 
 int
-set_handler(int sig, int sig_to_mask, int flag, int mask_flags)
+set_handler(int sig, int sig_to_mask, 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));
-        }
+                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_ERRNO;
+                        return TEST_RETURN;
         }
 }
 
 
 int main(int ac, char **av) {
-	int retnval, i, j;
+	int signal, flag;
         int lc;                 /* loop counter */
         char *msg;              /* message returned from parse_opts */
 	
@@ -185,24 +171,26 @@
                 Tst_count = 0;
                 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]));
+			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(TPASS, "rt_sigaction call succeeded: result = %d",TEST_RETURN);
+        					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));
-							cleanup();
-							tst_exit();
                        				}
                 			}
+		 	printf("\n");	
         		}
 
 
 
                 }
         }	
+	cleanup();
         tst_exit();
 }
 
diff -Naurb a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c	1970-01-01 05:30:00.000000000 +0530
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction02.c	2009-07-03 19:24:26.000000000 +0530
@@ -0,0 +1,183 @@
+/******************************************************************************/
+/* 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 maknayak@in.ibm.com>                        */
+/******************************************************************************/
+#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();
+}
+
diff -Naurb a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c	1970-01-01 05:30:00.000000000 +0530
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction03.c	2009-07-03 19:24:12.000000000 +0530
@@ -0,0 +1,200 @@
+/******************************************************************************/
+/* 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 maknayak@in.ibm.com>                        */
+/******************************************************************************/
+#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();
+}
+

[-- Attachment #3: Type: text/plain, Size: 79 bytes --]

------------------------------------------------------------------------------

[-- Attachment #4: Type: text/plain, Size: 155 bytes --]

_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2009-07-09 17:35 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-03 15:46 [LTP] [FIX PATCHE] rt_sigaction naresh kamboju
2009-07-06 15:50 ` Subrata Modak
2009-07-07 11:52   ` naresh kamboju
2009-07-07 16:44     ` Garrett Cooper
2009-07-07 17:21       ` naresh kamboju
2009-07-07 17:26       ` naresh kamboju
2009-07-07 23:59         ` Garrett Cooper
2009-07-09 14:38           ` naresh kamboju
2009-07-09 14:41             ` naresh kamboju
2009-07-09 17:34             ` Garrett Cooper

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox