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 < [email protected] >

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 [email protected]>
        */
+/******************************************************************************/
+#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 [email protected]>
        */
+/******************************************************************************/
+#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: ltp-rt_sigaction.patch
Description: Binary data

------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to