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
80865695bbc89088b9526ea9045410e5afb70a985cplars#define TEMPFILE	"pread_file"
81865695bbc89088b9526ea9045410e5afb70a985cplars#define K1              1024
82865695bbc89088b9526ea9045410e5afb70a985cplars#define K2              (K1 * 2)
83865695bbc89088b9526ea9045410e5afb70a985cplars#define K3              (K1 * 3)
84865695bbc89088b9526ea9045410e5afb70a985cplars#define K4              (K1 * 4)
85865695bbc89088b9526ea9045410e5afb70a985cplars#define NBUFS           4
86865695bbc89088b9526ea9045410e5afb70a985cplars
87fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "pread01";
88fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 1;
89865695bbc89088b9526ea9045410e5afb70a985cplars
90865695bbc89088b9526ea9045410e5afb70a985cplarsint fildes;			/* file descriptor for tempfile */
91865695bbc89088b9526ea9045410e5afb70a985cplarschar *write_buf[NBUFS];		/* buffer to hold data to be written */
92865695bbc89088b9526ea9045410e5afb70a985cplarschar *read_buf[NBUFS];		/* buffer to hold data read from file */
93865695bbc89088b9526ea9045410e5afb70a985cplars
94865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup();			/* Main setup function of test */
95865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup();			/* cleanup function for the test */
9656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid l_seek(int, off_t, int, off_t);	/* function to call lseek() */
97865695bbc89088b9526ea9045410e5afb70a985cplarsvoid init_buffers();		/* function to initialize/allocate buffers */
98865695bbc89088b9526ea9045410e5afb70a985cplarsvoid compare_bufers();		/* function to compare o/p of pread/pwrite */
99865695bbc89088b9526ea9045410e5afb70a985cplars
10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
101865695bbc89088b9526ea9045410e5afb70a985cplars{
10289af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
103865695bbc89088b9526ea9045410e5afb70a985cplars	int nread;		/* no. of bytes read by pread() */
10422cf20438b01cbbad7ce561641e44b208d569d42vapier
105d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
106865695bbc89088b9526ea9045410e5afb70a985cplars
107865695bbc89088b9526ea9045410e5afb70a985cplars	setup();
108865695bbc89088b9526ea9045410e5afb70a985cplars
109865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
110865695bbc89088b9526ea9045410e5afb70a985cplars
111d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		/* Reset tst_count in case we are looping */
112d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
113865695bbc89088b9526ea9045410e5afb70a985cplars
11422cf20438b01cbbad7ce561641e44b208d569d42vapier		/*
115865695bbc89088b9526ea9045410e5afb70a985cplars		 * Call pread() of K1 data (should be 2's) at offset K2.
116865695bbc89088b9526ea9045410e5afb70a985cplars		 */
11722cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[2], K1, K2);
118865695bbc89088b9526ea9045410e5afb70a985cplars
119865695bbc89088b9526ea9045410e5afb70a985cplars		/* Check for the return value of pread() */
120865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
121865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K2 failed: "
122865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
123865695bbc89088b9526ea9045410e5afb70a985cplars		}
124865695bbc89088b9526ea9045410e5afb70a985cplars
125865695bbc89088b9526ea9045410e5afb70a985cplars		/*
126865695bbc89088b9526ea9045410e5afb70a985cplars		 * We should still be at offset K4,
127865695bbc89088b9526ea9045410e5afb70a985cplars		 * which we were at the end of block 0.
128865695bbc89088b9526ea9045410e5afb70a985cplars		 */
129865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K4);
130865695bbc89088b9526ea9045410e5afb70a985cplars
131865695bbc89088b9526ea9045410e5afb70a985cplars		/* Now lseek() to offset 0. */
132865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_SET, 0);
133865695bbc89088b9526ea9045410e5afb70a985cplars
134865695bbc89088b9526ea9045410e5afb70a985cplars		/* pread() K1 of data (should be 3's) at offset K3. */
13522cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[3], K1, K3);
136865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
137865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K3 failed: "
138865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
139865695bbc89088b9526ea9045410e5afb70a985cplars		}
140865695bbc89088b9526ea9045410e5afb70a985cplars
141865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should still be at offset 0. */
142865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, 0);
143865695bbc89088b9526ea9045410e5afb70a985cplars
144865695bbc89088b9526ea9045410e5afb70a985cplars		/*
14522cf20438b01cbbad7ce561641e44b208d569d42vapier		 * Do a normal read() of K1 data (should be 0's)
146865695bbc89088b9526ea9045410e5afb70a985cplars		 * which should take place at offset 0 and move the
147865695bbc89088b9526ea9045410e5afb70a985cplars		 * file pointer to an offset of K1.
148865695bbc89088b9526ea9045410e5afb70a985cplars		 */
149865695bbc89088b9526ea9045410e5afb70a985cplars		if ((nread = read(fildes, read_buf[0], K1)) != K1) {
150865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "read() at off. 0 failed: "
151865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, errno=%d", nread, errno);
152865695bbc89088b9526ea9045410e5afb70a985cplars		}
153865695bbc89088b9526ea9045410e5afb70a985cplars
154865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should now be at an offset of K1. */
155865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K1);
156865695bbc89088b9526ea9045410e5afb70a985cplars
15756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		/* pread() of K1 data (should be 1's) at offset K1. */
15822cf20438b01cbbad7ce561641e44b208d569d42vapier		nread = pread(fildes, read_buf[1], K1, K1);
159865695bbc89088b9526ea9045410e5afb70a985cplars		if (nread != K1) {
160865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "pread() at off. K1 failed: "
161865695bbc89088b9526ea9045410e5afb70a985cplars				 "nread=%d, error:%d", nread, errno);
162865695bbc89088b9526ea9045410e5afb70a985cplars		}
163865695bbc89088b9526ea9045410e5afb70a985cplars
164865695bbc89088b9526ea9045410e5afb70a985cplars		/* We should still be at offset K1. */
165865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, 0, SEEK_CUR, K1);
166865695bbc89088b9526ea9045410e5afb70a985cplars
167865695bbc89088b9526ea9045410e5afb70a985cplars		/*
168e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * Compare the read buffer data read
169e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * with the data written to write buffer
170e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * in the setup.
171865695bbc89088b9526ea9045410e5afb70a985cplars		 */
172e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		compare_bufers();
173865695bbc89088b9526ea9045410e5afb70a985cplars
174865695bbc89088b9526ea9045410e5afb70a985cplars		/* reset our location to offset K4 in case we are looping */
175865695bbc89088b9526ea9045410e5afb70a985cplars		l_seek(fildes, K4, SEEK_SET, K4);
1762c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
1772c28215423293e443469a07ae7011135d058b671Garrett Cooper
178865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
1791e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper	tst_exit();
1802c28215423293e443469a07ae7011135d058b671Garrett Cooper}
181865695bbc89088b9526ea9045410e5afb70a985cplars
182865695bbc89088b9526ea9045410e5afb70a985cplars/*
183865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test.
184865695bbc89088b9526ea9045410e5afb70a985cplars *
185865695bbc89088b9526ea9045410e5afb70a985cplars *  Initialize/allocate read/write buffers.
186865695bbc89088b9526ea9045410e5afb70a985cplars *  Create a temporary directory and a file under it and
187865695bbc89088b9526ea9045410e5afb70a985cplars *  write know data at different offset positions.
188865695bbc89088b9526ea9045410e5afb70a985cplars */
189c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void)
190865695bbc89088b9526ea9045410e5afb70a985cplars{
19156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int nwrite = 0;		/* no. of bytes written by pwrite() */
192865695bbc89088b9526ea9045410e5afb70a985cplars
193865695bbc89088b9526ea9045410e5afb70a985cplars	tst_sig(FORK, DEF_HANDLER, cleanup);
194865695bbc89088b9526ea9045410e5afb70a985cplars
195865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_PAUSE;
196865695bbc89088b9526ea9045410e5afb70a985cplars
197865695bbc89088b9526ea9045410e5afb70a985cplars	/* Allocate/Initialize the read/write buffer with know data */
198865695bbc89088b9526ea9045410e5afb70a985cplars	init_buffers();
199865695bbc89088b9526ea9045410e5afb70a985cplars
200865695bbc89088b9526ea9045410e5afb70a985cplars	tst_tmpdir();
201865695bbc89088b9526ea9045410e5afb70a985cplars
202865695bbc89088b9526ea9045410e5afb70a985cplars	/* Creat a temporary file used for mapping */
203865695bbc89088b9526ea9045410e5afb70a985cplars	if ((fildes = open(TEMPFILE, O_RDWR | O_CREAT, 0666)) < 0) {
204865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "open() on %s failed, errno=%d : %s",
205865695bbc89088b9526ea9045410e5afb70a985cplars			 TEMPFILE, errno, strerror(errno));
206865695bbc89088b9526ea9045410e5afb70a985cplars	}
207865695bbc89088b9526ea9045410e5afb70a985cplars
208865695bbc89088b9526ea9045410e5afb70a985cplars	/* pwrite() K1 of data (0's) at offset 0 of temporary file */
209865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[0], K1, 0)) != K1) {
210865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write on %s, "
211865695bbc89088b9526ea9045410e5afb70a985cplars			 "errno=%d : %s", TEMPFILE, errno, strerror(errno));
212865695bbc89088b9526ea9045410e5afb70a985cplars	}
21322cf20438b01cbbad7ce561641e44b208d569d42vapier
214865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should still be at offset 0. */
215865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, 0, SEEK_CUR, 0);
216865695bbc89088b9526ea9045410e5afb70a985cplars
217865695bbc89088b9526ea9045410e5afb70a985cplars	/* Now, lseek() to a non K boundary, just to be different. */
21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	l_seek(fildes, K1 / 2, SEEK_SET, K1 / 2);
219865695bbc89088b9526ea9045410e5afb70a985cplars
220865695bbc89088b9526ea9045410e5afb70a985cplars	/* Again, pwrite() K1 of data (2's) at offset K2 of temporary file */
221865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[2], K1, K2)) != K1) {
222865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write at %d off. "
223865695bbc89088b9526ea9045410e5afb70a985cplars			 "on %s, errno=%d : %s", K2, TEMPFILE, errno,
224865695bbc89088b9526ea9045410e5afb70a985cplars			 strerror(errno));
225865695bbc89088b9526ea9045410e5afb70a985cplars	}
226865695bbc89088b9526ea9045410e5afb70a985cplars
227865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should still be at our non K boundary. */
22856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	l_seek(fildes, 0, SEEK_CUR, K1 / 2);
229865695bbc89088b9526ea9045410e5afb70a985cplars
230865695bbc89088b9526ea9045410e5afb70a985cplars	/* lseek() to an offset of K3. */
231865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, K3, SEEK_SET, K3);
232865695bbc89088b9526ea9045410e5afb70a985cplars
233865695bbc89088b9526ea9045410e5afb70a985cplars	/*
234865695bbc89088b9526ea9045410e5afb70a985cplars	 * Using write(), write of K1 of data (3's) which should take
235865695bbc89088b9526ea9045410e5afb70a985cplars	 * place at an offset of K3, moving the file pointer to K4.
236865695bbc89088b9526ea9045410e5afb70a985cplars	 */
237865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = write(fildes, write_buf[3], K1)) != K1) {
238865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "write() failed: nwrite=%d, errno=%d "
239865695bbc89088b9526ea9045410e5afb70a985cplars			 ": %s", nwrite, errno, strerror(errno));
240865695bbc89088b9526ea9045410e5afb70a985cplars	}
241865695bbc89088b9526ea9045410e5afb70a985cplars
242865695bbc89088b9526ea9045410e5afb70a985cplars	/* We should be at offset K4. */
243865695bbc89088b9526ea9045410e5afb70a985cplars	l_seek(fildes, 0, SEEK_CUR, K4);
244865695bbc89088b9526ea9045410e5afb70a985cplars
245865695bbc89088b9526ea9045410e5afb70a985cplars	/* Again, pwrite() K1 of data (1's) at offset K1. */
246865695bbc89088b9526ea9045410e5afb70a985cplars	if ((nwrite = pwrite(fildes, write_buf[1], K1, K1)) != K1) {
247865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "pwrite() failed to write at %d off. "
248865695bbc89088b9526ea9045410e5afb70a985cplars			 "on %s, errno=%d : %s", K1, TEMPFILE, errno,
249865695bbc89088b9526ea9045410e5afb70a985cplars			 strerror(errno));
250865695bbc89088b9526ea9045410e5afb70a985cplars	}
251865695bbc89088b9526ea9045410e5afb70a985cplars}
252865695bbc89088b9526ea9045410e5afb70a985cplars
253865695bbc89088b9526ea9045410e5afb70a985cplars/*
254865695bbc89088b9526ea9045410e5afb70a985cplars * init_buffers - allocates both write_buf and read_buf arrays.
255865695bbc89088b9526ea9045410e5afb70a985cplars *
256865695bbc89088b9526ea9045410e5afb70a985cplars *  Allocate the read and write buffers.
257865695bbc89088b9526ea9045410e5afb70a985cplars *  Fill the write buffer with the following data like,
258865695bbc89088b9526ea9045410e5afb70a985cplars *    write_buf[0] has 0's, write_buf[1] has 1's, write_buf[2] has 2's
259865695bbc89088b9526ea9045410e5afb70a985cplars *    write_buf[3] has 3's.
260865695bbc89088b9526ea9045410e5afb70a985cplars */
261c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid init_buffers(void)
262865695bbc89088b9526ea9045410e5afb70a985cplars{
263865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* counter variable for loop */
264865695bbc89088b9526ea9045410e5afb70a985cplars
265865695bbc89088b9526ea9045410e5afb70a985cplars	/* Allocate and Initialize read/write buffer */
266865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
267d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis		write_buf[count] = malloc(K1);
268d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis		read_buf[count] = malloc(K1);
269865695bbc89088b9526ea9045410e5afb70a985cplars
270865695bbc89088b9526ea9045410e5afb70a985cplars		if ((write_buf[count] == NULL) || (read_buf[count] == NULL)) {
27153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper			tst_brkm(TBROK, NULL,
272865695bbc89088b9526ea9045410e5afb70a985cplars				 "malloc() failed on read/write buffers");
273865695bbc89088b9526ea9045410e5afb70a985cplars		}
274865695bbc89088b9526ea9045410e5afb70a985cplars		memset(write_buf[count], count, K1);
275865695bbc89088b9526ea9045410e5afb70a985cplars	}
276865695bbc89088b9526ea9045410e5afb70a985cplars}
277865695bbc89088b9526ea9045410e5afb70a985cplars
278865695bbc89088b9526ea9045410e5afb70a985cplars/*
279865695bbc89088b9526ea9045410e5afb70a985cplars * l_seek() - local front end to lseek().
280865695bbc89088b9526ea9045410e5afb70a985cplars *
281865695bbc89088b9526ea9045410e5afb70a985cplars *  "checkoff" is the offset at which we believe we should be at.
282865695bbc89088b9526ea9045410e5afb70a985cplars *  Used to validate pread/pwrite don't move the offset.
283865695bbc89088b9526ea9045410e5afb70a985cplars */
28456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid l_seek(int fdesc, off_t offset, int whence, off_t checkoff)
285865695bbc89088b9526ea9045410e5afb70a985cplars{
286865695bbc89088b9526ea9045410e5afb70a985cplars	off_t offloc;		/* offset ret. from lseek() */
287865695bbc89088b9526ea9045410e5afb70a985cplars
288865695bbc89088b9526ea9045410e5afb70a985cplars	if ((offloc = lseek(fdesc, offset, whence)) != checkoff) {
289354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_resm(TWARN, "return = %" PRId64 ", expected %" PRId64,
290354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 (int64_t) offloc, (int64_t) checkoff);
291354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup, "lseek() on %s failed",
292923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak			 TEMPFILE);
293865695bbc89088b9526ea9045410e5afb70a985cplars	}
294865695bbc89088b9526ea9045410e5afb70a985cplars}
295865695bbc89088b9526ea9045410e5afb70a985cplars
296865695bbc89088b9526ea9045410e5afb70a985cplars/*
297865695bbc89088b9526ea9045410e5afb70a985cplars * compare_bufers() - Compare the contents of read buffer aganist the
29822cf20438b01cbbad7ce561641e44b208d569d42vapier *                    write buffer contents.
299865695bbc89088b9526ea9045410e5afb70a985cplars *
300865695bbc89088b9526ea9045410e5afb70a985cplars *  The contents of the index of each buffer should be as follows:
301865695bbc89088b9526ea9045410e5afb70a985cplars *  [0] has 0's, [1] has 1's, [2] has 2's, and [3] has 3's.
302865695bbc89088b9526ea9045410e5afb70a985cplars *
303865695bbc89088b9526ea9045410e5afb70a985cplars *  This function does memcmp of read/write buffer and display message
304865695bbc89088b9526ea9045410e5afb70a985cplars *  about the functionality of pread().
305865695bbc89088b9526ea9045410e5afb70a985cplars */
306c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid compare_bufers(void)
307865695bbc89088b9526ea9045410e5afb70a985cplars{
308865695bbc89088b9526ea9045410e5afb70a985cplars	int count;		/* index for the loop */
309865695bbc89088b9526ea9045410e5afb70a985cplars	int err_flg = 0;	/* flag to indicate error */
310865695bbc89088b9526ea9045410e5afb70a985cplars
311865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
312865695bbc89088b9526ea9045410e5afb70a985cplars		if (memcmp(write_buf[count], read_buf[count], K1) != 0) {
313865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TFAIL, "read/write buffer data mismatch");
314865695bbc89088b9526ea9045410e5afb70a985cplars			err_flg++;
315865695bbc89088b9526ea9045410e5afb70a985cplars		}
316865695bbc89088b9526ea9045410e5afb70a985cplars	}
317865695bbc89088b9526ea9045410e5afb70a985cplars
318865695bbc89088b9526ea9045410e5afb70a985cplars	/* If no erros, Test successful */
319865695bbc89088b9526ea9045410e5afb70a985cplars	if (!err_flg) {
320865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TPASS, "Functionality of pread() is correct");
321865695bbc89088b9526ea9045410e5afb70a985cplars	}
322865695bbc89088b9526ea9045410e5afb70a985cplars}
323865695bbc89088b9526ea9045410e5afb70a985cplars
324865695bbc89088b9526ea9045410e5afb70a985cplars/*
325865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all ONE TIME cleanup for this test at
326865695bbc89088b9526ea9045410e5afb70a985cplars *             completion or premature exit.
327865695bbc89088b9526ea9045410e5afb70a985cplars *
32822cf20438b01cbbad7ce561641e44b208d569d42vapier *             Deallocate the memory allocated to read/write buffers.
32922cf20438b01cbbad7ce561641e44b208d569d42vapier *             Close the temporary file.
33022cf20438b01cbbad7ce561641e44b208d569d42vapier *             Remove the temporary directory created.
331865695bbc89088b9526ea9045410e5afb70a985cplars */
332c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void)
333865695bbc89088b9526ea9045410e5afb70a985cplars{
334605fa3362fd7cef0baa2131be32cf44661783d3eCyril Hrubis	int count;
335865695bbc89088b9526ea9045410e5afb70a985cplars
336865695bbc89088b9526ea9045410e5afb70a985cplars	/* Free the memory allocated for the read/write buffer */
337865695bbc89088b9526ea9045410e5afb70a985cplars	for (count = 0; count < NBUFS; count++) {
338865695bbc89088b9526ea9045410e5afb70a985cplars		free(write_buf[count]);
339865695bbc89088b9526ea9045410e5afb70a985cplars		free(read_buf[count]);
340865695bbc89088b9526ea9045410e5afb70a985cplars	}
341865695bbc89088b9526ea9045410e5afb70a985cplars
342865695bbc89088b9526ea9045410e5afb70a985cplars	/* Close the temporary file */
343865695bbc89088b9526ea9045410e5afb70a985cplars	if (close(fildes) < 0) {
344865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, NULL, "close() on %s Failed, errno=%d : %s",
345865695bbc89088b9526ea9045410e5afb70a985cplars			 TEMPFILE, errno, strerror(errno));
346865695bbc89088b9526ea9045410e5afb70a985cplars	}
347865695bbc89088b9526ea9045410e5afb70a985cplars
348865695bbc89088b9526ea9045410e5afb70a985cplars	tst_rmdir();
349865695bbc89088b9526ea9045410e5afb70a985cplars
350ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
351