| /* Test program for synchronization of stdio state with file after EOF. */ |
| |
| #include <stdio.h> |
| #include <error.h> |
| #include <errno.h> |
| |
| static void do_prepare (void); |
| #define PREPARE(argc, argv) do_prepare () |
| static int do_test (void); |
| #define TEST_FUNCTION do_test () |
| #include <test-skeleton.c> |
| |
| static char *temp_file; |
| static int temp_fd; |
| |
| static char text1[] = "Line the first\n"; |
| static char text2[] = "Line the second\n"; |
| |
| static void |
| do_prepare (void) |
| { |
| temp_fd = create_temp_file ("tst-mmap-eofsync.", &temp_file); |
| if (temp_fd == -1) |
| error (1, errno, "cannot create temporary file"); |
| else |
| { |
| ssize_t cc = write (temp_fd, text1, sizeof text1 - 1); |
| if (cc != sizeof text1 - 1) |
| error (1, errno, "cannot write to temporary file"); |
| } |
| } |
| |
| static int |
| do_test (void) |
| { |
| FILE *f; |
| char buf[128]; |
| int result = 0; |
| int c; |
| |
| f = fopen (temp_file, "rm"); |
| if (f == NULL) |
| { |
| perror (temp_file); |
| return 1; |
| } |
| |
| if (fgets (buf, sizeof buf, f) == NULL) |
| { |
| perror ("fgets"); |
| return 1; |
| } |
| |
| if (strcmp (buf, text1)) |
| { |
| printf ("read \"%s\", expected \"%s\"\n", buf, text1); |
| result = 1; |
| } |
| |
| printf ("feof = %d, ferror = %d immediately after fgets\n", |
| feof (f), ferror (f)); |
| |
| #if 1 |
| c = fgetc (f); |
| if (c == EOF) |
| printf ("fgetc -> EOF (feof = %d, ferror = %d)\n", |
| feof (f), ferror (f)); |
| else |
| { |
| printf ("fgetc returned %o (feof = %d, ferror = %d)\n", |
| c, feof (f), ferror (f)); |
| result = 1; |
| } |
| #endif |
| |
| c = write (temp_fd, text2, sizeof text2 - 1); |
| if (c == sizeof text2 - 1) |
| printf ("wrote more to file\n"); |
| else |
| { |
| printf ("wrote %d != %zd (%m)\n", c, sizeof text2 - 1); |
| result = 1; |
| } |
| |
| if (fgets (buf, sizeof buf, f) == NULL) |
| { |
| printf ("second fgets fails: feof = %d, ferror = %d (%m)\n", |
| feof (f), ferror (f)); |
| clearerr (f); |
| if (fgets (buf, sizeof buf, f) == NULL) |
| { |
| printf ("retry fgets fails: feof = %d, ferror = %d (%m)\n", |
| feof (f), ferror (f)); |
| result = 1; |
| } |
| } |
| if (result == 0 && strcmp (buf, text2)) |
| { |
| printf ("second time read \"%s\", expected \"%s\"\n", buf, text2); |
| result = 1; |
| } |
| |
| fclose (f); |
| |
| return result; |
| } |