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/* 21fa31d55d3486830313bd044f7333697ce6124d22nstraz * Test Name: lseek09 22865695bbc89088b9526ea9045410e5afb70a985cplars * 23865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description: 244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Verify that, lseek() call succeeds to set the file pointer position 25865695bbc89088b9526ea9045410e5afb70a985cplars * to the current specified location, when 'whence' value is set to 26865695bbc89088b9526ea9045410e5afb70a985cplars * SEEK_CUR and the data read from the specified location should match 27865695bbc89088b9526ea9045410e5afb70a985cplars * the expected data. 28865695bbc89088b9526ea9045410e5afb70a985cplars * 29865695bbc89088b9526ea9045410e5afb70a985cplars * Expected Result: 304bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * lseek() should return the specified offset from the beginning of the file 31865695bbc89088b9526ea9045410e5afb70a985cplars * measured in bytes. The data read from this location should match the 32865695bbc89088b9526ea9045410e5afb70a985cplars * expected data. 3356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *$ 34865695bbc89088b9526ea9045410e5afb70a985cplars * Algorithm: 35865695bbc89088b9526ea9045410e5afb70a985cplars * Setup: 36865695bbc89088b9526ea9045410e5afb70a985cplars * Setup signal handling. 37865695bbc89088b9526ea9045410e5afb70a985cplars * Create temporary directory. 38865695bbc89088b9526ea9045410e5afb70a985cplars * Pause for SIGUSR1 if option specified. 39865695bbc89088b9526ea9045410e5afb70a985cplars * 40865695bbc89088b9526ea9045410e5afb70a985cplars * Test: 41865695bbc89088b9526ea9045410e5afb70a985cplars * Loop if the proper options are given. 42865695bbc89088b9526ea9045410e5afb70a985cplars * Execute system call 43865695bbc89088b9526ea9045410e5afb70a985cplars * Check return code, if system call failed (return=-1) 44865695bbc89088b9526ea9045410e5afb70a985cplars * Log the errno and Issue a FAIL message. 45865695bbc89088b9526ea9045410e5afb70a985cplars * Otherwise, 46bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak * Verify the Functionality of system call 47865695bbc89088b9526ea9045410e5afb70a985cplars * if successful, 48865695bbc89088b9526ea9045410e5afb70a985cplars * Issue Functionality-Pass message. 49865695bbc89088b9526ea9045410e5afb70a985cplars * Otherwise, 50865695bbc89088b9526ea9045410e5afb70a985cplars * Issue Functionality-Fail message. 51865695bbc89088b9526ea9045410e5afb70a985cplars * Cleanup: 52865695bbc89088b9526ea9045410e5afb70a985cplars * Print errno log and/or timing stats if options given 53865695bbc89088b9526ea9045410e5afb70a985cplars * Delete the temporary directory created. 54865695bbc89088b9526ea9045410e5afb70a985cplars * 55865695bbc89088b9526ea9045410e5afb70a985cplars * Usage: <for command-line> 56fa31d55d3486830313bd044f7333697ce6124d22nstraz * lseek09 [-c n] [-f] [-i n] [-I x] [-P x] [-t] 57865695bbc89088b9526ea9045410e5afb70a985cplars * where, -c n : Run n copies concurrently. 58865695bbc89088b9526ea9045410e5afb70a985cplars * -f : Turn off functionality Testing. 59865695bbc89088b9526ea9045410e5afb70a985cplars * -i n : Execute test n times. 60865695bbc89088b9526ea9045410e5afb70a985cplars * -I x : Execute test for x seconds. 61865695bbc89088b9526ea9045410e5afb70a985cplars * -P x : Pause for x seconds between iterations. 62865695bbc89088b9526ea9045410e5afb70a985cplars * -t : Turn on syscall timing. 63865695bbc89088b9526ea9045410e5afb70a985cplars * 64865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 65865695bbc89088b9526ea9045410e5afb70a985cplars * 07/2001 Ported by Wayne Boyer 66865695bbc89088b9526ea9045410e5afb70a985cplars * 67865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS: 68865695bbc89088b9526ea9045410e5afb70a985cplars * None. 69865695bbc89088b9526ea9045410e5afb70a985cplars */ 70865695bbc89088b9526ea9045410e5afb70a985cplars 71865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h> 72865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h> 73865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/types.h> 74865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 75865695bbc89088b9526ea9045410e5afb70a985cplars#include <fcntl.h> 76865695bbc89088b9526ea9045410e5afb70a985cplars#include <utime.h> 77865695bbc89088b9526ea9045410e5afb70a985cplars#include <string.h> 78865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/stat.h> 79865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h> 80865695bbc89088b9526ea9045410e5afb70a985cplars 81865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h" 82865695bbc89088b9526ea9045410e5afb70a985cplars 83865695bbc89088b9526ea9045410e5afb70a985cplars#define TEMP_FILE "tmp_file" 84865695bbc89088b9526ea9045410e5afb70a985cplars#define FILE_MODE S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH 85865695bbc89088b9526ea9045410e5afb70a985cplars 86fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "lseek09"; 87fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 1; 88865695bbc89088b9526ea9045410e5afb70a985cplarsint fildes; /* file handle for temp file */ 89865695bbc89088b9526ea9045410e5afb70a985cplarssize_t file_size; /* total size of file after data write */ 90865695bbc89088b9526ea9045410e5afb70a985cplars 91865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(); /* Main setup function of test */ 92865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(); /* cleanup function for the test */ 93865695bbc89088b9526ea9045410e5afb70a985cplars 9456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 95865695bbc89088b9526ea9045410e5afb70a985cplars{ 9689af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 97865695bbc89088b9526ea9045410e5afb70a985cplars char read_buf[BUFSIZ]; /* data read from temp. file */ 9856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 99d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 1002c28215423293e443469a07ae7011135d058b671Garrett Cooper 101865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 102865695bbc89088b9526ea9045410e5afb70a985cplars 103865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 1042c28215423293e443469a07ae7011135d058b671Garrett Cooper 105d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 106865695bbc89088b9526ea9045410e5afb70a985cplars 1074bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 108865695bbc89088b9526ea9045410e5afb70a985cplars * Invoke lseek(2) to set the file 109865695bbc89088b9526ea9045410e5afb70a985cplars * pointer/handle from the current location 110865695bbc89088b9526ea9045410e5afb70a985cplars * of the file descriptor + specified offset. 111865695bbc89088b9526ea9045410e5afb70a985cplars */ 112865695bbc89088b9526ea9045410e5afb70a985cplars TEST(lseek(fildes, 1, SEEK_CUR)); 113865695bbc89088b9526ea9045410e5afb70a985cplars 11456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (TEST_RETURN == (off_t) - 1) { 115865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "lseek on (%s) Failed, errno=%d : %s", 116865695bbc89088b9526ea9045410e5afb70a985cplars TEMP_FILE, TEST_ERRNO, strerror(TEST_ERRNO)); 117865695bbc89088b9526ea9045410e5afb70a985cplars continue; 118865695bbc89088b9526ea9045410e5afb70a985cplars } 119865695bbc89088b9526ea9045410e5afb70a985cplars /* 120e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * Check if the return value from lseek(2) is equal 121e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * to the 3 positions from the beginning of the file. 122e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * ie, 2 positions from lseek() in the setup + 123e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * 1 position from above above. 124865695bbc89088b9526ea9045410e5afb70a985cplars */ 125e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (TEST_RETURN != 3) { 126e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis tst_resm(TFAIL, "lseek() returned incorrect " 127e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "value %ld, expected 4", TEST_RETURN); 128e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis continue; 129e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis } 130e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis /* 131e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * Read the data byte from this location. 132e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis */ 133e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis memset(read_buf, 0, sizeof(read_buf)); 134e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (read(fildes, &read_buf, (file_size - 3)) < 0) { 135e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis tst_brkm(TFAIL, cleanup, 136e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "read() failed on %s, error=%d", 137e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis TEMP_FILE, errno); 138e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis } else { 139865695bbc89088b9526ea9045410e5afb70a985cplars /* 140e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * Check if read data contains 141e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * expected characters 142e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * From pos 4 ---> 'defg'. 143865695bbc89088b9526ea9045410e5afb70a985cplars */ 144e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (strcmp(read_buf, "defg")) { 145e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis tst_resm(TFAIL, "Incorrect data read " 146e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "from file %s", TEMP_FILE); 147865695bbc89088b9526ea9045410e5afb70a985cplars } else { 148e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis tst_resm(TPASS, "Functionality of " 149e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "lseek() on %s successful", 150e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis TEMP_FILE); 151865695bbc89088b9526ea9045410e5afb70a985cplars } 152865695bbc89088b9526ea9045410e5afb70a985cplars } 153865695bbc89088b9526ea9045410e5afb70a985cplars 154865695bbc89088b9526ea9045410e5afb70a985cplars /* reset file pointer in case we are looping */ 155865695bbc89088b9526ea9045410e5afb70a985cplars if (lseek(fildes, 2, SEEK_SET) == -1) { 156865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "lseek failed - could not " 157865695bbc89088b9526ea9045410e5afb70a985cplars "reset file pointer"); 158865695bbc89088b9526ea9045410e5afb70a985cplars } 1592c28215423293e443469a07ae7011135d058b671Garrett Cooper } 160865695bbc89088b9526ea9045410e5afb70a985cplars 161865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 1621e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper tst_exit(); 1632c28215423293e443469a07ae7011135d058b671Garrett Cooper} 164865695bbc89088b9526ea9045410e5afb70a985cplars 165865695bbc89088b9526ea9045410e5afb70a985cplars/* 166865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test. 167865695bbc89088b9526ea9045410e5afb70a985cplars * Create a temporary directory and change directory to it. 168865695bbc89088b9526ea9045410e5afb70a985cplars * Create a test file under temporary directory and write some 169865695bbc89088b9526ea9045410e5afb70a985cplars * data into it. 170865695bbc89088b9526ea9045410e5afb70a985cplars * Get the size of the file using fstat(). 171865695bbc89088b9526ea9045410e5afb70a985cplars */ 172c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void) 173865695bbc89088b9526ea9045410e5afb70a985cplars{ 17456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak struct stat stat_buf; /* buffer to hold stat info. */ 17556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak char write_buf[BUFSIZ]; /* buffer to hold data */ 176865695bbc89088b9526ea9045410e5afb70a985cplars 177865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(NOFORK, DEF_HANDLER, cleanup); 178865695bbc89088b9526ea9045410e5afb70a985cplars 179865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 180865695bbc89088b9526ea9045410e5afb70a985cplars 181865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); 182865695bbc89088b9526ea9045410e5afb70a985cplars 183865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the data to be written to temporary file */ 184865695bbc89088b9526ea9045410e5afb70a985cplars strcpy(write_buf, "abcdefg"); 185865695bbc89088b9526ea9045410e5afb70a985cplars 186865695bbc89088b9526ea9045410e5afb70a985cplars /* Creat/open a temporary file under above directory */ 187865695bbc89088b9526ea9045410e5afb70a985cplars if ((fildes = open(TEMP_FILE, O_RDWR | O_CREAT, FILE_MODE)) == -1) { 188865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 189865695bbc89088b9526ea9045410e5afb70a985cplars "open(%s, O_RDWR|O_CREAT, %#o) Failed, errno=%d :%s", 190865695bbc89088b9526ea9045410e5afb70a985cplars TEMP_FILE, FILE_MODE, errno, strerror(errno)); 191865695bbc89088b9526ea9045410e5afb70a985cplars } 192865695bbc89088b9526ea9045410e5afb70a985cplars 193865695bbc89088b9526ea9045410e5afb70a985cplars /* Write data into temporary file */ 19456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (write(fildes, write_buf, strlen(write_buf)) <= 0) { 195865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "write(2) on %s Failed, errno=%d : %s", 196865695bbc89088b9526ea9045410e5afb70a985cplars TEMP_FILE, errno, strerror(errno)); 197865695bbc89088b9526ea9045410e5afb70a985cplars } 198865695bbc89088b9526ea9045410e5afb70a985cplars 199865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the temporary file information */ 200865695bbc89088b9526ea9045410e5afb70a985cplars if (fstat(fildes, &stat_buf) < 0) { 201865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "fstat(2) on %s Failed, errno=%d : %s", 202865695bbc89088b9526ea9045410e5afb70a985cplars TEMP_FILE, errno, strerror(errno)); 203865695bbc89088b9526ea9045410e5afb70a985cplars } 204865695bbc89088b9526ea9045410e5afb70a985cplars 205865695bbc89088b9526ea9045410e5afb70a985cplars file_size = stat_buf.st_size; 206865695bbc89088b9526ea9045410e5afb70a985cplars 207865695bbc89088b9526ea9045410e5afb70a985cplars /* 208865695bbc89088b9526ea9045410e5afb70a985cplars * Reset the file pointer position to the specified offset 209865695bbc89088b9526ea9045410e5afb70a985cplars * from the beginning of the file. 210865695bbc89088b9526ea9045410e5afb70a985cplars */ 211865695bbc89088b9526ea9045410e5afb70a985cplars if (lseek(fildes, 2, SEEK_SET) != 2) { 212865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 213865695bbc89088b9526ea9045410e5afb70a985cplars "lseek() fails to set file ptr. to specified offset"); 214865695bbc89088b9526ea9045410e5afb70a985cplars } 215865695bbc89088b9526ea9045410e5afb70a985cplars} 216865695bbc89088b9526ea9045410e5afb70a985cplars 217865695bbc89088b9526ea9045410e5afb70a985cplars/* 218865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all ONE TIME cleanup for this test at 219865695bbc89088b9526ea9045410e5afb70a985cplars * completion or premature exit. 220865695bbc89088b9526ea9045410e5afb70a985cplars * Remove the test directory and testfile created in the setup. 221865695bbc89088b9526ea9045410e5afb70a985cplars */ 222c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void) 223865695bbc89088b9526ea9045410e5afb70a985cplars{ 224865695bbc89088b9526ea9045410e5afb70a985cplars 225865695bbc89088b9526ea9045410e5afb70a985cplars /* Close the temporary file created */ 226865695bbc89088b9526ea9045410e5afb70a985cplars if (close(fildes) < 0) { 227865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TFAIL, NULL, "close(%s) Failed, errno=%d : %s:", 228865695bbc89088b9526ea9045410e5afb70a985cplars TEMP_FILE, errno, strerror(errno)); 229865695bbc89088b9526ea9045410e5afb70a985cplars } 230865695bbc89088b9526ea9045410e5afb70a985cplars 231865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 232865695bbc89088b9526ea9045410e5afb70a985cplars 233ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 234