2009-09-19 02:47:30 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
/// \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>
|
2020-02-20 11:54:04 -05:00
|
|
|
#include <string.h>
|
2009-09-19 02:47:30 -04:00
|
|
|
|
|
|
|
#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);
|
|
|
|
}
|