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 | |
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 |
20 | do_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 | |
33 | static int |
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 (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 | |