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