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