Home | History | Annotate | Download | only in getrlimit
      1 /*
      2  *
      3  *   Copyright (c) Wipro Technologies, 2002. All Rights Reserved.
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 /****************************************************************************
     21  *
     22  *    TEST IDENTIFIER	: getrlimit02
     23  *
     24  *    EXECUTED BY	: anyone
     25  *
     26  *    TEST TITLE	: test for checking error conditions for getrlimit(2)
     27  *
     28  *    TEST CASE TOTAL	: 2
     29  *
     30  *    AUTHOR		: Suresh Babu V. <suresh.babu (at) wipro.com>
     31  *
     32  *    SIGNALS
     33  *      Uses SIGUSR1 to pause before test if option set.
     34  *      (See the parse_opts(3) man page).
     35  *
     36  * DESCRIPTION
     37  *      Verify that,
     38  *   1) getrlimit(2) returns -1 and sets errno to EFAULT if an invalid
     39  *	address is given for address parameter.
     40  *   2) getrlimit(2) returns -1 and sets errno to EINVAL if an invalid
     41  *	resource type (RLIM_NLIMITS is a out of range resource type) is
     42  *	passed.
     43  *
     44  * Setup:
     45  *   Setup signal handling.
     46  *   Pause for SIGUSR1 if option specified.
     47  *
     48  *  Test:
     49  *   Loop if the proper options are given.
     50  *   Execute system call
     51  *   Check return code, if system call failed and errno set == expected errno
     52  *		Issue sys call fails with expected return value and errno.
     53  *      Otherwise,
     54  *		Issue sys call failed to produce expected error.
     55  *
     56  *   Cleanup:
     57  *	Print errno log and/or timing stats if options given
     58  *
     59  * USAGE:  <for command-line>
     60  *  getrlimit02 [-c n] [-e] [-i n] [-I x] [-P x] [-p] [-t] [-h]
     61  *     where,  -c n  : Run n copies concurrently.
     62  *		-e   : Turn on errno logging.
     63  *		-i n : Execute test n times.
     64  *		-I x : Execute test for x seconds.
     65  *		-P x : Pause for x seconds between iterations.
     66  *		-p   : Pause for SIGUSR1 before startingt
     67  *		-t   : Turn on syscall timing.
     68  *		-h   : Display usage information.
     69  *
     70  ***************************************************************************/
     71 #include <stdio.h>
     72 #include <errno.h>
     73 #include <sys/resource.h>
     74 #include "test.h"
     75 
     76 #define RLIMIT_TOO_HIGH 1000
     77 
     78 char *TCID = "getrlimit02";
     79 
     80 static void cleanup(void);
     81 static void setup(void);
     82 
     83 static struct rlimit rlim;
     84 static struct test_case_t {
     85 	int exp_errno;		/* Expected error no            */
     86 	char *exp_errval;	/* Expected error value string  */
     87 	struct rlimit *rlim;	/* rlimit structure             */
     88 	int res_type;		/* resource type                */
     89 
     90 } testcases[] = {
     91 #ifndef UCLINUX
     92 	/* Skip since uClinux does not implement memory protection */
     93 	{
     94 	EFAULT, "EFAULT", (void *)-1, RLIMIT_NOFILE},
     95 #endif
     96 	{
     97 	EINVAL, "EINVAL", &rlim, RLIMIT_TOO_HIGH}
     98 };
     99 
    100 int TST_TOTAL = ARRAY_SIZE(testcases);
    101 
    102 int main(int ac, char **av)
    103 {
    104 	int i;
    105 	int lc;
    106 
    107 	tst_parse_opts(ac, av, NULL, NULL);
    108 
    109 	/* Do initial setup */
    110 	setup();
    111 
    112 	/* check for looping state if -i option is given */
    113 	for (lc = 0; TEST_LOOPING(lc); lc++) {
    114 		tst_count = 0;
    115 
    116 		for (i = 0; i < TST_TOTAL; ++i) {
    117 
    118 			/*
    119 			 * Test the system call.
    120 			 */
    121 			TEST(getrlimit(testcases[i].res_type,
    122 				       testcases[i].rlim));
    123 
    124 			if ((TEST_RETURN == -1) &&
    125 			    (TEST_ERRNO == testcases[i].exp_errno)) {
    126 				tst_resm(TPASS, "expected failure; got %s",
    127 					 testcases[i].exp_errval);
    128 			} else {
    129 				tst_resm(TFAIL, "call failed to produce "
    130 					 "expected error;  errno: %d : %s",
    131 					 TEST_ERRNO, strerror(TEST_ERRNO));
    132 			}
    133 		}
    134 	}
    135 	/* do cleanup and exit */
    136 	cleanup();
    137 
    138 	tst_exit();
    139 }
    140 
    141 /*
    142  * setup() - performs all one time setup for this test.
    143  */
    144 void setup(void)
    145 {
    146 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
    147 
    148 	/* Pause if the option was specified */
    149 	TEST_PAUSE;
    150 }
    151 
    152 /*
    153  * cleanup()  - performs all one time cleanup for this test
    154  *		completion or premature exit.
    155  */
    156 void cleanup(void)
    157 {
    158 
    159 }
    160