Re: [LTP] [FIX PATCHE] rt_sigaction

Subrata Modak
2009-07-06T15:51:20Z

On Fri, 2009-07-03 at 21:16 +0530, naresh kamboju wrote:
> 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 >

Thanks Naresh.

Regards--
Subrata

>
> 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();
> +}
> +