xref: /dflybsd-src/contrib/xz/src/common/tuklib_exit.c (revision b5feb3da7c498482b19d14ac6f2b1901005f7d94)
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