| /////////////////////////////////////////////////////////////////////////////// |
| // |
| /// \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); |
| } |