/* closeout.c - close standard output
 * Copyright (C) 1998, 1999 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 2, 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, write to the Free Software Foundation,
 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#include "config.h"

#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
#else
# define _(Text) Text
#endif

#if HAVE_STDLIB_H
# include <stdlib.h>
#endif
#ifndef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif

#include <errno.h>
#ifndef errno
extern int errno;
#endif

#include <stdio.h>
#include "closeout.h"
#include "error.h"

/* Close standard output, exiting with status STATUS on failure.
 * If a program writes *anything* to stdout, that program should `fflush'
 * stdout and make sure that it succeeds before exiting.  Otherwise,
 * suppose that you go to the extreme of checking the return status
 * of every function that does an explicit write to stdout.  The last
 * printf can succeed in writing to the internal stream buffer, and yet
 * the fclose(stdout) could still fail (due e.g., to a disk full error)
 * when it tries to write out that buffered data.  Thus, you would be
 * left with an incomplete output file and the offending program would
 * exit successfully.
 * 
 * FIXME: note the fflush suggested above is implicit in the fclose
 * we actually do below.  Consider doing only the fflush and/or using
 * setvbuf to inhibit buffering.
 * 
 * Besides, it's wasteful to check the return value from every call
 * that writes to stdout -- just let the internal stream state record
 * the failure.  That's what the ferror test is checking below.
 * 
 * It's important to detect such failures and exit nonzero because many
 * tools (most notably `make' and other build-management systems) depend
 * on being able to detect failure in other tools via their exit status.  */
void close_stdout_status(int status)
{
    if (ferror(stdout))
	error(status, 0, _("write error"));
    if (fclose(stdout) != 0)
	error(status, errno, _("write error"));
}

/* Close standard output, exiting with status EXIT_FAILURE on failure.  */
void close_stdout(void)
{
    close_stdout_status(EXIT_FAILURE);
}


syntax highlighted by Code2HTML, v. 0.9.1