(root)/
glibc-2.38/
libio/
tst-mmap-eofsync.c
       1  /* Test program for synchronization of stdio state with file after EOF.  */
       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 ("tst-mmap-eofsync.", &temp_file);
      23    if (temp_fd == -1)
      24      error (1, errno, "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 (1, errno, "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 (buf, sizeof buf, f) == NULL)
      49      {
      50        perror ("fgets");
      51        return 1;
      52      }
      53  
      54    if (strcmp (buf, text1))
      55      {
      56        printf ("read \"%s\", expected \"%s\"\n", buf, text1);
      57        result = 1;
      58      }
      59  
      60    printf ("feof = %d, ferror = %d immediately after fgets\n",
      61  	  feof (f), ferror (f));
      62  
      63    c = fgetc (f);
      64    if (c == EOF)
      65      printf ("fgetc -> EOF (feof = %d, ferror = %d)\n",
      66  	    feof (f), ferror (f));
      67    else
      68      {
      69        printf ("fgetc returned %o (feof = %d, ferror = %d)\n",
      70  	      c, feof (f), ferror (f));
      71        result = 1;
      72      }
      73  
      74    c = write (temp_fd, text2, sizeof text2 - 1);
      75    if (c == sizeof text2 - 1)
      76      printf ("wrote more to file\n");
      77    else
      78      {
      79        printf ("wrote %d != %zd (%m)\n", c, sizeof text2 - 1);
      80        result = 1;
      81      }
      82  
      83    if (fgets (buf, sizeof buf, f) == NULL)
      84      {
      85        printf ("second fgets fails: feof = %d, ferror = %d (%m)\n",
      86  	      feof (f), ferror (f));
      87        clearerr (f);
      88        if (fgets (buf, sizeof buf, f) == NULL)
      89  	{
      90  	  printf ("retry fgets fails: feof = %d, ferror = %d (%m)\n",
      91  		  feof (f), ferror (f));
      92  	  result = 1;
      93  	}
      94      }
      95    if (result == 0 && strcmp (buf, text2))
      96      {
      97        printf ("second time read \"%s\", expected \"%s\"\n", buf, text2);
      98        result = 1;
      99      }
     100  
     101    fclose (f);
     102  
     103    return result;
     104  }