# HG changeset patch # User Eric Blake # Date 1160176433 0 # Node ID fa9e9b0968313be353fb40aef4843ee67df21662 # Parent 0350284ebb9c5ab0f7242f7fbb186d1d83aae286 * 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. diff --git a/lib/ChangeLog b/lib/ChangeLog --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,10 @@ +2006-10-06 Eric Blake + + * 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 * clean-temp.h (cleanup_temp_file, cleanup_temp_subdir, diff --git a/lib/clean-temp.c b/lib/clean-temp.c --- a/lib/clean-temp.c +++ b/lib/clean-temp.c @@ -23,6 +23,7 @@ #include "clean-temp.h" #include +#include #include #include #include @@ -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 diff --git a/lib/clean-temp.h b/lib/clean-temp.h --- 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 }