]> Savannah Git Hosting - gnulib.git/commitdiff
clean-temp: Add support for temporary files with unpredictable names.
authorBruno Haible <bruno@clisp.org>
Sat, 4 Jul 2020 13:18:20 +0000 (15:18 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 4 Jul 2020 13:21:50 +0000 (15:21 +0200)
* 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
lib/clean-temp.c
lib/clean-temp.h
modules/tempname

index 4c6319fe28782ab029d4d73359d6662989569f1f..0b488710f91a99a883b7851ffdee6d2c5a531550 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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.
index 275dc789ed7b2822e0795c998906bdf01fba32ea..948a7edb5036cb82055d771c5f1db3b41a118d97 100644 (file)
@@ -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)
index c828d72e58d13c4cde970d6e9e2dcae1e9682b48..087db452d1e3c875f224dc4b1917bce68f4d1930 100644 (file)
@@ -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);
 
index ca885220c2a27643617c59633766be6b1dd4db4e..794a763f53c38ec0b7b874eddff42d7538262a14 100644 (file)
@@ -19,6 +19,7 @@ sys_stat
 
 configure.ac:
 gl_FUNC_GEN_TEMPNAME
+gl_MODULE_INDICATOR([tempname])
 
 Makefile.am:
 lib_SOURCES += tempname.c