Blame gnulib/tests/test-fputc.c

Packit Service a2ae7a
/* Test of fputc() function.
Packit Service a2ae7a
   Copyright (C) 2011-2019 Free Software Foundation, Inc.
Packit Service a2ae7a
Packit Service a2ae7a
   This program is free software; you can redistribute it and/or modify
Packit Service a2ae7a
   it under the terms of the GNU General Public License as published by
Packit Service a2ae7a
   the Free Software Foundation; either version 3, or (at your option)
Packit Service a2ae7a
   any later version.
Packit Service a2ae7a
Packit Service a2ae7a
   This program is distributed in the hope that it will be useful,
Packit Service a2ae7a
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a2ae7a
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a2ae7a
   GNU General Public License for more details.
Packit Service a2ae7a
Packit Service a2ae7a
   You should have received a copy of the GNU General Public License
Packit Service a2ae7a
   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
Packit Service a2ae7a
Packit Service a2ae7a
#include <config.h>
Packit Service a2ae7a
Packit Service a2ae7a
#include <stdio.h>
Packit Service a2ae7a
Packit Service a2ae7a
#include "signature.h"
Packit Service a2ae7a
SIGNATURE_CHECK (fputc, int, (int, FILE *));
Packit Service a2ae7a
Packit Service a2ae7a
#include <errno.h>
Packit Service a2ae7a
#include <fcntl.h>
Packit Service a2ae7a
#include <unistd.h>
Packit Service a2ae7a
Packit Service a2ae7a
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
Packit Service a2ae7a
# include "msvc-inval.h"
Packit Service a2ae7a
#endif
Packit Service a2ae7a
Packit Service a2ae7a
#include "macros.h"
Packit Service a2ae7a
Packit Service a2ae7a
int
Packit Service a2ae7a
main (int argc, char **argv)
Packit Service a2ae7a
{
Packit Service a2ae7a
  const char *filename = "test-fputc.txt";
Packit Service a2ae7a
Packit Service a2ae7a
  /* We don't have an fputc() function that installs an invalid parameter
Packit Service a2ae7a
     handler so far.  So install that handler here, explicitly.  */
Packit Service a2ae7a
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
Packit Service a2ae7a
    && MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
Packit Service a2ae7a
  gl_msvc_inval_ensure_handler ();
Packit Service a2ae7a
#endif
Packit Service a2ae7a
Packit Service a2ae7a
  /* Test that fputc() on an unbuffered stream sets errno if someone else
Packit Service a2ae7a
     closes the stream fd behind the back of stdio.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    FILE *fp = fopen (filename, "w");
Packit Service a2ae7a
    ASSERT (fp != NULL);
Packit Service a2ae7a
    setvbuf (fp, NULL, _IONBF, 0);
Packit Service a2ae7a
    ASSERT (close (fileno (fp)) == 0);
Packit Service a2ae7a
    errno = 0;
Packit Service a2ae7a
    ASSERT (fputc ('x', fp) == EOF);
Packit Service a2ae7a
    ASSERT (errno == EBADF);
Packit Service a2ae7a
    ASSERT (ferror (fp));
Packit Service a2ae7a
    fclose (fp);
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
  /* Test that fputc() on an unbuffered stream sets errno if the stream
Packit Service a2ae7a
     was constructed with an invalid file descriptor.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    FILE *fp = fdopen (-1, "w");
Packit Service a2ae7a
    if (fp != NULL)
Packit Service a2ae7a
      {
Packit Service a2ae7a
        setvbuf (fp, NULL, _IONBF, 0);
Packit Service a2ae7a
        errno = 0;
Packit Service a2ae7a
        ASSERT (fputc ('x', fp) == EOF);
Packit Service a2ae7a
        ASSERT (errno == EBADF);
Packit Service a2ae7a
        ASSERT (ferror (fp));
Packit Service a2ae7a
        fclose (fp);
Packit Service a2ae7a
      }
Packit Service a2ae7a
  }
Packit Service a2ae7a
  {
Packit Service a2ae7a
    FILE *fp;
Packit Service a2ae7a
    close (99);
Packit Service a2ae7a
    fp = fdopen (99, "w");
Packit Service a2ae7a
    if (fp != NULL)
Packit Service a2ae7a
      {
Packit Service a2ae7a
        setvbuf (fp, NULL, _IONBF, 0);
Packit Service a2ae7a
        errno = 0;
Packit Service a2ae7a
        ASSERT (fputc ('x', fp) == EOF);
Packit Service a2ae7a
        ASSERT (errno == EBADF);
Packit Service a2ae7a
        ASSERT (ferror (fp));
Packit Service a2ae7a
        fclose (fp);
Packit Service a2ae7a
      }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
  /* Clean up.  */
Packit Service a2ae7a
  unlink (filename);
Packit Service a2ae7a
Packit Service a2ae7a
  return 0;
Packit Service a2ae7a
}