pread01.c revision e38b961c385192f0d804914b77bd590734b42e75
1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
4865695bbc89088b9526ea9045410e5afb70a985cplars *
5865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
6865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
7865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
8865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
9865695bbc89088b9526ea9045410e5afb70a985cplars *
10865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
11865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
14865695bbc89088b9526ea9045410e5afb70a985cplars *
15865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
16865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18865695bbc89088b9526ea9045410e5afb70a985cplars */
19865695bbc89088b9526ea9045410e5afb70a985cplars
20865695bbc89088b9526ea9045410e5afb70a985cplars/*
21865695bbc89088b9526ea9045410e5afb70a985cplars * Test Name: pread01
22865695bbc89088b9526ea9045410e5afb70a985cplars *
23865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description:
24865695bbc89088b9526ea9045410e5afb70a985cplars *  Verify the functionality of pread() by writing known data using pwrite()
25865695bbc89088b9526ea9045410e5afb70a985cplars *  to the file at various specified offsets and later read from the file from
2622cf20438b01cbbad7ce561641e44b208d569d42vapier *  various specified offsets, comparing the data read aganist the data
27865695bbc89088b9526ea9045410e5afb70a985cplars *  written.
28865695bbc89088b9526ea9045410e5afb70a985cplars *
29865695bbc89088b9526ea9045410e5afb70a985cplars * Expected Result:
30865695bbc89088b9526ea9045410e5afb70a985cplars *  pread() should succeed to read the expected no. of bytes of data and
31865695bbc89088b9526ea9045410e5afb70a985cplars *  the data read should match aganist the data written to the file.
32865695bbc89088b9526ea9045410e5afb70a985cplars *
33865695bbc89088b9526ea9045410e5afb70a985cplars * Algorithm:
34865695bbc89088b9526ea9045410e5afb70a985cplars *  Setup:
35865695bbc89088b9526ea9045410e5afb70a985cplars *   Setup signal handling.
36865695bbc89088b9526ea9045410e5afb70a985cplars *   Create temporary directory.
37865695bbc89088b9526ea9045410e5afb70a985cplars *   Pause for SIGUSR1 if option specified.
38865695bbc89088b9526ea9045410e5afb70a985cplars *
39865695bbc89088b9526ea9045410e5afb70a985cplars *  Test:
40865695bbc89088b9526ea9045410e5afb70a985cplars *   Loop if the proper options are given.
41865695bbc89088b9526ea9045410e5afb70a985cplars *   Execute system call
42865695bbc89088b9526ea9045410e5afb70a985cplars *   Check return code, if system call failed (return=-1)
4322cf20438b01cbbad7ce561641e44b208d569d42vapier *      Issue a FAIL message.
44865695bbc89088b9526ea9045410e5afb70a985cplars *   Otherwise,
4522cf20438b01cbbad7ce561641e44b208d569d42vapier *      Verify the Functionality of system call
46865695bbc89088b9526ea9045410e5afb70a985cplars *      if successful,
4722cf20438b01cbbad7ce561641e44b208d569d42vapier *          Issue Functionality-Pass message.
48865695bbc89088b9526ea9045410e5afb70a985cplars *      Otherwise,
4922cf20438b01cbbad7ce561641e44b208d569d42vapier *          Issue Functionality-Fail message.
50865695bbc89088b9526ea9045410e5afb70a985cplars *  Cleanup:
51865695bbc89088b9526ea9045410e5afb70a985cplars *   Print errno log and/or timing stats if options given
52865695bbc89088b9526ea9045410e5afb70a985cplars *   Delete the temporary directory created.
53865695bbc89088b9526ea9045410e5afb70a985cplars *
54865695bbc89088b9526ea9045410e5afb70a985cplars * Usage:  <for command-line>
55865695bbc89088b9526ea9045410e5afb70a985cplars *  pread01 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
56865695bbc89088b9526ea9045410e5afb70a985cplars *     where,  -c n : Run n copies concurrently.
57865695bbc89088b9526ea9045410e5afb70a985cplars *             -f   : Turn off functionality Testing.
5822cf20438b01cbbad7ce561641e44b208d569d42vapier *             -i n : Execute test n times.
5922cf20438b01cbbad7ce561641e44b208d569d42vapier *             -I x : Execute test for x seconds.
6022cf20438b01cbbad7ce561641e44b208d569d42vapier *             -P x : Pause for x seconds between iterations.
6122cf20438b01cbbad7ce561641e44b208d569d42vapier *             -t   : Turn on syscall timing.
62865695bbc89088b9526ea9045410e5afb70a985cplars *
63865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
64865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
65865695bbc89088b9526ea9045410e5afb70a985cplars *
66865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS:
67865695bbc89088b9526ea9045410e5afb70a985cplars *  None.
68865695bbc89088b9526ea9045410e5afb70a985cplars */
6974948ad801d4aba1c872652580b8b331e41aefcaplars
7074948ad801d4aba1c872652580b8b331e41aefcaplars#define _XOPEN_SOURCE 500
7174948ad801d4aba1c872652580b8b331e41aefcaplars
72865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdlib.h>
73865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
74865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h>
75865695bbc89088b9526ea9045410e5afb70a985cplars#include <fcntl.h>
76923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak#include <inttypes.h>
77865695bbc89088b9526ea9045410e5afb70a985cplars
78865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h"
79865695bbc89088b9526ea9045410e5afb70a985cplars#include "usctest.h"
80865695bbc89088b9526ea9045410e5afb70a985cplars
81865695bbc89088b9526ea9045410e5afb70a985cplars#define TEMPFILE	"pread_file"
82865695bbc89088b9526ea9045410e5afb70a985cplars#define K1              1024
83865695bbc89088b9526ea9045410e5afb70a985cplars#define K2              (K1 * 2)
84865695bbc89088b9526ea9045410e5afb70a985cplars#define K3              (K1 * 3)
85865695bbc89088b9526ea9045410e5afb70a985cplars#define K4              (K1 * 4)
86865695bbc89088b9526ea9045410e5afb70a985cplars#define NBUFS           4
87865695bbc89088b9526ea9045410e5afb70a985cplars
88fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "pread01";
89fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 1;
90865695bbc89088b9526ea9045410e5afb70a985cplars
91865695bbc89088b9526ea9045410e5afb70a985cplarsint fildes;			/* file descriptor for tempfile */
92865695bbc89088b9526ea9045410e5afb70a985cplarschar *write_buf[NBUFS];		/* buffer to hold data to be written */
93865695bbc89088b9526ea9045410e5afb70a985cplarschar *read_buf[NBUFS];		/* buffer to hold data read from file */
94865695bbc89088b9526ea9045410e5afb70a985cplars
95865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup();			/* Main setup function of test */
96865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup();			/* cleanup function for the test */
9756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid l_seek(int, off_t, int, off_t);	/* function to call lseek() */
98865695bbc89088b9526ea9045410e5afb70a985cplarsvoid init_buffers();		/* function to initialize/allocate buffers */
99865695bbc89088b9526ea9045410e5afb70a985cplarsvoid compare_bufers();		/* function to compare o/p of pread/pwrite */
100865695bbc89088b9526ea9045410e5afb70a985cplars
10156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
102865695bbc89088b9526ea9045410e5afb70a985cplars{
10389af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
1040b9589f3f9c0345b29cfcf7da5a1253c708303ebCyril Hrubis	const char *msg;
105865695bbc89088b9526ea9045410e5afb70a985cplars	int nread;		/* no. of bytes read by pread() */
10622cf20438b01cbbad7ce561641e44b208d569d42vapier
1077d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper	if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
10860fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
109865695bbc89088b9526ea9045410e5afb70a985cplars
110865695bbc89088b9526ea9045410e5afb70a985cplars	setup();
111865695bbc89088b9526ea9045410e5afb70a985cplars
112865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
113865695bbc89088b9526ea9045410e5afb70a985cplars
114d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		/* Reset tst_count in case we are looping */
115d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
116865695bbc89088b9526ea9045410e5afb70a985cplars
11722cf20438b01cbbad7ce561641e44b208d569d42vapier		/*
118865695bbc89088b9526ea9045410e5afb70a985cplars		 * Call pread() of K1 data (should be 2's) at offset K2.
119865695bbc89088b9526ea9045410e5afb70a985cplars		 */
12022cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[2], K1, K2);
121865695bbc89088b9526ea9045410e5afb70a985cplars
122865695bbc89088b9526ea9045410e5afb70a985cplars		/* Check for the return value of pread() */
123865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
124865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K2 failed: "
125865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
126865695bbc89088b9526ea9045410e5afb70a985cplars		}
127865695bbc89088b9526ea9045410e5afb70a985cplars
128865695bbc89088b9526ea9045410e5afb70a985cplars		/*
129865695bbc89088b9526ea9045410e5afb70a985cplars		 * We should still be at offset K4,
130865695bbc89088b9526ea9045410e5afb70a985cplars		 * which we were at the end of block 0.
131865695bbc89088b9526ea9045410e5afb70a985cplars		 */
132865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K4);
133865695bbc89088b9526ea9045410e5afb70a985cplars
134865695bbc89088b9526ea9045410e5afb70a985cplars		/* Now lseek() to offset 0. */
135865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_SET, 0);
136865695bbc89088b9526ea9045410e5afb70a985cplars
137865695bbc89088b9526ea9045410e5afb70a985cplars		/* pread() K1 of data (should be 3's) at offset K3. */
13822cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[3], K1, K3);
139865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
140865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K3 failed: "
141865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
142865695bbc89088b9526ea9045410e5afb70a985cplars		}
143865695bbc89088b9526ea9045410e5afb70a985cplars
144865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should still be at offset 0. */
145865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, 0);
146865695bbc89088b9526ea9045410e5afb70a985cplars
147865695bbc89088b9526ea9045410e5afb70a985cplars		/*
14822cf20438b01cbbad7ce561641e44b208d569d42vapier		 * Do a normal read() of K1 data (should be 0's)
149865695bbc89088b9526ea9045410e5afb70a985cplars		 * which should take place at offset 0 and move the
150865695bbc89088b9526ea9045410e5afb70a985cplars		 * file pointer to an offset of K1.
151865695bbc89088b9526ea9045410e5afb70a985cplars		 */
152865695bbc89088b9526ea9045410e5afb70a985cplars		if ((nread = read(fildes, read_buf[0], K1)) != K1) {
153865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "read() at off. 0 failed: "
154865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, errno=%d", nread, errno);
155865695bbc89088b9526ea9045410e5afb70a985cplars		}
156865695bbc89088b9526ea9045410e5afb70a985cplars
157865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should now be at an offset of K1. */
158865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K1);
159865695bbc89088b9526ea9045410e5afb70a985cplars
16056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		/* pread() of K1 data (should be 1's) at offset K1. */
16122cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[1], K1, K1);
162865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
163865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K1 failed: "
164865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
165865695bbc89088b9526ea9045410e5afb70a985cplars		}
166865695bbc89088b9526ea9045410e5afb70a985cplars
167865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should still be at offset K1. */
168865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K1);
169865695bbc89088b9526ea9045410e5afb70a985cplars
170865695bbc89088b9526ea9045410e5afb70a985cplars		/*
171e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * Compare the read buffer data read
172e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * with the data written to write buffer
173e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * in the setup.
174865695bbc89088b9526ea9045410e5afb70a985cplars		 */
175e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		compare_bufers();
176865695bbc89088b9526ea9045410e5afb70a985cplars
177865695bbc89088b9526ea9045410e5afb70a985cplars		/* reset our location to offset K4 in case we are looping */
178865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, K4, SEEK_SET, K4);
1792c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
1802c28215423293e443469a07ae7011135d058b671Garrett Cooper
181865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
1821e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper	tst_exit();
1832c28215423293e443469a07ae7011135d058b671Garrett Cooper}
184865695bbc89088b9526ea9045410e5afb70a985cplars
185865695bbc89088b9526ea9045410e5afb70a985cplars/*
186865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test.
187865695bbc89088b9526ea9045410e5afb70a985cplars *
188865695bbc89088b9526ea9045410e5afb70a985cplars *  Initialize/allocate read/write buffers.
189865695bbc89088b9526ea9045410e5afb70a985cplars *  Create a temporary directory and a file under it and
190865695bbc89088b9526ea9045410e5afb70a985cplars *  write know data at different offset positions.
191865695bbc89088b9526ea9045410e5afb70a985cplars */
192c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void)
193865695bbc89088b9526ea9045410e5afb70a985cplars{
19456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int nwrite = 0;		/* no. of bytes written by pwrite() */
195865695bbc89088b9526ea9045410e5afb70a985cplars
196865695bbc89088b9526ea9045410e5afb70a985cplars	tst_sig(FORK, DEF_HANDLER, cleanup);
197865695bbc89088b9526ea9045410e5afb70a985cplars
198865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_PAUSE;
199865695bbc89088b9526ea9045410e5afb70a985cplars
200865695bbc89088b9526ea9045410e5afb70a985cplars	/* Allocate/Initialize the read/write buffer with know data */
201865695bbc89088b9526ea9045410e5afb70a985cplars	init_buffers();
202865695bbc89088b9526ea9045410e5afb70a985cplars
203865695bbc89088b9526ea9045410e5afb70a985cplars	tst_tmpdir();
204865695bbc89088b9526ea9045410e5afb70a985cplars
205865695bbc89088b9526ea9045410e5afb70a985cplars	/* Creat a temporary file used for mapping */
206865695bbc89088b9526ea9045410e5afb70a985cplars	if ((fildes = open(TEMPFILE, O_RDWR | O_CREAT, 0666)) < 0) {
207865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "open() on %s failed, errno=%d : %s",
208865695bbc89088b9526ea9045410e5afb70a985cplars			 TEMPFILE, errno, strerror(errno));
209865695bbc89088b9526ea9045410e5afb70a985cplars	}
210865695bbc89088b9526ea9045410e5afb70a985cplars
211865695bbc89088b9526ea9045410e5afb70a985cplars	/* pwrite() K1 of data (0's) at offset 0 of temporary file */
212865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[0], K1, 0)) != K1) {
213865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write on %s, "
214865695bbc89088b9526ea9045410e5afb70a985cplars			 "errno=%d : %s", TEMPFILE, errno, strerror(errno));
215865695bbc89088b9526ea9045410e5afb70a985cplars	}
21622cf20438b01cbbad7ce561641e44b208d569d42vapier
217865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should still be at offset 0. */
218865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, 0, SEEK_CUR, 0);
219865695bbc89088b9526ea9045410e5afb70a985cplars
220865695bbc89088b9526ea9045410e5afb70a985cplars	/* Now, lseek() to a non K boundary, just to be different. */
22156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	l_seek(fildes, K1 / 2, SEEK_SET, K1 / 2);
222865695bbc89088b9526ea9045410e5afb70a985cplars
223865695bbc89088b9526ea9045410e5afb70a985cplars	/* Again, pwrite() K1 of data (2's) at offset K2 of temporary file */
224865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[2], K1, K2)) != K1) {
225865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write at %d off. "
226865695bbc89088b9526ea9045410e5afb70a985cplars			 "on %s, errno=%d : %s", K2, TEMPFILE, errno,
227865695bbc89088b9526ea9045410e5afb70a985cplars			 strerror(errno));
228865695bbc89088b9526ea9045410e5afb70a985cplars	}
229865695bbc89088b9526ea9045410e5afb70a985cplars
230865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should still be at our non K boundary. */
23156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	l_seek(fildes, 0, SEEK_CUR, K1 / 2);
232865695bbc89088b9526ea9045410e5afb70a985cplars
233865695bbc89088b9526ea9045410e5afb70a985cplars	/* lseek() to an offset of K3. */
234865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, K3, SEEK_SET, K3);
235865695bbc89088b9526ea9045410e5afb70a985cplars
236865695bbc89088b9526ea9045410e5afb70a985cplars	/*
237865695bbc89088b9526ea9045410e5afb70a985cplars	 * Using write(), write of K1 of data (3's) which should take
238865695bbc89088b9526ea9045410e5afb70a985cplars	 * place at an offset of K3, moving the file pointer to K4.
239865695bbc89088b9526ea9045410e5afb70a985cplars	 */
240865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = write(fildes, write_buf[3], K1)) != K1) {
241865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "write() failed: nwrite=%d, errno=%d "
242865695bbc89088b9526ea9045410e5afb70a985cplars			 ": %s", nwrite, errno, strerror(errno));
243865695bbc89088b9526ea9045410e5afb70a985cplars	}
244865695bbc89088b9526ea9045410e5afb70a985cplars
245865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should be at offset K4. */
246865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, 0, SEEK_CUR, K4);
247865695bbc89088b9526ea9045410e5afb70a985cplars
248865695bbc89088b9526ea9045410e5afb70a985cplars	/* Again, pwrite() K1 of data (1's) at offset K1. */
249865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[1], K1, K1)) != K1) {
250865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write at %d off. "
251865695bbc89088b9526ea9045410e5afb70a985cplars			 "on %s, errno=%d : %s", K1, TEMPFILE, errno,
252865695bbc89088b9526ea9045410e5afb70a985cplars			 strerror(errno));
253865695bbc89088b9526ea9045410e5afb70a985cplars	}
254865695bbc89088b9526ea9045410e5afb70a985cplars}
255865695bbc89088b9526ea9045410e5afb70a985cplars
256865695bbc89088b9526ea9045410e5afb70a985cplars/*
257865695bbc89088b9526ea9045410e5afb70a985cplars * init_buffers - allocates both write_buf and read_buf arrays.
258865695bbc89088b9526ea9045410e5afb70a985cplars *
259865695bbc89088b9526ea9045410e5afb70a985cplars *  Allocate the read and write buffers.
260865695bbc89088b9526ea9045410e5afb70a985cplars *  Fill the write buffer with the following data like,
261865695bbc89088b9526ea9045410e5afb70a985cplars *    write_buf[0] has 0's, write_buf[1] has 1's, write_buf[2] has 2's
262865695bbc89088b9526ea9045410e5afb70a985cplars *    write_buf[3] has 3's.
263865695bbc89088b9526ea9045410e5afb70a985cplars */
264c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid init_buffers(void)
265865695bbc89088b9526ea9045410e5afb70a985cplars{
266865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* counter variable for loop */
267865695bbc89088b9526ea9045410e5afb70a985cplars
268865695bbc89088b9526ea9045410e5afb70a985cplars	/* Allocate and Initialize read/write buffer */
269865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
270865695bbc89088b9526ea9045410e5afb70a985cplars		write_buf[count] = (char *)malloc(K1);
271865695bbc89088b9526ea9045410e5afb70a985cplars		read_buf[count] = (char *)malloc(K1);
272865695bbc89088b9526ea9045410e5afb70a985cplars
273865695bbc89088b9526ea9045410e5afb70a985cplars		if ((write_buf[count] == NULL) || (read_buf[count] == NULL)) {
27453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK, NULL,
275865695bbc89088b9526ea9045410e5afb70a985cplars				 "malloc() failed on read/write buffers");
276865695bbc89088b9526ea9045410e5afb70a985cplars		}
277865695bbc89088b9526ea9045410e5afb70a985cplars		memset(write_buf[count], count, K1);
278865695bbc89088b9526ea9045410e5afb70a985cplars	}
279865695bbc89088b9526ea9045410e5afb70a985cplars}
280865695bbc89088b9526ea9045410e5afb70a985cplars
281865695bbc89088b9526ea9045410e5afb70a985cplars/*
282865695bbc89088b9526ea9045410e5afb70a985cplars * l_seek() - local front end to lseek().
283865695bbc89088b9526ea9045410e5afb70a985cplars *
284865695bbc89088b9526ea9045410e5afb70a985cplars *  "checkoff" is the offset at which we believe we should be at.
285865695bbc89088b9526ea9045410e5afb70a985cplars *  Used to validate pread/pwrite don't move the offset.
286865695bbc89088b9526ea9045410e5afb70a985cplars */
28756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid l_seek(int fdesc, off_t offset, int whence, off_t checkoff)
288865695bbc89088b9526ea9045410e5afb70a985cplars{
289865695bbc89088b9526ea9045410e5afb70a985cplars	off_t offloc;		/* offset ret. from lseek() */
290865695bbc89088b9526ea9045410e5afb70a985cplars
291865695bbc89088b9526ea9045410e5afb70a985cplars	if ((offloc = lseek(fdesc, offset, whence)) != checkoff) {
292354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_resm(TWARN, "return = %" PRId64 ", expected %" PRId64,
293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 (int64_t) offloc, (int64_t) checkoff);
294354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "lseek() on %s failed",
295923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak			 TEMPFILE);
296865695bbc89088b9526ea9045410e5afb70a985cplars	}
297865695bbc89088b9526ea9045410e5afb70a985cplars}
298865695bbc89088b9526ea9045410e5afb70a985cplars
299865695bbc89088b9526ea9045410e5afb70a985cplars/*
300865695bbc89088b9526ea9045410e5afb70a985cplars * compare_bufers() - Compare the contents of read buffer aganist the
30122cf20438b01cbbad7ce561641e44b208d569d42vapier *                    write buffer contents.
302865695bbc89088b9526ea9045410e5afb70a985cplars *
303865695bbc89088b9526ea9045410e5afb70a985cplars *  The contents of the index of each buffer should be as follows:
304865695bbc89088b9526ea9045410e5afb70a985cplars *  [0] has 0's, [1] has 1's, [2] has 2's, and [3] has 3's.
305865695bbc89088b9526ea9045410e5afb70a985cplars *
306865695bbc89088b9526ea9045410e5afb70a985cplars *  This function does memcmp of read/write buffer and display message
307865695bbc89088b9526ea9045410e5afb70a985cplars *  about the functionality of pread().
308865695bbc89088b9526ea9045410e5afb70a985cplars */
309c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid compare_bufers(void)
310865695bbc89088b9526ea9045410e5afb70a985cplars{
311865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* index for the loop */
312865695bbc89088b9526ea9045410e5afb70a985cplars	int err_flg = 0;	/* flag to indicate error */
313865695bbc89088b9526ea9045410e5afb70a985cplars
314865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
315865695bbc89088b9526ea9045410e5afb70a985cplars		if (memcmp(write_buf[count], read_buf[count], K1) != 0) {
316865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TFAIL, "read/write buffer data mismatch");
317865695bbc89088b9526ea9045410e5afb70a985cplars			err_flg++;
318865695bbc89088b9526ea9045410e5afb70a985cplars		}
319865695bbc89088b9526ea9045410e5afb70a985cplars	}
320865695bbc89088b9526ea9045410e5afb70a985cplars
321865695bbc89088b9526ea9045410e5afb70a985cplars	/* If no erros, Test successful */
322865695bbc89088b9526ea9045410e5afb70a985cplars	if (!err_flg) {
323865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TPASS, "Functionality of pread() is correct");
324865695bbc89088b9526ea9045410e5afb70a985cplars	}
325865695bbc89088b9526ea9045410e5afb70a985cplars}
326865695bbc89088b9526ea9045410e5afb70a985cplars
327865695bbc89088b9526ea9045410e5afb70a985cplars/*
328865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all ONE TIME cleanup for this test at
329865695bbc89088b9526ea9045410e5afb70a985cplars *             completion or premature exit.
330865695bbc89088b9526ea9045410e5afb70a985cplars *
33122cf20438b01cbbad7ce561641e44b208d569d42vapier *             Deallocate the memory allocated to read/write buffers.
33222cf20438b01cbbad7ce561641e44b208d569d42vapier *             Close the temporary file.
33322cf20438b01cbbad7ce561641e44b208d569d42vapier *             Remove the temporary directory created.
334865695bbc89088b9526ea9045410e5afb70a985cplars */
335c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void)
336865695bbc89088b9526ea9045410e5afb70a985cplars{
337865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* index for the loop */
338865695bbc89088b9526ea9045410e5afb70a985cplars
339865695bbc89088b9526ea9045410e5afb70a985cplars	/*
340865695bbc89088b9526ea9045410e5afb70a985cplars	 * print timing stats if that option was specified.
341865695bbc89088b9526ea9045410e5afb70a985cplars	 * print errno log if that option was specified.
342865695bbc89088b9526ea9045410e5afb70a985cplars	 */
343865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_CLEANUP;
344865695bbc89088b9526ea9045410e5afb70a985cplars
345865695bbc89088b9526ea9045410e5afb70a985cplars	/* Free the memory allocated for the read/write buffer */
346865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
347865695bbc89088b9526ea9045410e5afb70a985cplars		free(write_buf[count]);
348865695bbc89088b9526ea9045410e5afb70a985cplars		free(read_buf[count]);
349865695bbc89088b9526ea9045410e5afb70a985cplars	}
350865695bbc89088b9526ea9045410e5afb70a985cplars
351865695bbc89088b9526ea9045410e5afb70a985cplars	/* Close the temporary file */
352865695bbc89088b9526ea9045410e5afb70a985cplars	if (close(fildes) < 0) {
353865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, NULL, "close() on %s Failed, errno=%d : %s",
354865695bbc89088b9526ea9045410e5afb70a985cplars			 TEMPFILE, errno, strerror(errno));
355865695bbc89088b9526ea9045410e5afb70a985cplars	}
356865695bbc89088b9526ea9045410e5afb70a985cplars
357865695bbc89088b9526ea9045410e5afb70a985cplars	tst_rmdir();
358865695bbc89088b9526ea9045410e5afb70a985cplars
359ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
360