(root)/
m4-1.4.19/
tests/
test-freopen.c
       1  /* Test of opening a file stream.
       2     Copyright (C) 2007-2021 Free Software Foundation, Inc.
       3  
       4     This program is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation; either version 3 of the License, or
       7     (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
      18  
      19  #include <config.h>
      20  
      21  #include <stdio.h>
      22  
      23  #include "signature.h"
      24  SIGNATURE_CHECK (freopen, FILE *, (char const *, char const *, FILE *));
      25  
      26  #include <errno.h>
      27  #include <unistd.h>
      28  
      29  #include "macros.h"
      30  
      31  int
      32  main ()
      33  {
      34    const char *filename = "test-freopen.txt";
      35  
      36    close (STDIN_FILENO);
      37    ASSERT (freopen ("/dev/null", "r", stdin) != NULL);
      38    ASSERT (getchar () == EOF);
      39    ASSERT (!ferror (stdin));
      40    ASSERT (feof (stdin));
      41  
      42  #if 0 /* freopen (NULL, ...) is unsupported on most platforms.  */
      43    /* Test that freopen() sets errno if someone else closes the stream
      44       fd behind the back of stdio.  */
      45    {
      46      FILE *fp = fopen (filename, "w+");
      47      ASSERT (fp != NULL);
      48      ASSERT (close (fileno (fp)) == 0);
      49      errno = 0;
      50      ASSERT (freopen (NULL, "r", fp) == NULL);
      51      perror("freopen");
      52      ASSERT (errno == EBADF);
      53      fclose (fp);
      54    }
      55  
      56    /* Test that freopen() sets errno if the stream was constructed with
      57       an invalid file descriptor.  */
      58    {
      59      FILE *fp = fdopen (-1, "w+");
      60      if (fp != NULL)
      61        {
      62          errno = 0;
      63          ASSERT (freopen (NULL, "r", fp) == NULL);
      64          ASSERT (errno == EBADF);
      65          fclose (fp);
      66        }
      67    }
      68    {
      69      FILE *fp;
      70      close (99);
      71      fp = fdopen (99, "w+");
      72      if (fp != NULL)
      73        {
      74          errno = 0;
      75          ASSERT (freopen (NULL, "r", fp) == NULL);
      76          ASSERT (errno == EBADF);
      77          fclose (fp);
      78        }
      79    }
      80  #endif
      81  
      82    /* Clean up.  */
      83    unlink (filename);
      84  
      85    return 0;
      86  }