1*10465441SEvalZero /*
2*10465441SEvalZero * fstat.c
3*10465441SEvalZero *
4*10465441SEvalZero * Created on: 2010-11-17
5*10465441SEvalZero * Author: bernard
6*10465441SEvalZero */
7*10465441SEvalZero #include <stdio.h>
8*10465441SEvalZero #include <stdlib.h>
9*10465441SEvalZero #include <finsh.h>
10*10465441SEvalZero #include <errno.h>
11*10465441SEvalZero #include <sys/fcntl.h>
12*10465441SEvalZero #include <sys/stat.h>
13*10465441SEvalZero
14*10465441SEvalZero const char* text = "this is a test string\n";
libc_fstat()15*10465441SEvalZero void libc_fstat()
16*10465441SEvalZero {
17*10465441SEvalZero int fd;
18*10465441SEvalZero struct stat s;
19*10465441SEvalZero
20*10465441SEvalZero fd = open("/tmp/tt.txt", O_WRONLY | O_CREAT, 0);
21*10465441SEvalZero if (fd < 0)
22*10465441SEvalZero {
23*10465441SEvalZero printf("open failed\n");
24*10465441SEvalZero return;
25*10465441SEvalZero }
26*10465441SEvalZero
27*10465441SEvalZero write(fd, text, strlen(text) + 1);
28*10465441SEvalZero printf("begin: %d\n", lseek(fd, 0, SEEK_SET));
29*10465441SEvalZero printf("end: %d\n", lseek(fd, 0, SEEK_END));
30*10465441SEvalZero
31*10465441SEvalZero printf("fstat result: %d\n", fstat(fd, &s));
32*10465441SEvalZero close(fd);
33*10465441SEvalZero }
34*10465441SEvalZero FINSH_FUNCTION_EXPORT(libc_fstat, fstat test for libc);
35*10465441SEvalZero
libc_lseek()36*10465441SEvalZero void libc_lseek()
37*10465441SEvalZero {
38*10465441SEvalZero int fd;
39*10465441SEvalZero
40*10465441SEvalZero fd = open("/tmp/tt.txt", O_WRONLY | O_CREAT, 0);
41*10465441SEvalZero if (fd < 0)
42*10465441SEvalZero {
43*10465441SEvalZero printf("open failed\n");
44*10465441SEvalZero return;
45*10465441SEvalZero }
46*10465441SEvalZero
47*10465441SEvalZero write(fd, text, strlen(text) + 1);
48*10465441SEvalZero printf("begin: %d\n", lseek(fd, 0, SEEK_SET));
49*10465441SEvalZero printf("end: %d\n", lseek(fd, 0, SEEK_END));
50*10465441SEvalZero close(fd);
51*10465441SEvalZero }
52*10465441SEvalZero FINSH_FUNCTION_EXPORT(libc_lseek, lseek test for libc);
53*10465441SEvalZero
sleep(int tick)54*10465441SEvalZero void sleep(int tick)
55*10465441SEvalZero {
56*10465441SEvalZero rt_thread_sleep(tick);
57*10465441SEvalZero }
58*10465441SEvalZero
libc_fseek(void)59*10465441SEvalZero int libc_fseek(void)
60*10465441SEvalZero {
61*10465441SEvalZero const char *tmpdir;
62*10465441SEvalZero char *fname;
63*10465441SEvalZero int fd;
64*10465441SEvalZero FILE *fp;
65*10465441SEvalZero const char outstr[] = "hello world!\n";
66*10465441SEvalZero char strbuf[sizeof outstr];
67*10465441SEvalZero char buf[200];
68*10465441SEvalZero struct stat st1;
69*10465441SEvalZero struct stat st2;
70*10465441SEvalZero int result = 0;
71*10465441SEvalZero
72*10465441SEvalZero tmpdir = getenv("TMPDIR");
73*10465441SEvalZero if (tmpdir == NULL || tmpdir[0] == '\0')
74*10465441SEvalZero tmpdir = "/tmp";
75*10465441SEvalZero
76*10465441SEvalZero asprintf(&fname, "%s/tst-fseek.XXXXXX", tmpdir);
77*10465441SEvalZero if (fname == NULL)
78*10465441SEvalZero {
79*10465441SEvalZero fprintf(stderr, "cannot generate name for temporary file: %s\n",
80*10465441SEvalZero strerror(errno));
81*10465441SEvalZero return 1;
82*10465441SEvalZero }
83*10465441SEvalZero
84*10465441SEvalZero /* Create a temporary file. */
85*10465441SEvalZero fd = mkstemp(fname);
86*10465441SEvalZero if (fd == -1)
87*10465441SEvalZero {
88*10465441SEvalZero fprintf(stderr, "cannot open temporary file: %s\n", strerror(errno));
89*10465441SEvalZero return 1;
90*10465441SEvalZero }
91*10465441SEvalZero
92*10465441SEvalZero fp = fdopen(fd, "w+");
93*10465441SEvalZero if (fp == NULL)
94*10465441SEvalZero {
95*10465441SEvalZero fprintf(stderr, "cannot get FILE for temporary file: %s\n", strerror(
96*10465441SEvalZero errno));
97*10465441SEvalZero return 1;
98*10465441SEvalZero }
99*10465441SEvalZero setbuffer(fp, strbuf, sizeof(outstr) - 1);
100*10465441SEvalZero
101*10465441SEvalZero if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1)
102*10465441SEvalZero {
103*10465441SEvalZero printf("%d: write error\n", __LINE__);
104*10465441SEvalZero result = 1;
105*10465441SEvalZero goto out;
106*10465441SEvalZero }
107*10465441SEvalZero
108*10465441SEvalZero /* The EOF flag must be reset. */
109*10465441SEvalZero if (fgetc(fp) != EOF)
110*10465441SEvalZero {
111*10465441SEvalZero printf("%d: managed to read at end of file\n", __LINE__);
112*10465441SEvalZero result = 1;
113*10465441SEvalZero }
114*10465441SEvalZero else if (!feof(fp))
115*10465441SEvalZero {
116*10465441SEvalZero printf("%d: EOF flag not set\n", __LINE__);
117*10465441SEvalZero result = 1;
118*10465441SEvalZero }
119*10465441SEvalZero if (fseek(fp, 0, SEEK_CUR) != 0)
120*10465441SEvalZero {
121*10465441SEvalZero printf("%d: fseek(fp, 0, SEEK_CUR) failed\n", __LINE__);
122*10465441SEvalZero result = 1;
123*10465441SEvalZero }
124*10465441SEvalZero else if (feof(fp))
125*10465441SEvalZero {
126*10465441SEvalZero printf("%d: fseek() didn't reset EOF flag\n", __LINE__);
127*10465441SEvalZero result = 1;
128*10465441SEvalZero }
129*10465441SEvalZero
130*10465441SEvalZero /* Do the same for fseeko(). */
131*10465441SEvalZero if (fgetc(fp) != EOF)
132*10465441SEvalZero {
133*10465441SEvalZero printf("%d: managed to read at end of file\n", __LINE__);
134*10465441SEvalZero result = 1;
135*10465441SEvalZero }
136*10465441SEvalZero else if (!feof(fp))
137*10465441SEvalZero {
138*10465441SEvalZero printf("%d: EOF flag not set\n", __LINE__);
139*10465441SEvalZero result = 1;
140*10465441SEvalZero }
141*10465441SEvalZero if (fseeko(fp, 0, SEEK_CUR) != 0)
142*10465441SEvalZero {
143*10465441SEvalZero printf("%d: fseek(fp, 0, SEEK_CUR) failed\n", __LINE__);
144*10465441SEvalZero result = 1;
145*10465441SEvalZero }
146*10465441SEvalZero else if (feof(fp))
147*10465441SEvalZero {
148*10465441SEvalZero printf("%d: fseek() didn't reset EOF flag\n", __LINE__);
149*10465441SEvalZero result = 1;
150*10465441SEvalZero }
151*10465441SEvalZero
152*10465441SEvalZero /* Go back to the beginning of the file: absolute. */
153*10465441SEvalZero if (fseek(fp, 0, SEEK_SET) != 0)
154*10465441SEvalZero {
155*10465441SEvalZero printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__);
156*10465441SEvalZero result = 1;
157*10465441SEvalZero }
158*10465441SEvalZero else if (fflush(fp) != 0)
159*10465441SEvalZero {
160*10465441SEvalZero printf("%d: fflush() failed\n", __LINE__);
161*10465441SEvalZero result = 1;
162*10465441SEvalZero }
163*10465441SEvalZero else if (lseek(fd, 0, SEEK_CUR) != 0)
164*10465441SEvalZero {
165*10465441SEvalZero int pos = lseek(fd, 0, SEEK_CUR);
166*10465441SEvalZero printf("%d: lseek() returned different position, pos %d\n", __LINE__,
167*10465441SEvalZero pos);
168*10465441SEvalZero result = 1;
169*10465441SEvalZero }
170*10465441SEvalZero else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1)
171*10465441SEvalZero {
172*10465441SEvalZero printf("%d: fread() failed\n", __LINE__);
173*10465441SEvalZero result = 1;
174*10465441SEvalZero }
175*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0)
176*10465441SEvalZero {
177*10465441SEvalZero printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__);
178*10465441SEvalZero result = 1;
179*10465441SEvalZero }
180*10465441SEvalZero
181*10465441SEvalZero /* Now with fseeko. */
182*10465441SEvalZero if (fseeko(fp, 0, SEEK_SET) != 0)
183*10465441SEvalZero {
184*10465441SEvalZero printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__);
185*10465441SEvalZero result = 1;
186*10465441SEvalZero }
187*10465441SEvalZero else if (fflush(fp) != 0)
188*10465441SEvalZero {
189*10465441SEvalZero printf("%d: fflush() failed\n", __LINE__);
190*10465441SEvalZero result = 1;
191*10465441SEvalZero }
192*10465441SEvalZero else if (lseek(fd, 0, SEEK_CUR) != 0)
193*10465441SEvalZero {
194*10465441SEvalZero printf("%d: lseek() returned different position\n", __LINE__);
195*10465441SEvalZero result = 1;
196*10465441SEvalZero }
197*10465441SEvalZero else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1)
198*10465441SEvalZero {
199*10465441SEvalZero printf("%d: fread() failed\n", __LINE__);
200*10465441SEvalZero result = 1;
201*10465441SEvalZero }
202*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0)
203*10465441SEvalZero {
204*10465441SEvalZero printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__);
205*10465441SEvalZero result = 1;
206*10465441SEvalZero }
207*10465441SEvalZero
208*10465441SEvalZero /* Go back to the beginning of the file: relative. */
209*10465441SEvalZero if (fseek(fp, -((int) sizeof(outstr) - 1), SEEK_CUR) != 0)
210*10465441SEvalZero {
211*10465441SEvalZero printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__);
212*10465441SEvalZero result = 1;
213*10465441SEvalZero }
214*10465441SEvalZero else if (fflush(fp) != 0)
215*10465441SEvalZero {
216*10465441SEvalZero printf("%d: fflush() failed\n", __LINE__);
217*10465441SEvalZero result = 1;
218*10465441SEvalZero }
219*10465441SEvalZero else if (lseek(fd, 0, SEEK_CUR) != 0)
220*10465441SEvalZero {
221*10465441SEvalZero printf("%d: lseek() returned different position\n", __LINE__);
222*10465441SEvalZero result = 1;
223*10465441SEvalZero }
224*10465441SEvalZero else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1)
225*10465441SEvalZero {
226*10465441SEvalZero printf("%d: fread() failed\n", __LINE__);
227*10465441SEvalZero result = 1;
228*10465441SEvalZero }
229*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0)
230*10465441SEvalZero {
231*10465441SEvalZero printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__);
232*10465441SEvalZero result = 1;
233*10465441SEvalZero }
234*10465441SEvalZero
235*10465441SEvalZero /* Now with fseeko. */
236*10465441SEvalZero if (fseeko(fp, -((int) sizeof(outstr) - 1), SEEK_CUR) != 0)
237*10465441SEvalZero {
238*10465441SEvalZero printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__);
239*10465441SEvalZero result = 1;
240*10465441SEvalZero }
241*10465441SEvalZero else if (fflush(fp) != 0)
242*10465441SEvalZero {
243*10465441SEvalZero printf("%d: fflush() failed\n", __LINE__);
244*10465441SEvalZero result = 1;
245*10465441SEvalZero }
246*10465441SEvalZero else if (lseek(fd, 0, SEEK_CUR) != 0)
247*10465441SEvalZero {
248*10465441SEvalZero printf("%d: lseek() returned different position\n", __LINE__);
249*10465441SEvalZero result = 1;
250*10465441SEvalZero }
251*10465441SEvalZero else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1)
252*10465441SEvalZero {
253*10465441SEvalZero printf("%d: fread() failed\n", __LINE__);
254*10465441SEvalZero result = 1;
255*10465441SEvalZero }
256*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0)
257*10465441SEvalZero {
258*10465441SEvalZero printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__);
259*10465441SEvalZero result = 1;
260*10465441SEvalZero }
261*10465441SEvalZero
262*10465441SEvalZero /* Go back to the beginning of the file: from the end. */
263*10465441SEvalZero if (fseek(fp, -((int) sizeof(outstr) - 1), SEEK_END) != 0)
264*10465441SEvalZero {
265*10465441SEvalZero printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__);
266*10465441SEvalZero result = 1;
267*10465441SEvalZero }
268*10465441SEvalZero else if (fflush(fp) != 0)
269*10465441SEvalZero {
270*10465441SEvalZero printf("%d: fflush() failed\n", __LINE__);
271*10465441SEvalZero result = 1;
272*10465441SEvalZero }
273*10465441SEvalZero else if (lseek(fd, 0, SEEK_CUR) != 0)
274*10465441SEvalZero {
275*10465441SEvalZero printf("%d: lseek() returned different position\n", __LINE__);
276*10465441SEvalZero result = 1;
277*10465441SEvalZero }
278*10465441SEvalZero else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1)
279*10465441SEvalZero {
280*10465441SEvalZero printf("%d: fread() failed\n", __LINE__);
281*10465441SEvalZero result = 1;
282*10465441SEvalZero }
283*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0)
284*10465441SEvalZero {
285*10465441SEvalZero printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__);
286*10465441SEvalZero result = 1;
287*10465441SEvalZero }
288*10465441SEvalZero
289*10465441SEvalZero /* Now with fseeko. */
290*10465441SEvalZero if (fseeko(fp, -((int) sizeof(outstr) - 1), SEEK_END) != 0)
291*10465441SEvalZero {
292*10465441SEvalZero printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__);
293*10465441SEvalZero result = 1;
294*10465441SEvalZero }
295*10465441SEvalZero else if (fflush(fp) != 0)
296*10465441SEvalZero {
297*10465441SEvalZero printf("%d: fflush() failed\n", __LINE__);
298*10465441SEvalZero result = 1;
299*10465441SEvalZero }
300*10465441SEvalZero else if (lseek(fd, 0, SEEK_CUR) != 0)
301*10465441SEvalZero {
302*10465441SEvalZero printf("%d: lseek() returned different position\n", __LINE__);
303*10465441SEvalZero result = 1;
304*10465441SEvalZero }
305*10465441SEvalZero else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1)
306*10465441SEvalZero {
307*10465441SEvalZero printf("%d: fread() failed\n", __LINE__);
308*10465441SEvalZero result = 1;
309*10465441SEvalZero }
310*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0)
311*10465441SEvalZero {
312*10465441SEvalZero printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__);
313*10465441SEvalZero result = 1;
314*10465441SEvalZero }
315*10465441SEvalZero
316*10465441SEvalZero if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1)
317*10465441SEvalZero {
318*10465441SEvalZero printf("%d: write error 2\n", __LINE__);
319*10465441SEvalZero result = 1;
320*10465441SEvalZero goto out;
321*10465441SEvalZero }
322*10465441SEvalZero
323*10465441SEvalZero if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1)
324*10465441SEvalZero {
325*10465441SEvalZero printf("%d: write error 3\n", __LINE__);
326*10465441SEvalZero result = 1;
327*10465441SEvalZero goto out;
328*10465441SEvalZero }
329*10465441SEvalZero
330*10465441SEvalZero if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1)
331*10465441SEvalZero {
332*10465441SEvalZero printf("%d: write error 4\n", __LINE__);
333*10465441SEvalZero result = 1;
334*10465441SEvalZero goto out;
335*10465441SEvalZero }
336*10465441SEvalZero
337*10465441SEvalZero if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1)
338*10465441SEvalZero {
339*10465441SEvalZero printf("%d: write error 5\n", __LINE__);
340*10465441SEvalZero result = 1;
341*10465441SEvalZero goto out;
342*10465441SEvalZero }
343*10465441SEvalZero
344*10465441SEvalZero if (fputc('1', fp) == EOF || fputc('2', fp) == EOF)
345*10465441SEvalZero {
346*10465441SEvalZero printf("%d: cannot add characters at the end\n", __LINE__);
347*10465441SEvalZero result = 1;
348*10465441SEvalZero goto out;
349*10465441SEvalZero }
350*10465441SEvalZero
351*10465441SEvalZero /* Check the access time. */
352*10465441SEvalZero if (fstat(fd, &st1) < 0)
353*10465441SEvalZero {
354*10465441SEvalZero printf("%d: fstat64() before fseeko() failed\n\n", __LINE__);
355*10465441SEvalZero result = 1;
356*10465441SEvalZero }
357*10465441SEvalZero else
358*10465441SEvalZero {
359*10465441SEvalZero sleep(1);
360*10465441SEvalZero
361*10465441SEvalZero if (fseek(fp, -(2 + 2 * (sizeof(outstr) - 1)), SEEK_CUR) != 0)
362*10465441SEvalZero {
363*10465441SEvalZero printf("%d: fseek() after write characters failed\n", __LINE__);
364*10465441SEvalZero result = 1;
365*10465441SEvalZero goto out;
366*10465441SEvalZero }
367*10465441SEvalZero else
368*10465441SEvalZero {
369*10465441SEvalZero
370*10465441SEvalZero time_t t;
371*10465441SEvalZero /* Make sure the timestamp actually can be different. */
372*10465441SEvalZero sleep(1);
373*10465441SEvalZero t = time(NULL);
374*10465441SEvalZero
375*10465441SEvalZero if (fstat(fd, &st2) < 0)
376*10465441SEvalZero {
377*10465441SEvalZero printf("%d: fstat64() after fseeko() failed\n\n", __LINE__);
378*10465441SEvalZero result = 1;
379*10465441SEvalZero }
380*10465441SEvalZero if (st1.st_ctime >= t)
381*10465441SEvalZero {
382*10465441SEvalZero printf("%d: st_ctime not updated\n", __LINE__);
383*10465441SEvalZero result = 1;
384*10465441SEvalZero }
385*10465441SEvalZero if (st1.st_mtime >= t)
386*10465441SEvalZero {
387*10465441SEvalZero printf("%d: st_mtime not updated\n", __LINE__);
388*10465441SEvalZero result = 1;
389*10465441SEvalZero }
390*10465441SEvalZero if (st1.st_ctime >= st2.st_ctime)
391*10465441SEvalZero {
392*10465441SEvalZero printf("%d: st_ctime not changed\n", __LINE__);
393*10465441SEvalZero result = 1;
394*10465441SEvalZero }
395*10465441SEvalZero if (st1.st_mtime >= st2.st_mtime)
396*10465441SEvalZero {
397*10465441SEvalZero printf("%d: st_mtime not changed\n", __LINE__);
398*10465441SEvalZero result = 1;
399*10465441SEvalZero }
400*10465441SEvalZero }
401*10465441SEvalZero }
402*10465441SEvalZero
403*10465441SEvalZero if (fread(buf, 1, 2 + 2 * (sizeof(outstr) - 1), fp) != 2 + 2
404*10465441SEvalZero * (sizeof(outstr) - 1))
405*10465441SEvalZero {
406*10465441SEvalZero printf("%d: reading 2 records plus bits failed\n", __LINE__);
407*10465441SEvalZero result = 1;
408*10465441SEvalZero }
409*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0 || memcmp(
410*10465441SEvalZero &buf[sizeof(outstr) - 1], outstr, sizeof(outstr) - 1) != 0 || buf[2
411*10465441SEvalZero * (sizeof(outstr) - 1)] != '1' || buf[2 * (sizeof(outstr) - 1) + 1]
412*10465441SEvalZero != '2')
413*10465441SEvalZero {
414*10465441SEvalZero printf("%d: reading records failed\n", __LINE__);
415*10465441SEvalZero result = 1;
416*10465441SEvalZero }
417*10465441SEvalZero else if (ungetc('9', fp) == EOF)
418*10465441SEvalZero {
419*10465441SEvalZero printf("%d: ungetc() failed\n", __LINE__);
420*10465441SEvalZero result = 1;
421*10465441SEvalZero }
422*10465441SEvalZero else if (fseek(fp, -(2 + 2 * (sizeof(outstr) - 1)), SEEK_END) != 0)
423*10465441SEvalZero {
424*10465441SEvalZero printf("%d: fseek after ungetc failed\n", __LINE__);
425*10465441SEvalZero result = 1;
426*10465441SEvalZero }
427*10465441SEvalZero else if (fread(buf, 1, 2 + 2 * (sizeof(outstr) - 1), fp) != 2 + 2
428*10465441SEvalZero * (sizeof(outstr) - 1))
429*10465441SEvalZero {
430*10465441SEvalZero printf("%d: reading 2 records plus bits failed\n", __LINE__);
431*10465441SEvalZero result = 1;
432*10465441SEvalZero }
433*10465441SEvalZero else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0 || memcmp(
434*10465441SEvalZero &buf[sizeof(outstr) - 1], outstr, sizeof(outstr) - 1) != 0 || buf[2
435*10465441SEvalZero * (sizeof(outstr) - 1)] != '1')
436*10465441SEvalZero {
437*10465441SEvalZero printf("%d: reading records for the second time failed\n", __LINE__);
438*10465441SEvalZero result = 1;
439*10465441SEvalZero }
440*10465441SEvalZero else if (buf[2 * (sizeof(outstr) - 1) + 1] == '9')
441*10465441SEvalZero {
442*10465441SEvalZero printf("%d: unget character not ignored\n", __LINE__);
443*10465441SEvalZero result = 1;
444*10465441SEvalZero }
445*10465441SEvalZero else if (buf[2 * (sizeof(outstr) - 1) + 1] != '2')
446*10465441SEvalZero {
447*10465441SEvalZero printf("%d: unget somehow changed character\n", __LINE__);
448*10465441SEvalZero result = 1;
449*10465441SEvalZero }
450*10465441SEvalZero
451*10465441SEvalZero fclose(fp);
452*10465441SEvalZero
453*10465441SEvalZero fp = fopen(fname, "r");
454*10465441SEvalZero if (fp == NULL)
455*10465441SEvalZero {
456*10465441SEvalZero printf("%d: fopen() failed\n\n", __LINE__);
457*10465441SEvalZero result = 1;
458*10465441SEvalZero }
459*10465441SEvalZero else if (fstat(fileno(fp), &st1) < 0)
460*10465441SEvalZero {
461*10465441SEvalZero printf("%d: fstat64() before fseeko() failed\n\n", __LINE__);
462*10465441SEvalZero result = 1;
463*10465441SEvalZero }
464*10465441SEvalZero else if (fseeko(fp, 0, SEEK_END) != 0)
465*10465441SEvalZero {
466*10465441SEvalZero printf("%d: fseeko(fp, 0, SEEK_END) failed\n", __LINE__);
467*10465441SEvalZero result = 1;
468*10465441SEvalZero }
469*10465441SEvalZero else if (ftello(fp) != st1.st_size)
470*10465441SEvalZero {
471*10465441SEvalZero printf("%d: fstat64 st_size %zd ftello %zd\n", __LINE__,
472*10465441SEvalZero (size_t) st1.st_size, (size_t) ftello(fp));
473*10465441SEvalZero result = 1;
474*10465441SEvalZero }
475*10465441SEvalZero else
476*10465441SEvalZero printf("%d: SEEK_END works\n", __LINE__);
477*10465441SEvalZero if (fp != NULL)
478*10465441SEvalZero fclose(fp);
479*10465441SEvalZero
480*10465441SEvalZero fp = fopen(fname, "r");
481*10465441SEvalZero if (fp == NULL)
482*10465441SEvalZero {
483*10465441SEvalZero printf("%d: fopen() failed\n\n", __LINE__);
484*10465441SEvalZero result = 1;
485*10465441SEvalZero }
486*10465441SEvalZero else if (fstat(fileno(fp), &st1) < 0)
487*10465441SEvalZero {
488*10465441SEvalZero printf("%d: fstat64() before fgetc() failed\n\n", __LINE__);
489*10465441SEvalZero result = 1;
490*10465441SEvalZero }
491*10465441SEvalZero else if (fgetc(fp) == EOF)
492*10465441SEvalZero {
493*10465441SEvalZero printf("%d: fgetc() before fseeko() failed\n\n", __LINE__);
494*10465441SEvalZero result = 1;
495*10465441SEvalZero }
496*10465441SEvalZero else if (fseeko(fp, 0, SEEK_END) != 0)
497*10465441SEvalZero {
498*10465441SEvalZero printf("%d: fseeko(fp, 0, SEEK_END) failed\n", __LINE__);
499*10465441SEvalZero result = 1;
500*10465441SEvalZero }
501*10465441SEvalZero else if (ftello(fp) != st1.st_size)
502*10465441SEvalZero {
503*10465441SEvalZero printf("%d: fstat64 st_size %zd ftello %zd\n", __LINE__,
504*10465441SEvalZero (size_t) st1.st_size, (size_t) ftello(fp));
505*10465441SEvalZero result = 1;
506*10465441SEvalZero }
507*10465441SEvalZero else
508*10465441SEvalZero printf("%d: SEEK_END works\n", __LINE__);
509*10465441SEvalZero if (fp != NULL)
510*10465441SEvalZero fclose(fp);
511*10465441SEvalZero
512*10465441SEvalZero out: unlink(fname);
513*10465441SEvalZero
514*10465441SEvalZero return result;
515*10465441SEvalZero }
516*10465441SEvalZero FINSH_FUNCTION_EXPORT(libc_fseek, lseek test for libc);
517