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