Home | History | Annotate | Download | only in stream
      1 /*
      2  *
      3  *   Copyright (c) International Business Machines  Corp., 2002
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 /* ported from SPIE, section2/filesuite/stream3.c, by Airong Zhang */
     21 
     22 /*======================================================================
     23 	=================== TESTPLAN SEGMENT ===================
     24 >KEYS:  < fseek() ftell()
     25 >WHAT:  < 1) Ensure ftell reports the correct current byte offset.
     26 >HOW:   < 1) Open a file, write to it, reposition the file pointer and
     27 	     check it.
     28 >BUGS:  <
     29 ======================================================================*/
     30 #define _XOPEN_SOURCE 500
     31 #include <stdio.h>
     32 #include <errno.h>
     33 #include <fcntl.h>
     34 #include <sys/types.h>
     35 #include <sys/stat.h>
     36 #include <inttypes.h>
     37 #include "test.h"
     38 
     39 char *TCID = "stream03";
     40 int TST_TOTAL = 1;
     41 int local_flag;
     42 
     43 #define PASSED 1
     44 #define FAILED 0
     45 
     46 char progname[] = "stream03()";
     47 char tempfile1[40] = "";
     48 
     49 int main(int ac, char *av[])
     50 {
     51 	FILE *stream;
     52 	char buf[30];
     53 	char *junk = "abcdefghijklmnopqrstuvwxyz";
     54 	long pos;
     55 	off_t opos;
     56 	int lc;
     57 
     58 	/*
     59 	 * parse standard options
     60 	 */
     61 	tst_parse_opts(ac, av, NULL, NULL);
     62 
     63 	local_flag = PASSED;
     64 	tst_tmpdir();
     65 
     66 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     67 
     68 		sprintf(tempfile1, "stream03.%d", getpid());
     69 	/*--------------------------------------------------------------------*/
     70 		//block0:
     71 
     72 		if ((stream = fopen(tempfile1, "a+")) == NULL) {
     73 			tst_brkm(TBROK, NULL, "fopen(%s) a+ failed: %s",
     74 				 tempfile1,
     75 				 strerror(errno));
     76 		}
     77 
     78 		/* make sure offset of zero at start */
     79 		pos = ftell(stream);
     80 
     81 		if (pos != 0) {
     82 			tst_resm(TFAIL, "file pointer descrepancy 1");
     83 			local_flag = FAILED;
     84 		}
     85 
     86 		/* write something and check */
     87 		if (fwrite(junk, sizeof(*junk), strlen(junk), stream) == 0) {
     88 			tst_brkm(TFAIL, NULL, "fwrite failed: %s",
     89 				 strerror(errno));
     90 		}
     91 
     92 		pos = ftell(stream);
     93 
     94 		if (pos != strlen(junk)) {
     95 			tst_resm(TFAIL,
     96 				 "strlen(junk)=%zi: file pointer descrepancy 2 (pos=%li)",
     97 				 strlen(junk), pos);
     98 			local_flag = FAILED;
     99 		}
    100 
    101 		/* rewind and check */
    102 		rewind(stream);
    103 		pos = ftell(stream);
    104 
    105 		if (pos != 0) {
    106 			tst_resm(TFAIL,
    107 				 "file pointer descrepancy 3 (pos=%li, wanted pos=0)",
    108 				 pos);
    109 			local_flag = FAILED;
    110 		}
    111 
    112 		/* seek from current position and then check */
    113 		if (fseek(stream, strlen(junk), 1) != 0) {
    114 			tst_brkm(TFAIL, NULL, "fseek failed: %s",
    115 				 strerror(errno));
    116 		}
    117 
    118 		pos = ftell(stream);
    119 
    120 		if (pos != strlen(junk)) {
    121 			tst_resm(TFAIL,
    122 				 "strlen(junk)=%zi: file pointer descrepancy 4 (pos=%li)",
    123 				 strlen(junk), pos);
    124 			local_flag = FAILED;
    125 		}
    126 
    127 		/* seek from end of file and then check */
    128 		if (fseek(stream, 0, 2) != 0) {
    129 			tst_brkm(TFAIL, NULL, "fseek failed: %s",
    130 				 strerror(errno));
    131 		}
    132 
    133 		pos = ftell(stream);
    134 
    135 		if (pos != strlen(junk)) {
    136 			tst_resm(TFAIL,
    137 				 "strlen(junk)=%zi: file pointer descrepancy 5 (pos=%li)",
    138 				 strlen(junk), pos);
    139 			local_flag = FAILED;
    140 		}
    141 
    142 		/* rewind with seek and then check */
    143 		if (fseek(stream, 0, 0) != 0) {
    144 			tst_brkm(TFAIL, NULL, "fseek failed: %s",
    145 				 strerror(errno));
    146 		}
    147 
    148 		pos = ftell(stream);
    149 
    150 		if (pos != 0) {
    151 			tst_resm(TFAIL,
    152 				 "file pointer descrepancy 6 (pos=%li, wanted pos=0)",
    153 				 pos);
    154 			local_flag = FAILED;
    155 		}
    156 
    157 		/* read till EOF, do getc and then check ftell */
    158 		while (fgets(buf, sizeof(buf), stream)) ;
    159 		pos = ftell(stream);
    160 		getc(stream);
    161 		pos = ftell(stream);
    162 
    163 		if (pos != strlen(junk)) {
    164 			tst_resm(TFAIL,
    165 				 "strlen(junk)=%zi: file pointer descrepancy 7 (pos=%li)",
    166 				 strlen(junk), pos);
    167 			local_flag = FAILED;
    168 		}
    169 
    170 		fclose(stream);
    171 
    172 		if (local_flag == PASSED) {
    173 			tst_resm(TPASS, "Test passed in block0.");
    174 		} else {
    175 			tst_resm(TFAIL, "Test failed in block0.");
    176 		}
    177 
    178 		local_flag = PASSED;
    179 
    180 		unlink(tempfile1);
    181 	/*--------------------------------------------------------------------*/
    182 		//block1:
    183 		if ((stream = fopen(tempfile1, "a+")) == NULL) {
    184 			tst_brkm(TFAIL, NULL, "fopen(%s) a+ failed: %s",
    185 				 tempfile1,
    186 				 strerror(errno));
    187 		}
    188 
    189 		/* make sure offset of zero at start */
    190 		opos = ftello(stream);
    191 
    192 		if (opos != 0) {
    193 			tst_resm(TFAIL,
    194 				 "file pointer descrepancy 1 (opos=%" PRId64
    195 				 ", wanted opos=0)", (int64_t) opos);
    196 			local_flag = FAILED;
    197 		}
    198 
    199 		/* write something and check */
    200 		if (fwrite(junk, sizeof(*junk), strlen(junk), stream) == 0) {
    201 			tst_brkm(TFAIL, NULL, "fwrite failed: %s",
    202 				 strerror(errno));
    203 		}
    204 
    205 		opos = ftello(stream);
    206 
    207 		if (opos != strlen(junk)) {
    208 			tst_resm(TFAIL,
    209 				 "strlen(junk)=%zi: file pointer descrepancy 2 (opos=%"
    210 				 PRId64 ")", strlen(junk), (int64_t) opos);
    211 			local_flag = FAILED;
    212 		}
    213 
    214 		/* rewind and check */
    215 		rewind(stream);
    216 		opos = ftello(stream);
    217 
    218 		if (opos != 0) {
    219 			tst_resm(TFAIL,
    220 				 "file pointer descrepancy 3 (opos=%" PRId64
    221 				 ", wanted opos=0)", (int64_t) opos);
    222 			local_flag = FAILED;
    223 		}
    224 
    225 		/* seek from current position and then check */
    226 		if (fseeko(stream, strlen(junk), 1) != 0) {
    227 			tst_brkm(TFAIL, NULL, "fseeko failed: %s",
    228 				 strerror(errno));
    229 		}
    230 
    231 		opos = ftello(stream);
    232 
    233 		if (opos != strlen(junk)) {
    234 			tst_resm(TFAIL,
    235 				 "strlen(junk)=%zi: file pointer descrepancy 4 (opos=%"
    236 				 PRId64 ")", strlen(junk), (int64_t) opos);
    237 			local_flag = FAILED;
    238 		}
    239 
    240 		/* seek from end of file and then check */
    241 		if (fseeko(stream, 0, 2) != 0) {
    242 			tst_brkm(TFAIL, NULL, "fseeko failed: %s",
    243 				 strerror(errno));
    244 		}
    245 
    246 		opos = ftello(stream);
    247 
    248 		if (opos != strlen(junk)) {
    249 			tst_resm(TFAIL,
    250 				 "strlen(junk)=%zi: file pointer descrepancy 5 (opos=%"
    251 				 PRId64 ")", strlen(junk), (int64_t) opos);
    252 			local_flag = FAILED;
    253 		}
    254 
    255 		/* rewind with seek and then check */
    256 		if (fseeko(stream, 0, 0) != 0) {
    257 			tst_brkm(TFAIL, NULL, "fseeko failed: %s",
    258 				 strerror(errno));
    259 		}
    260 
    261 		opos = ftello(stream);
    262 
    263 		if (opos != 0) {
    264 			tst_resm(TFAIL,
    265 				 "file pointer descrepancy 6 (opos=%" PRId64
    266 				 ", wanted opos=0)", (int64_t) opos);
    267 			local_flag = FAILED;
    268 		}
    269 
    270 		/* read till EOF, do getc and then check ftello */
    271 		while (fgets(buf, sizeof(buf), stream)) ;
    272 
    273 		opos = ftello(stream);
    274 		getc(stream);
    275 		opos = ftello(stream);
    276 
    277 		if (opos != strlen(junk)) {
    278 			tst_resm(TFAIL,
    279 				 "strlen(junk)=%zi: file pointer descrepancy 7 (opos=%li)",
    280 				 strlen(junk), opos);
    281 			local_flag = FAILED;
    282 		}
    283 
    284 		fclose(stream);
    285 
    286 		if (local_flag == PASSED) {
    287 			tst_resm(TPASS, "Test passed in block1.");
    288 		} else {
    289 			tst_resm(TFAIL, "Test failed in block1.");
    290 		}
    291 
    292 		unlink(tempfile1);
    293 	}
    294 
    295 	tst_rmdir();
    296 	tst_exit();
    297 }
    298