123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /* 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;
- }
|