Make it possible to #define gcd to an alias.
[gnulib.git] / lib / clean-temp.c
index 29a27ba..36a5294 100644 (file)
@@ -23,6 +23,7 @@
 #include "clean-temp.h"
 
 #include <errno.h>
+#include <fcntl.h>
 #include <limits.h>
 #include <stdbool.h>
 #include <stdlib.h>
 #include "xallocsa.h"
 #include "gl_linkedhash_list.h"
 #include "gettext.h"
+#if GNULIB_CLOSE_STREAM
+# include "close-stream.h"
+#endif
+#if GNULIB_FCNTL_SAFER
+# include "fcntl--.h"
+#endif
+#if GNULIB_FOPEN_SAFER
+# include "stdio--.h"
+#endif
 
 #define _(str) gettext (str)
 
@@ -579,7 +589,7 @@ open_temp (const char *file_name, int flags, mode_t mode)
   int saved_errno;
 
   block_fatal_signals ();
-  fd = open (file_name, flags, mode);
+  fd = open (file_name, flags, mode); /* actually open or open_safer */
   saved_errno = errno;
   if (fd >= 0)
     register_fd (fd);
@@ -597,7 +607,7 @@ fopen_temp (const char *file_name, const char *mode)
   int saved_errno;
 
   block_fatal_signals ();
-  fp = fopen (file_name, mode);
+  fp = fopen (file_name, mode); /* actually fopen or fopen_safer */
   saved_errno = errno;
   if (fp != NULL)
     {
@@ -679,3 +689,25 @@ fwriteerror_temp (FILE *fp)
   return result;
 }
 #endif
+
+#if GNULIB_CLOSE_STREAM
+/* Like close_stream.
+   Unregisters the previously registered file descriptor.  */
+int
+close_stream_temp (FILE *fp)
+{
+  int fd = fileno (fp);
+  /* No blocking of signals is needed here, since a double close of a
+     file descriptor is harmless.  */
+  int result = close_stream (fp);
+  int saved_errno = errno;
+
+  /* No race condition here: we assume a single-threaded program, hence
+     fd cannot be re-opened here.  */
+
+  unregister_fd (fd);
+
+  errno = saved_errno;
+  return result;
+}
+#endif