summaryrefslogtreecommitdiff
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
parent629e348003127a1d780fc2edf4f5d38f42e09fb9 (diff)
downloadgnulib-7ee75d845dbbd2791c99668fef18438652113a00.tar.gz
gnulib-7ee75d845dbbd2791c99668fef18438652113a00.tar.bz2
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.
-rw-r--r--ChangeLog8
-rw-r--r--lib/clean-temp.c37
-rw-r--r--lib/clean-temp.h17
-rw-r--r--modules/tempname1
4 files changed, 55 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 4c6319fe28..0b488710f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2020-07-04 Bruno Haible <bruno@clisp.org>
+ 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 <bruno@clisp.org>
+
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 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)
diff --git a/lib/clean-temp.h b/lib/clean-temp.h
index c828d72e58..087db452d1 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 ca885220c2..794a763f53 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

Return to:

Send suggestions and report system problems to the System administrator.