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}