summaryrefslogtreecommitdiff
path: root/lib/clean-temp.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2020-07-04 15:18:20 +0200
committerBruno Haible <bruno@clisp.org>2020-07-04 15:21:50 +0200
commit7ee75d845dbbd2791c99668fef18438652113a00 (patch)
tree60378869f7ac3a656fdaed9abd28ea174447827f /lib/clean-temp.c
parent629e348003127a1d780fc2edf4f5d38f42e09fb9 (diff)
downloadgnulib-7ee75d845dbbd2791c99668fef18438652113a00.tar.gz
clean-temp: Add support for temporary files with unpredictable names.
* lib/clean-temp.h (gen_register_open_temp): New declaration. * lib/clean-temp.c: Include tempname.h. (gen_register_open_temp): New function. * modules/tempname (configure.ac): Define a module indicator.
Diffstat (limited to 'lib/clean-temp.c')
-rw-r--r--lib/clean-temp.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/lib/clean-temp.c b/lib/clean-temp.c
index 275dc789ed..948a7edb50 100644
--- a/lib/clean-temp.c
+++ b/lib/clean-temp.c
@@ -48,6 +48,9 @@
#include "gl_linkedhash_list.h"
#include "gl_linked_list.h"
#include "gettext.h"
+#if GNULIB_TEMPNAME
+# include "tempname.h"
+#endif
#if GNULIB_FWRITEERROR
# include "fwriteerror.h"
#endif
@@ -958,8 +961,34 @@ fopen_temp (const char *file_name, const char *mode, bool delete_on_close)
return fp;
}
+#if GNULIB_TEMPNAME
+/* Open a temporary file, generating its name based on FILE_NAME_TMPL.
+ FILE_NAME_TMPL must match the rules for mk[s]temp (i.e. end in "XXXXXX",
+ possibly with a suffix). The name constructed does not exist at the time
+ of the call. FILE_NAME_TMPL is overwritten with the result.
+ Registers the file for deletion.
+ Opens the file, with the given FLAGS and mode 0600.
+ Registers the resulting file descriptor to be closed. */
+int
+gen_register_open_temp (char *file_name_tmpl, int suffixlen, int flags)
+{
+ block_fatal_signals ();
+ int fd = gen_tempname (file_name_tmpl, suffixlen, flags, GT_FILE);
+ int saved_errno = errno;
+ if (fd >= 0)
+ {
+ init_clean_temp ();
+ register_fd (fd);
+ register_temporary_file (file_name_tmpl);
+ }
+ unblock_fatal_signals ();
+ errno = saved_errno;
+ return fd;
+}
+#endif
+
/* Close a temporary file.
- FD must have been returned by open_temp.
+ FD must have been returned by open_temp or gen_register_open_temp.
Unregisters the previously registered file descriptor. */
int
close_temp (int fd)
@@ -1088,7 +1117,7 @@ fclose_variant_temp (FILE *fp, int (*fclose_variant) (FILE *))
/* Close a temporary file.
FP must have been returned by fopen_temp, or by fdopen on a file descriptor
- returned by open_temp.
+ returned by open_temp or gen_register_open_temp.
Unregisters the previously registered file descriptor. */
int
fclose_temp (FILE *fp)
@@ -1099,7 +1128,7 @@ fclose_temp (FILE *fp)
#if GNULIB_FWRITEERROR
/* Like fwriteerror.
FP must have been returned by fopen_temp, or by fdopen on a file descriptor
- returned by open_temp.
+ returned by open_temp or gen_register_open_temp.
Unregisters the previously registered file descriptor. */
int
fwriteerror_temp (FILE *fp)
@@ -1111,7 +1140,7 @@ fwriteerror_temp (FILE *fp)
#if GNULIB_CLOSE_STREAM
/* Like close_stream.
FP must have been returned by fopen_temp, or by fdopen on a file descriptor
- returned by open_temp.
+ returned by open_temp or gen_register_open_temp.
Unregisters the previously registered file descriptor. */
int
close_stream_temp (FILE *fp)