1/* Test program for synchronization of stdio state with file after fflush. */
2
3#include <stdio.h>
4#include <error.h>
5#include <errno.h>
6
7static void do_prepare (void);
8#define PREPARE(argc, argv) do_prepare ()
9static int do_test (void);
10#define TEST_FUNCTION do_test ()
11#include <test-skeleton.c>
12
13static char *temp_file;
14static int temp_fd;
15
16static char text1[] = "Line the first\n";
17static char text2[] = "Line the second\n";
18
19static void
20do_prepare (void)
21{
22 temp_fd = create_temp_file (base: "tst-mmap-eofsync.", filename: &temp_file);
23 if (temp_fd == -1)
24 error (status: 1, errno, format: "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 (status: 1, errno, format: "cannot write to temporary file");
30 }
31}
32
33static int
34do_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 (s: buf, n: sizeof buf, stream: f) == NULL)
49 {
50 perror ("fgets");
51 return 1;
52 }
53
54 if (strcmp (buf, text1))
55 {
56 printf (format: "read \"%s\", expected \"%s\"\n", buf, text1);
57 result = 1;
58 }
59
60 printf (format: "feof = %d, ferror = %d immediately after fgets\n",
61 feof (stream: f), ferror (stream: f));
62
63 if (fflush (f) != 0)
64 {
65 printf (format: "fflush failed! %m\n");
66 result = 1;
67 }
68
69 c = write (temp_fd, text2, sizeof text2 - 1);
70 if (c == sizeof text2 - 1)
71 printf (format: "wrote more to file\n");
72 else
73 {
74 printf (format: "wrote %d != %zd (%m)\n", c, sizeof text2 - 1);
75 result = 1;
76 }
77
78 if (fgets (s: buf, n: sizeof buf, stream: f) == NULL)
79 {
80 printf (format: "second fgets fails: feof = %d, ferror = %d (%m)\n",
81 feof (stream: f), ferror (stream: f));
82 clearerr (stream: f);
83 if (fgets (s: buf, n: sizeof buf, stream: f) == NULL)
84 {
85 printf (format: "retry fgets fails: feof = %d, ferror = %d (%m)\n",
86 feof (stream: f), ferror (stream: f));
87 result = 1;
88 }
89 }
90 if (result == 0 && strcmp (buf, text2))
91 {
92 printf (format: "second time read \"%s\", expected \"%s\"\n", buf, text2);
93 result = 1;
94 }
95
96 fclose (f);
97
98 return result;
99}
100

source code of glibc/libio/tst-mmap-fflushsync.c