]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - include/closestream.h
findmnt: (verify) ignore passno for XFS
[thirdparty/util-linux.git] / include / closestream.h
index d61b83b5ec4c7da22abad642d3612943940000d8..6a62e48e8a13522aaf9f8a60ad8acbca77afbce8 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 (!fclose_fail)
+
+       if (prev_fail || (fclose_fail && (
+#ifdef HAVE___FPENDING
+                                         some_pending ||
+#endif
+                                         errno != EBADF))) {
+               if (!fclose_fail && !(errno == EPIPE))
                        errno = 0;
                return EOF;
        }
@@ -41,11 +44,41 @@ 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
+        */
+#if !defined(__SANITIZE_ADDRESS__)
+       atexit(close_stdout);
+#endif
+}
+
+#ifndef HAVE_FSYNC
+static inline int
+fsync(int fd __attribute__((__unused__)))
+{
+       return 0;
+}
+#endif
+
+static inline int
+close_fd(int fd)
+{
+       const int fsync_fail = (fsync(fd) != 0);
+       const int close_fail = (close(fd) != 0);
+
+       if (fsync_fail || close_fail)
+               return EOF;
+       return 0;
 }
 
 #endif /* UTIL_LINUX_CLOSESTREAM_H */