changeset 7417:fa9e9b096831

* clean-temp.h (close_stream_temp): New declaration. * clean-temp.c (includes): Pull in headers according to what other modules are in use. (close_stream_temp) [GNULIB_CLOSE_STREAM]: New function.
author Eric Blake <ebb9@byu.net>
date Fri, 06 Oct 2006 23:13:53 +0000
parents 0350284ebb9c
children 77a75e20049c
files lib/ChangeLog lib/clean-temp.c lib/clean-temp.h
diffstat 3 files changed, 43 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,10 @@
+2006-10-06  Eric Blake  <ebb9@byu.net>
+
+	* clean-temp.h (close_stream_temp): New declaration.
+	* clean-temp.c (includes): Pull in headers according to what
+	other modules are in use.
+	(close_stream_temp) [GNULIB_CLOSE_STREAM]: New function.
+
 2006-10-06  Bruno Haible  <bruno@clisp.org>
 
 	* clean-temp.h (cleanup_temp_file, cleanup_temp_subdir,
--- a/lib/clean-temp.c
+++ b/lib/clean-temp.c
@@ -23,6 +23,7 @@
 #include "clean-temp.h"
 
 #include <errno.h>
+#include <fcntl.h>
 #include <limits.h>
 #include <stdbool.h>
 #include <stdlib.h>
@@ -38,6 +39,15 @@
 #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)
 
@@ -679,3 +689,25 @@
   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
--- a/lib/clean-temp.h
+++ b/lib/clean-temp.h
@@ -122,6 +122,10 @@
    Unregisters the previously registered file descriptor.  */
 extern int fwriteerror_temp (FILE *fp);
 
+/* Like close_stream.
+   Unregisters the previously registered file descriptor.  */
+extern int close_stream_temp (FILE *fp);
+
 
 #ifdef __cplusplus
 }