[LTP] [FIX PATCHE] rt_sigaction

naresh kamboju
2009-07-03T15:46:53Z

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