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