>From 7ee75d845dbbd2791c99668fef18438652113a00 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 4 Jul 2020 15:18:20 +0200 Subject: [PATCH 2/3] 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. --- ChangeLog | 8 ++++++++ lib/clean-temp.c | 37 +++++++++++++++++++++++++++++++++---- lib/clean-temp.h | 17 +++++++++++++---- modules/tempname | 1 + 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4c6319f..0b48871 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2020-07-04 Bruno Haible + 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. + +2020-07-04 Bruno Haible + clean-temp: Add support for temporary files anywhere in the file system. * lib/clean-temp.h (register_temporary_file, unregister_temporary_file, cleanup_temporary_file): New declarations. diff --git a/lib/clean-temp.c b/lib/clean-temp.c index 275dc78..948a7ed 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) diff --git a/lib/clean-temp.h b/lib/clean-temp.h index c828d72..087db45 100644 --- a/lib/clean-temp.h +++ b/lib/clean-temp.h @@ -150,26 +150,35 @@ extern int open_temp (const char *file_name, int flags, mode_t mode, extern FILE * fopen_temp (const char *file_name, const char *mode, bool delete_on_close); +/* 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. */ +extern int gen_register_open_temp (char *file_name_tmpl, int suffixlen, int flags); + /* 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. */ extern int close_temp (int fd); /* 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. */ extern int fclose_temp (FILE *fp); /* 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. */ extern int fwriteerror_temp (FILE *fp); /* 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. */ extern int close_stream_temp (FILE *fp); diff --git a/modules/tempname b/modules/tempname index ca88522..794a763 100644 --- a/modules/tempname +++ b/modules/tempname @@ -19,6 +19,7 @@ sys_stat configure.ac: gl_FUNC_GEN_TEMPNAME +gl_MODULE_INDICATOR([tempname]) Makefile.am: lib_SOURCES += tempname.c -- 2.7.4