root/src/common/tuklib_exit.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. tuklib_exit

///////////////////////////////////////////////////////////////////////////////
//
/// \file       tuklib_exit.c
/// \brief      Close stdout and stderr, and exit
//
//  Author:     Lasse Collin
//
//  This file has been put into the public domain.
//  You can do whatever you want with this file.
//
///////////////////////////////////////////////////////////////////////////////

#include "tuklib_common.h"

#include <stdlib.h>
#include <stdio.h>

#include "tuklib_gettext.h"
#include "tuklib_progname.h"
#include "tuklib_exit.h"


extern void
tuklib_exit(int status, int err_status, int show_error)
{
        if (status != err_status) {
                // Close stdout. If something goes wrong,
                // print an error message to stderr.
                const int ferror_err = ferror(stdout);
                const int fclose_err = fclose(stdout);
                if (ferror_err || fclose_err) {
                        status = err_status;

                        // If it was fclose() that failed, we have the reason
                        // in errno. If only ferror() indicated an error,
                        // we have no idea what the reason was.
                        if (show_error)
                                fprintf(stderr, "%s: %s: %s\n", progname,
                                                _("Writing to standard "
                                                        "output failed"),
                                                fclose_err ? strerror(errno)
                                                        : _("Unknown error"));
                }
        }

        if (status != err_status) {
                // Close stderr. If something goes wrong, there's
                // nothing where we could print an error message.
                // Just set the exit status.
                const int ferror_err = ferror(stderr);
                const int fclose_err = fclose(stderr);
                if (fclose_err || ferror_err)
                        status = err_status;
        }

        exit(status);
}

/* [<][>][^][v][top][bottom][index][help] */