Index: xz/src/common/tuklib_exit.c |
=================================================================== |
--- xz/src/common/tuklib_exit.c (revision 0) |
+++ xz/src/common/tuklib_exit.c (revision 0) |
@@ -0,0 +1,57 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \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); |
+} |
Property changes on: xz/src/common/tuklib_exit.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |