]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - include/closestream.h
include/closestream: add close_stdout_atexit()
[thirdparty/util-linux.git] / include / closestream.h
index 7842456fbac0201d84896c45ccc078cf16409371..0ce34fe52dc287948a5e2883a8b7590faee23be1 100644 (file)
 #include "c.h"
 #include "nls.h"
 
-#ifndef HAVE___FPENDING
-static inline int
-__fpending(FILE *stream __attribute__((__unused__)))
-{
-       return 0;
-}
+#ifndef CLOSE_EXIT_CODE
+# define CLOSE_EXIT_CODE EXIT_FAILURE
 #endif
 
 static inline int
 close_stream(FILE * stream)
 {
+#ifdef HAVE___FPENDING
        const int some_pending = (__fpending(stream) != 0);
+#endif
        const int prev_fail = (ferror(stream) != 0);
        const int fclose_fail = (fclose(stream) != 0);
 
-       if (prev_fail || (fclose_fail && (some_pending || errno != EBADF))) {
+       if (prev_fail || (fclose_fail && (
+#ifdef HAVE___FPENDING
+                                         some_pending ||
+#endif
+                                         errno != EBADF))) {
                if (!fclose_fail && !(errno == EPIPE))
                        errno = 0;
                return EOF;
@@ -42,11 +44,22 @@ close_stdout(void)
                        warn(_("write error"));
                else
                        warnx(_("write error"));
-               _exit(EXIT_FAILURE);
+               _exit(CLOSE_EXIT_CODE);
        }
 
        if (close_stream(stderr) != 0)
-               _exit(EXIT_FAILURE);
+               _exit(CLOSE_EXIT_CODE);
+}
+
+static inline void
+close_stdout_atexit(void)
+{
+       /*
+        * Note that close stdout at exit disables ASAN to report memory leaks
+        */
+#ifdef USE_CLOSE_ATEXIT
+       atexit(close_stdout);
+#endif
 }
 
 #ifndef HAVE_FSYNC