1/*
2 *
3 *   Copyright (c) Red Hat Inc., 2007
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 * NAME
22 *	posix_fadvise01.c
23 *
24 * DESCRIPTION
25 *	Check the value that posix_fadvise returns for wrong ADVISE value.
26 *
27 * USAGE
28 *	posix_fadvise01
29 *
30 * HISTORY
31 *	11/2007 Initial version by Masatake YAMATO <yamato@redhat.com>
32 *
33 * RESTRICTIONS
34 *	None
35 */
36
37#define _XOPEN_SOURCE 600
38#include <fcntl.h>
39
40#include <unistd.h>
41#include <signal.h>
42#include <errno.h>
43
44#include "test.h"
45#include "safe_macros.h"
46
47#include "lapi/syscalls.h"
48#ifndef _FILE_OFFSET_BITS
49#define _FILE_OFFSET_BITS 32
50#endif
51
52#ifndef __NR_fadvise64
53#define __NR_fadvise64 0
54#endif
55
56void setup();
57void cleanup();
58
59TCID_DEFINE(posix_fadvise01);
60
61#ifndef ANDROID
62char fname[] = "/bin/cat";	/* test executable to open */
63#else
64char fname[] = "/system/bin/cat";	/* test executable to open */
65#endif
66int fd = -1;			/* initialized in open */
67
68int expected_return = 0;
69
70int defined_advise[] = {
71	POSIX_FADV_NORMAL,
72	POSIX_FADV_SEQUENTIAL,
73	POSIX_FADV_RANDOM,
74	POSIX_FADV_NOREUSE,
75	POSIX_FADV_WILLNEED,
76	POSIX_FADV_DONTNEED,
77};
78
79#define defined_advise_total ARRAY_SIZE(defined_advise)
80
81int TST_TOTAL = defined_advise_total;
82
83int main(int ac, char **av)
84{
85	int lc;
86	int i;
87
88	/* Check this system has fadvise64 system which is used
89	   in posix_fadvise. */
90	if ((_FILE_OFFSET_BITS != 64) && (__NR_fadvise64 == 0)) {
91		tst_resm(TWARN,
92			 "This test can only run on kernels that implements ");
93		tst_resm(TWARN, "fadvise64 which is used from posix_fadvise");
94		exit(0);
95	}
96
97	/*
98	 * parse standard options
99	 */
100	tst_parse_opts(ac, av, NULL, NULL);
101
102	/*
103	 * perform global setup for test
104	 */
105	setup();
106
107	/*
108	 * check looping state if -i option given on the command line
109	 */
110	for (lc = 0; TEST_LOOPING(lc); lc++) {
111
112		tst_count = 0;
113
114		/* loop through the test cases */
115		for (i = 0; i < defined_advise_total; i++) {
116
117			TEST(posix_fadvise(fd, 0, 0, defined_advise[i]));
118
119			/* Man page says:
120			   "On error, an error number is returned." */
121			if (TEST_RETURN == expected_return) {
122				tst_resm(TPASS, "call succeeded expectedly");
123			} else {
124				tst_resm(TFAIL,
125					 "unexpected return value - %ld : %s, advise %d - "
126					 "expected %d",
127					 TEST_RETURN,
128					 strerror(TEST_RETURN),
129					 defined_advise[i], expected_return);
130			}
131		}
132	}
133
134	/*
135	 * cleanup and exit
136	 */
137	cleanup();
138
139	tst_exit();
140}
141
142/*
143 * setup() - performs all ONE TIME setup for this test.
144 */
145void setup(void)
146{
147
148	tst_sig(NOFORK, DEF_HANDLER, cleanup);
149
150	TEST_PAUSE;
151
152	fd = SAFE_OPEN(cleanup, fname, O_RDONLY);
153}
154
155/*
156 * cleanup() - performs all ONE TIME cleanup for this test at
157 *		completion or premature exit.
158 */
159void cleanup(void)
160{
161
162	if (fd != -1) {
163		close(fd);
164	}
165
166}
167