/* Test of fwrite() function, adapted from gnulib-tests in grep.
   Copyright (C) 2011-2018 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */

#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

static int
do_test (void)
{
  char tmpl[] = "/tmp/tst-fwrite-error.XXXXXX";
  int fd = mkstemp (tmpl);
  if (fd == -1)
    {
      printf ("mkstemp failed with errno %d\n", errno);
      return 1;
    }
  FILE *fp = fdopen (fd, "w");
  if (fp == NULL)
    {
      printf ("fdopen failed with errno %d\n", errno);
      return 1;
    }

  char buf[] = "world";
  setvbuf (fp, NULL, _IONBF, 0);
  close (fd);
  unlink (tmpl);
  errno = 0;

  int ret = fwrite (buf, 1, sizeof (buf), fp);
  if (ret != 0)
    {
      printf ("fwrite returned %d\n", ret);
      return 1;
    }
  if (errno != EBADF)
    {
      printf ("Errno is not EBADF: %d\n", errno);
      return 1;
    }
  if (ferror (fp) == 0)
    {
      printf ("ferror not set\n");
      return 1;
    }

  return 0;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
