(root)/
glibc-2.38/
libio/
bug-fopena+.c
       1  #include <fcntl.h>
       2  #include <stdio.h>
       3  #include <string.h>
       4  #include <unistd.h>
       5  
       6  static int fd;
       7  static char *fname;
       8  
       9  
      10  static void prepare (void);
      11  #define PREPARE(argc, argv) prepare ()
      12  
      13  
      14  #define TEST_FUNCTION do_test ()
      15  static int do_test (void);
      16  #include "../test-skeleton.c"
      17  
      18  
      19  static void
      20  prepare (void)
      21  {
      22    fd = create_temp_file ("wrewind.", &fname);
      23    if (fd == -1)
      24      exit (3);
      25  }
      26  
      27  
      28  static int
      29  do_test (void)
      30  {
      31    char buf[100];
      32    FILE *fp;
      33    int result = 0;
      34  
      35    fp = fdopen (fd, "w");
      36    if (fp == NULL)
      37      {
      38        puts ("cannot create file");
      39        exit (1);
      40      }
      41  
      42    if (fputs ("one\n", fp) == EOF || fputs ("two\n", fp) == EOF)
      43      {
      44        puts ("cannot create filec content");
      45        exit (1);
      46      }
      47  
      48    fclose (fp);
      49  
      50    fp = fopen (fname, "a+");
      51    if (fp == NULL)
      52      {
      53        puts ("cannot fopen a+");
      54        exit (1);
      55      }
      56  
      57    if (fgets (buf, sizeof (buf), fp) == NULL)
      58      {
      59        puts ("cannot read after fopen a+");
      60        exit (1);
      61      }
      62  
      63    if (strcmp (buf, "one\n") != 0)
      64      {
      65        puts ("read after fopen a+ produced wrong result");
      66        result = 1;
      67      }
      68  
      69    fclose (fp);
      70  
      71    fd = open (fname, O_RDWR);
      72    if (fd == -1)
      73      {
      74        puts ("open failed");
      75        exit (1);
      76      }
      77  
      78    fp = fdopen (fd, "a+");
      79    if (fp == NULL)
      80      {
      81        puts ("fopen after open failed");
      82        exit (1);
      83      }
      84  
      85    if (fgets (buf, sizeof (buf), fp) == NULL)
      86      {
      87        puts ("cannot read after fdopen a+");
      88        exit (1);
      89      }
      90  
      91    if (strcmp (buf, "one\n") != 0)
      92      {
      93        puts ("read after fdopen a+ produced wrong result");
      94        result = 1;
      95      }
      96  
      97    fclose (fp);
      98  
      99    return result;
     100  }