1 /*
2 * Copyright (c) International Business Machines Corp., 2001
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
12 * the GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 /* $Header: /cvsroot/ltp/ltp/testcases/kernel/syscalls/getitimer/getitimer03.c,v 1.7 2009/08/28 10:18:24 vapier Exp $ */
20
21 /*
22 * NAME
23 * getitimer03.c
24 *
25 * DESCRIPTION
26 * getitimer03 - check that a getitimer() call fails as expected
27 * with an incorrect first argument.
28 *
29 * CALLS
30 * getitimer()
31 *
32 * ALGORITHM
33 * loop if that option was specified
34 * allocate space and set up needed values
35 * issue the system call
36 * check the errno value
37 * issue a PASS message if we get EINVAL
38 * otherwise, the tests fails
39 * issue a FAIL message
40 * break any remaining tests
41 * call cleanup
42 *
43 * USAGE: <for command-line>
44 * getitmer03 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
45 * where, -c n : Run n copies concurrently.
46 * -e : Turn on errno logging.
47 * -i n : Execute test n times.
48 * -I x : Execute test for x seconds.
49 * -P x : Pause for x seconds between iterations.
50 * -t : Turn on syscall timing.
51 *
52 * USAGE
53 * ./getitimer03
54 *
55 * HISTORY
56 * 03/2001 - Written by Wayne Boyer
57 *
58 * RESTRICTIONS
59 * none
60 */
61
62 #include "test.h"
63
64 #include <errno.h>
65 #include <sys/time.h>
66
67 void cleanup(void);
68 void setup(void);
69
70 char *TCID = "getitimer03";
71 int TST_TOTAL = 1;
72
main(int ac,char ** av)73 int main(int ac, char **av)
74 {
75 int lc;
76 struct itimerval *value;
77
78 tst_parse_opts(ac, av, NULL, NULL);
79
80 setup(); /* global setup */
81
82 /* The following loop checks looping state if -i option given */
83
84 for (lc = 0; TEST_LOOPING(lc); lc++) {
85 /* reset tst_count in case we are looping */
86 tst_count = 0;
87
88 /* allocate some space for the timer structure */
89
90 if ((value = malloc((size_t)sizeof(struct itimerval))) ==
91 NULL) {
92 tst_brkm(TBROK, cleanup, "value malloc failed");
93 }
94
95 /*
96 * issue the system call with the TEST() macro
97 * ITIMER_REAL = 0, ITIMER_VIRTUAL = 1 and ITIMER_PROF = 2
98 */
99
100 /* make the first value negative to get a failure */
101 TEST(getitimer(-ITIMER_PROF, value));
102
103 if (TEST_RETURN == 0) {
104 tst_resm(TFAIL, "call failed to produce expected error "
105 "- errno = %d - %s", TEST_ERRNO,
106 strerror(TEST_ERRNO));
107 continue;
108 }
109
110 switch (TEST_ERRNO) {
111 case EINVAL:
112 tst_resm(TPASS, "expected failure - errno = %d - %s",
113 TEST_ERRNO, strerror(TEST_ERRNO));
114 break;
115 default:
116 tst_resm(TFAIL, "call failed to produce expected error "
117 "- errno = %d - %s", TEST_ERRNO,
118 strerror(TEST_ERRNO));
119 }
120
121 /*
122 * clean up things in case we are looping
123 */
124
125 free(value);
126 value = NULL;
127 }
128
129 cleanup();
130
131 tst_exit();
132 }
133
134 /*
135 * setup() - performs all the ONE TIME setup for this test.
136 */
setup(void)137 void setup(void)
138 {
139
140 tst_sig(NOFORK, DEF_HANDLER, cleanup);
141
142 TEST_PAUSE;
143 }
144
145 /*
146 * cleanup() - performs all the ONE TIME cleanup for this test at completion
147 * or premature exit.
148 */
cleanup(void)149 void cleanup(void)
150 {
151
152 }
153