1 /* Test program for synchronization of stdio state with file after EOF. */
2
3 #include <stdio.h>
4 #include <error.h>
5 #include <errno.h>
6
7 static void do_prepare (void);
8 #define PREPARE(argc, argv) do_prepare ()
9 static int do_test (void);
10 #define TEST_FUNCTION do_test ()
11 #include <test-skeleton.c>
12
13 static char *temp_file;
14 static int temp_fd;
15
16 static char text1[] = "Line the first\n";
17 static char text2[] = "Line the second\n";
18
19 static void
do_prepare(void)20 do_prepare (void)
21 {
22 temp_fd = create_temp_file ("tst-mmap-eofsync.", &temp_file);
23 if (temp_fd == -1)
24 error (1, errno, "cannot create temporary file");
25 else
26 {
27 ssize_t cc = write (temp_fd, text1, sizeof text1 - 1);
28 if (cc != sizeof text1 - 1)
29 error (1, errno, "cannot write to temporary file");
30 }
31 }
32
33 static int
do_test(void)34 do_test (void)
35 {
36 FILE *f;
37 char buf[128];
38 int result = 0;
39 int c;
40
41 f = fopen (temp_file, "rm");
42 if (f == NULL)
43 {
44 perror (temp_file);
45 return 1;
46 }
47
48 if (fgets (buf, sizeof buf, f) == NULL)
49 {
50 perror ("fgets");
51 return 1;
52 }
53
54 if (strcmp (buf, text1))
55 {
56 printf ("read \"%s\", expected \"%s\"\n", buf, text1);
57 result = 1;
58 }
59
60 printf ("feof = %d, ferror = %d immediately after fgets\n",
61 feof (f), ferror (f));
62
63 c = fgetc (f);
64 if (c == EOF)
65 printf ("fgetc -> EOF (feof = %d, ferror = %d)\n",
66 feof (f), ferror (f));
67 else
68 {
69 printf ("fgetc returned %o (feof = %d, ferror = %d)\n",
70 c, feof (f), ferror (f));
71 result = 1;
72 }
73
74 c = write (temp_fd, text2, sizeof text2 - 1);
75 if (c == sizeof text2 - 1)
76 printf ("wrote more to file\n");
77 else
78 {
79 printf ("wrote %d != %zd (%m)\n", c, sizeof text2 - 1);
80 result = 1;
81 }
82
83 if (fgets (buf, sizeof buf, f) == NULL)
84 {
85 printf ("second fgets fails: feof = %d, ferror = %d (%m)\n",
86 feof (f), ferror (f));
87 clearerr (f);
88 if (fgets (buf, sizeof buf, f) == NULL)
89 {
90 printf ("retry fgets fails: feof = %d, ferror = %d (%m)\n",
91 feof (f), ferror (f));
92 result = 1;
93 }
94 }
95 if (result == 0 && strcmp (buf, text2))
96 {
97 printf ("second time read \"%s\", expected \"%s\"\n", buf, text2);
98 result = 1;
99 }
100
101 fclose (f);
102
103 return result;
104 }
105