12940b44dSPeter Avalos ///////////////////////////////////////////////////////////////////////////////
22940b44dSPeter Avalos //
32940b44dSPeter Avalos /// \file tuklib_exit.c
42940b44dSPeter Avalos /// \brief Close stdout and stderr, and exit
52940b44dSPeter Avalos //
62940b44dSPeter Avalos // Author: Lasse Collin
72940b44dSPeter Avalos //
82940b44dSPeter Avalos // This file has been put into the public domain.
92940b44dSPeter Avalos // You can do whatever you want with this file.
102940b44dSPeter Avalos //
112940b44dSPeter Avalos ///////////////////////////////////////////////////////////////////////////////
122940b44dSPeter Avalos
132940b44dSPeter Avalos #include "tuklib_common.h"
142940b44dSPeter Avalos
152940b44dSPeter Avalos #include <stdlib.h>
162940b44dSPeter Avalos #include <stdio.h>
17*e151908bSDaniel Fojt #include <string.h>
182940b44dSPeter Avalos
192940b44dSPeter Avalos #include "tuklib_gettext.h"
202940b44dSPeter Avalos #include "tuklib_progname.h"
212940b44dSPeter Avalos #include "tuklib_exit.h"
222940b44dSPeter Avalos
232940b44dSPeter Avalos
242940b44dSPeter Avalos extern void
tuklib_exit(int status,int err_status,int show_error)252940b44dSPeter Avalos tuklib_exit(int status, int err_status, int show_error)
262940b44dSPeter Avalos {
272940b44dSPeter Avalos if (status != err_status) {
282940b44dSPeter Avalos // Close stdout. If something goes wrong,
292940b44dSPeter Avalos // print an error message to stderr.
302940b44dSPeter Avalos const int ferror_err = ferror(stdout);
312940b44dSPeter Avalos const int fclose_err = fclose(stdout);
322940b44dSPeter Avalos if (ferror_err || fclose_err) {
332940b44dSPeter Avalos status = err_status;
342940b44dSPeter Avalos
352940b44dSPeter Avalos // If it was fclose() that failed, we have the reason
362940b44dSPeter Avalos // in errno. If only ferror() indicated an error,
372940b44dSPeter Avalos // we have no idea what the reason was.
382940b44dSPeter Avalos if (show_error)
392940b44dSPeter Avalos fprintf(stderr, "%s: %s: %s\n", progname,
402940b44dSPeter Avalos _("Writing to standard "
412940b44dSPeter Avalos "output failed"),
422940b44dSPeter Avalos fclose_err ? strerror(errno)
432940b44dSPeter Avalos : _("Unknown error"));
442940b44dSPeter Avalos }
452940b44dSPeter Avalos }
462940b44dSPeter Avalos
472940b44dSPeter Avalos if (status != err_status) {
482940b44dSPeter Avalos // Close stderr. If something goes wrong, there's
492940b44dSPeter Avalos // nothing where we could print an error message.
502940b44dSPeter Avalos // Just set the exit status.
512940b44dSPeter Avalos const int ferror_err = ferror(stderr);
522940b44dSPeter Avalos const int fclose_err = fclose(stderr);
532940b44dSPeter Avalos if (fclose_err || ferror_err)
542940b44dSPeter Avalos status = err_status;
552940b44dSPeter Avalos }
562940b44dSPeter Avalos
572940b44dSPeter Avalos exit(status);
582940b44dSPeter Avalos }
59