pread01.c revision 1e6f5a673655551de5734ff31ef48cd63b604e6d
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
17865695bbc89088b9526ea9045410e5afb70a985cplars *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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
8856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "pread01";		/* Test program identifier.    */
8956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint TST_TOTAL = 1;		/* Total number of test cases. */
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{
103865695bbc89088b9526ea9045410e5afb70a985cplars	int lc;			/* loop counter */
104865695bbc89088b9526ea9045410e5afb70a985cplars	char *msg;		/* message returned from parse_opts */
105865695bbc89088b9526ea9045410e5afb70a985cplars	int nread;		/* no. of bytes read by pread() */
10622cf20438b01cbbad7ce561641e44b208d569d42vapier
107865695bbc89088b9526ea9045410e5afb70a985cplars	/* Parse standard options given to run the test. */
1087d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper	if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
10960fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
110865695bbc89088b9526ea9045410e5afb70a985cplars
111865695bbc89088b9526ea9045410e5afb70a985cplars	setup();
112865695bbc89088b9526ea9045410e5afb70a985cplars
113865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
114865695bbc89088b9526ea9045410e5afb70a985cplars
115865695bbc89088b9526ea9045410e5afb70a985cplars		/* Reset Tst_count in case we are looping */
11656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		Tst_count = 0;
117865695bbc89088b9526ea9045410e5afb70a985cplars
11822cf20438b01cbbad7ce561641e44b208d569d42vapier		/*
119865695bbc89088b9526ea9045410e5afb70a985cplars		 * Call pread() of K1 data (should be 2's) at offset K2.
120865695bbc89088b9526ea9045410e5afb70a985cplars		 */
12122cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[2], K1, K2);
122865695bbc89088b9526ea9045410e5afb70a985cplars
123865695bbc89088b9526ea9045410e5afb70a985cplars		/* Check for the return value of pread() */
124865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
125865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K2 failed: "
126865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
127865695bbc89088b9526ea9045410e5afb70a985cplars		}
128865695bbc89088b9526ea9045410e5afb70a985cplars
129865695bbc89088b9526ea9045410e5afb70a985cplars		/*
130865695bbc89088b9526ea9045410e5afb70a985cplars		 * We should still be at offset K4,
131865695bbc89088b9526ea9045410e5afb70a985cplars		 * which we were at the end of block 0.
132865695bbc89088b9526ea9045410e5afb70a985cplars		 */
133865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K4);
134865695bbc89088b9526ea9045410e5afb70a985cplars
135865695bbc89088b9526ea9045410e5afb70a985cplars		/* Now lseek() to offset 0. */
136865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_SET, 0);
137865695bbc89088b9526ea9045410e5afb70a985cplars
138865695bbc89088b9526ea9045410e5afb70a985cplars		/* pread() K1 of data (should be 3's) at offset K3. */
13922cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[3], K1, K3);
140865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
141865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K3 failed: "
142865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
143865695bbc89088b9526ea9045410e5afb70a985cplars		}
144865695bbc89088b9526ea9045410e5afb70a985cplars
145865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should still be at offset 0. */
146865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, 0);
147865695bbc89088b9526ea9045410e5afb70a985cplars
148865695bbc89088b9526ea9045410e5afb70a985cplars		/*
14922cf20438b01cbbad7ce561641e44b208d569d42vapier		 * Do a normal read() of K1 data (should be 0's)
150865695bbc89088b9526ea9045410e5afb70a985cplars		 * which should take place at offset 0 and move the
151865695bbc89088b9526ea9045410e5afb70a985cplars		 * file pointer to an offset of K1.
152865695bbc89088b9526ea9045410e5afb70a985cplars		 */
153865695bbc89088b9526ea9045410e5afb70a985cplars		if ((nread = read(fildes, read_buf[0], K1)) != K1) {
154865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "read() at off. 0 failed: "
155865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, errno=%d", nread, errno);
156865695bbc89088b9526ea9045410e5afb70a985cplars		}
157865695bbc89088b9526ea9045410e5afb70a985cplars
158865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should now be at an offset of K1. */
159865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K1);
160865695bbc89088b9526ea9045410e5afb70a985cplars
16156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		/* pread() of K1 data (should be 1's) at offset K1. */
16222cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[1], K1, K1);
163865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
164865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K1 failed: "
165865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
166865695bbc89088b9526ea9045410e5afb70a985cplars		}
167865695bbc89088b9526ea9045410e5afb70a985cplars
168865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should still be at offset K1. */
169865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K1);
170865695bbc89088b9526ea9045410e5afb70a985cplars
171865695bbc89088b9526ea9045410e5afb70a985cplars		/*
172865695bbc89088b9526ea9045410e5afb70a985cplars		 * Perform functional verification if test
173865695bbc89088b9526ea9045410e5afb70a985cplars		 * executed without (-f) option.
174865695bbc89088b9526ea9045410e5afb70a985cplars		 */
175865695bbc89088b9526ea9045410e5afb70a985cplars		if (STD_FUNCTIONAL_TEST) {
176865695bbc89088b9526ea9045410e5afb70a985cplars			/*
177865695bbc89088b9526ea9045410e5afb70a985cplars			 * Compare the read buffer data read
178865695bbc89088b9526ea9045410e5afb70a985cplars			 * with the data written to write buffer
179865695bbc89088b9526ea9045410e5afb70a985cplars			 * in the setup.
180865695bbc89088b9526ea9045410e5afb70a985cplars			 */
18162899c99702e1be95a734e7ea3cb10f868783bddGarrett Cooper			compare_bufers();
182865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
183865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TPASS, "calls to pread() succeeded");
184865695bbc89088b9526ea9045410e5afb70a985cplars		}
185865695bbc89088b9526ea9045410e5afb70a985cplars
186865695bbc89088b9526ea9045410e5afb70a985cplars		/* reset our location to offset K4 in case we are looping */
187865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, K4, SEEK_SET, K4);
1882c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
1892c28215423293e443469a07ae7011135d058b671Garrett Cooper
190865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
1911e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper	tst_exit();
1921e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper	tst_exit();
193865695bbc89088b9526ea9045410e5afb70a985cplars
1942c28215423293e443469a07ae7011135d058b671Garrett Cooper}
195865695bbc89088b9526ea9045410e5afb70a985cplars
196865695bbc89088b9526ea9045410e5afb70a985cplars/*
197865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test.
198865695bbc89088b9526ea9045410e5afb70a985cplars *
199865695bbc89088b9526ea9045410e5afb70a985cplars *  Initialize/allocate read/write buffers.
200865695bbc89088b9526ea9045410e5afb70a985cplars *  Create a temporary directory and a file under it and
201865695bbc89088b9526ea9045410e5afb70a985cplars *  write know data at different offset positions.
202865695bbc89088b9526ea9045410e5afb70a985cplars */
20356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup()
204865695bbc89088b9526ea9045410e5afb70a985cplars{
20556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int nwrite = 0;		/* no. of bytes written by pwrite() */
206865695bbc89088b9526ea9045410e5afb70a985cplars
207865695bbc89088b9526ea9045410e5afb70a985cplars	tst_sig(FORK, DEF_HANDLER, cleanup);
208865695bbc89088b9526ea9045410e5afb70a985cplars
209865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_PAUSE;
210865695bbc89088b9526ea9045410e5afb70a985cplars
211865695bbc89088b9526ea9045410e5afb70a985cplars	/* Allocate/Initialize the read/write buffer with know data */
212865695bbc89088b9526ea9045410e5afb70a985cplars	init_buffers();
213865695bbc89088b9526ea9045410e5afb70a985cplars
214865695bbc89088b9526ea9045410e5afb70a985cplars	tst_tmpdir();
215865695bbc89088b9526ea9045410e5afb70a985cplars
216865695bbc89088b9526ea9045410e5afb70a985cplars	/* Creat a temporary file used for mapping */
217865695bbc89088b9526ea9045410e5afb70a985cplars	if ((fildes = open(TEMPFILE, O_RDWR | O_CREAT, 0666)) < 0) {
218865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "open() on %s failed, errno=%d : %s",
219865695bbc89088b9526ea9045410e5afb70a985cplars			 TEMPFILE, errno, strerror(errno));
220865695bbc89088b9526ea9045410e5afb70a985cplars	}
221865695bbc89088b9526ea9045410e5afb70a985cplars
222865695bbc89088b9526ea9045410e5afb70a985cplars	/* pwrite() K1 of data (0's) at offset 0 of temporary file */
223865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[0], K1, 0)) != K1) {
224865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write on %s, "
225865695bbc89088b9526ea9045410e5afb70a985cplars			 "errno=%d : %s", TEMPFILE, errno, strerror(errno));
226865695bbc89088b9526ea9045410e5afb70a985cplars	}
22722cf20438b01cbbad7ce561641e44b208d569d42vapier
228865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should still be at offset 0. */
229865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, 0, SEEK_CUR, 0);
230865695bbc89088b9526ea9045410e5afb70a985cplars
231865695bbc89088b9526ea9045410e5afb70a985cplars	/* Now, lseek() to a non K boundary, just to be different. */
23256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	l_seek(fildes, K1 / 2, SEEK_SET, K1 / 2);
233865695bbc89088b9526ea9045410e5afb70a985cplars
234865695bbc89088b9526ea9045410e5afb70a985cplars	/* Again, pwrite() K1 of data (2's) at offset K2 of temporary file */
235865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[2], K1, K2)) != K1) {
236865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write at %d off. "
237865695bbc89088b9526ea9045410e5afb70a985cplars			 "on %s, errno=%d : %s", K2, TEMPFILE, errno,
238865695bbc89088b9526ea9045410e5afb70a985cplars			 strerror(errno));
239865695bbc89088b9526ea9045410e5afb70a985cplars	}
240865695bbc89088b9526ea9045410e5afb70a985cplars
241865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should still be at our non K boundary. */
24256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	l_seek(fildes, 0, SEEK_CUR, K1 / 2);
243865695bbc89088b9526ea9045410e5afb70a985cplars
244865695bbc89088b9526ea9045410e5afb70a985cplars	/* lseek() to an offset of K3. */
245865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, K3, SEEK_SET, K3);
246865695bbc89088b9526ea9045410e5afb70a985cplars
247865695bbc89088b9526ea9045410e5afb70a985cplars	/*
248865695bbc89088b9526ea9045410e5afb70a985cplars	 * Using write(), write of K1 of data (3's) which should take
249865695bbc89088b9526ea9045410e5afb70a985cplars	 * place at an offset of K3, moving the file pointer to K4.
250865695bbc89088b9526ea9045410e5afb70a985cplars	 */
251865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = write(fildes, write_buf[3], K1)) != K1) {
252865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "write() failed: nwrite=%d, errno=%d "
253865695bbc89088b9526ea9045410e5afb70a985cplars			 ": %s", nwrite, errno, strerror(errno));
254865695bbc89088b9526ea9045410e5afb70a985cplars	}
255865695bbc89088b9526ea9045410e5afb70a985cplars
256865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should be at offset K4. */
257865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, 0, SEEK_CUR, K4);
258865695bbc89088b9526ea9045410e5afb70a985cplars
259865695bbc89088b9526ea9045410e5afb70a985cplars	/* Again, pwrite() K1 of data (1's) at offset K1. */
260865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[1], K1, K1)) != K1) {
261865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write at %d off. "
262865695bbc89088b9526ea9045410e5afb70a985cplars			 "on %s, errno=%d : %s", K1, TEMPFILE, errno,
263865695bbc89088b9526ea9045410e5afb70a985cplars			 strerror(errno));
264865695bbc89088b9526ea9045410e5afb70a985cplars	}
265865695bbc89088b9526ea9045410e5afb70a985cplars}
266865695bbc89088b9526ea9045410e5afb70a985cplars
267865695bbc89088b9526ea9045410e5afb70a985cplars/*
268865695bbc89088b9526ea9045410e5afb70a985cplars * init_buffers - allocates both write_buf and read_buf arrays.
269865695bbc89088b9526ea9045410e5afb70a985cplars *
270865695bbc89088b9526ea9045410e5afb70a985cplars *  Allocate the read and write buffers.
271865695bbc89088b9526ea9045410e5afb70a985cplars *  Fill the write buffer with the following data like,
272865695bbc89088b9526ea9045410e5afb70a985cplars *    write_buf[0] has 0's, write_buf[1] has 1's, write_buf[2] has 2's
273865695bbc89088b9526ea9045410e5afb70a985cplars *    write_buf[3] has 3's.
274865695bbc89088b9526ea9045410e5afb70a985cplars */
27556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid init_buffers()
276865695bbc89088b9526ea9045410e5afb70a985cplars{
277865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* counter variable for loop */
278865695bbc89088b9526ea9045410e5afb70a985cplars
279865695bbc89088b9526ea9045410e5afb70a985cplars	/* Allocate and Initialize read/write buffer */
280865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
281865695bbc89088b9526ea9045410e5afb70a985cplars		write_buf[count] = (char *)malloc(K1);
282865695bbc89088b9526ea9045410e5afb70a985cplars		read_buf[count] = (char *)malloc(K1);
283865695bbc89088b9526ea9045410e5afb70a985cplars
284865695bbc89088b9526ea9045410e5afb70a985cplars		if ((write_buf[count] == NULL) || (read_buf[count] == NULL)) {
28553740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK, NULL,
286865695bbc89088b9526ea9045410e5afb70a985cplars				 "malloc() failed on read/write buffers");
287865695bbc89088b9526ea9045410e5afb70a985cplars		}
288865695bbc89088b9526ea9045410e5afb70a985cplars		memset(write_buf[count], count, K1);
289865695bbc89088b9526ea9045410e5afb70a985cplars	}
290865695bbc89088b9526ea9045410e5afb70a985cplars}
291865695bbc89088b9526ea9045410e5afb70a985cplars
292865695bbc89088b9526ea9045410e5afb70a985cplars/*
293865695bbc89088b9526ea9045410e5afb70a985cplars * l_seek() - local front end to lseek().
294865695bbc89088b9526ea9045410e5afb70a985cplars *
295865695bbc89088b9526ea9045410e5afb70a985cplars *  "checkoff" is the offset at which we believe we should be at.
296865695bbc89088b9526ea9045410e5afb70a985cplars *  Used to validate pread/pwrite don't move the offset.
297865695bbc89088b9526ea9045410e5afb70a985cplars */
29856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid l_seek(int fdesc, off_t offset, int whence, off_t checkoff)
299865695bbc89088b9526ea9045410e5afb70a985cplars{
300865695bbc89088b9526ea9045410e5afb70a985cplars	off_t offloc;		/* offset ret. from lseek() */
301865695bbc89088b9526ea9045410e5afb70a985cplars
302865695bbc89088b9526ea9045410e5afb70a985cplars	if ((offloc = lseek(fdesc, offset, whence)) != checkoff) {
303923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak		tst_resm(TWARN, "return = %"PRId64", expected %"PRId64, (int64_t)offloc, (int64_t)checkoff);
304923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak		tst_brkm(TBROK|TERRNO, cleanup, "lseek() on %s failed",
305923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak			 TEMPFILE);
306865695bbc89088b9526ea9045410e5afb70a985cplars	}
307865695bbc89088b9526ea9045410e5afb70a985cplars}
308865695bbc89088b9526ea9045410e5afb70a985cplars
309865695bbc89088b9526ea9045410e5afb70a985cplars/*
310865695bbc89088b9526ea9045410e5afb70a985cplars * compare_bufers() - Compare the contents of read buffer aganist the
31122cf20438b01cbbad7ce561641e44b208d569d42vapier *                    write buffer contents.
312865695bbc89088b9526ea9045410e5afb70a985cplars *
313865695bbc89088b9526ea9045410e5afb70a985cplars *  The contents of the index of each buffer should be as follows:
314865695bbc89088b9526ea9045410e5afb70a985cplars *  [0] has 0's, [1] has 1's, [2] has 2's, and [3] has 3's.
315865695bbc89088b9526ea9045410e5afb70a985cplars *
316865695bbc89088b9526ea9045410e5afb70a985cplars *  This function does memcmp of read/write buffer and display message
317865695bbc89088b9526ea9045410e5afb70a985cplars *  about the functionality of pread().
318865695bbc89088b9526ea9045410e5afb70a985cplars */
31956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid compare_bufers()
320865695bbc89088b9526ea9045410e5afb70a985cplars{
321865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* index for the loop */
322865695bbc89088b9526ea9045410e5afb70a985cplars	int err_flg = 0;	/* flag to indicate error */
323865695bbc89088b9526ea9045410e5afb70a985cplars
324865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
325865695bbc89088b9526ea9045410e5afb70a985cplars		if (memcmp(write_buf[count], read_buf[count], K1) != 0) {
326865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TFAIL, "read/write buffer data mismatch");
327865695bbc89088b9526ea9045410e5afb70a985cplars			err_flg++;
328865695bbc89088b9526ea9045410e5afb70a985cplars		}
329865695bbc89088b9526ea9045410e5afb70a985cplars	}
330865695bbc89088b9526ea9045410e5afb70a985cplars
331865695bbc89088b9526ea9045410e5afb70a985cplars	/* If no erros, Test successful */
332865695bbc89088b9526ea9045410e5afb70a985cplars	if (!err_flg) {
333865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TPASS, "Functionality of pread() is correct");
334865695bbc89088b9526ea9045410e5afb70a985cplars	}
335865695bbc89088b9526ea9045410e5afb70a985cplars}
336865695bbc89088b9526ea9045410e5afb70a985cplars
337865695bbc89088b9526ea9045410e5afb70a985cplars/*
338865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all ONE TIME cleanup for this test at
339865695bbc89088b9526ea9045410e5afb70a985cplars *             completion or premature exit.
340865695bbc89088b9526ea9045410e5afb70a985cplars *
34122cf20438b01cbbad7ce561641e44b208d569d42vapier *             Deallocate the memory allocated to read/write buffers.
34222cf20438b01cbbad7ce561641e44b208d569d42vapier *             Close the temporary file.
34322cf20438b01cbbad7ce561641e44b208d569d42vapier *             Remove the temporary directory created.
344865695bbc89088b9526ea9045410e5afb70a985cplars */
34556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup()
346865695bbc89088b9526ea9045410e5afb70a985cplars{
347865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* index for the loop */
348865695bbc89088b9526ea9045410e5afb70a985cplars
349865695bbc89088b9526ea9045410e5afb70a985cplars	/*
350865695bbc89088b9526ea9045410e5afb70a985cplars	 * print timing stats if that option was specified.
351865695bbc89088b9526ea9045410e5afb70a985cplars	 * print errno log if that option was specified.
352865695bbc89088b9526ea9045410e5afb70a985cplars	 */
353865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_CLEANUP;
354865695bbc89088b9526ea9045410e5afb70a985cplars
355865695bbc89088b9526ea9045410e5afb70a985cplars	/* Free the memory allocated for the read/write buffer */
356865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
357865695bbc89088b9526ea9045410e5afb70a985cplars		free(write_buf[count]);
358865695bbc89088b9526ea9045410e5afb70a985cplars		free(read_buf[count]);
359865695bbc89088b9526ea9045410e5afb70a985cplars	}
360865695bbc89088b9526ea9045410e5afb70a985cplars
361865695bbc89088b9526ea9045410e5afb70a985cplars	/* Close the temporary file */
362865695bbc89088b9526ea9045410e5afb70a985cplars	if (close(fildes) < 0) {
363865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, NULL, "close() on %s Failed, errno=%d : %s",
364865695bbc89088b9526ea9045410e5afb70a985cplars			 TEMPFILE, errno, strerror(errno));
365865695bbc89088b9526ea9045410e5afb70a985cplars	}
366865695bbc89088b9526ea9045410e5afb70a985cplars
367865695bbc89088b9526ea9045410e5afb70a985cplars	tst_rmdir();
368865695bbc89088b9526ea9045410e5afb70a985cplars
3691e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper}