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 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