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
main(int ac,char * av[])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