xref: /nrf52832-nimble/rt-thread/examples/libc/file.c (revision 104654410c56c573564690304ae786df310c91fc)
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