Change pattern of tmpfiles from <name>.tmpXXXXXX to <name>tmpXXXXXX
[pspp] / src / data / make-file.c
index 63792e90b4a960b406493131b63e73b4f2e86cf7..c8f3238a80cdc2f7a7c5d9479cc72c2bbf191df5 100644 (file)
@@ -17,6 +17,7 @@
 #include <config.h>
 
 #include "data/make-file.h"
+#include "libpspp/i18n.h"
 
 #include <assert.h>
 #include <errno.h>
@@ -28,6 +29,7 @@
 #include <unistd.h>
 
 #include "data/file-name.h"
+#include "data/file-handle-def.h"
 #include "libpspp/ll.h"
 #include "libpspp/message.h"
 
@@ -45,20 +47,23 @@ struct replace_file
     char *file_name;
     char *tmp_name;
   };
-
 static struct ll_list all_files = LL_INITIALIZER (all_files);
 
 static void free_replace_file (struct replace_file *);
 static void unlink_replace_files (void);
 
 struct replace_file *
-replace_file_start (const char *file_name, const char *mode,
-                    mode_t permissions, FILE **fp, char **tmp_name)
+replace_file_start (const struct file_handle *fh, const char *mode,
+                    mode_t permissions, FILE **fp)
 {
   static bool registered;
   struct stat s;
   struct replace_file *rf;
   int fd;
+  int saved_errno = errno;
+
+  const char *file_name = fh_get_file_name (fh);
 
   /* If FILE_NAME represents a special file, write to it directly
      instead of trying to replace it. */
@@ -68,8 +73,9 @@ replace_file_start (const char *file_name, const char *mode,
       fd = open (file_name, O_WRONLY);
       if (fd < 0)
         {
+         saved_errno = errno;     
           msg (ME, _("Opening %s for writing: %s."),
-               file_name, strerror (errno));
+               file_name, strerror (saved_errno));
           return NULL;
         }
 
@@ -77,8 +83,9 @@ replace_file_start (const char *file_name, const char *mode,
       *fp = fdopen (fd, mode);
       if (*fp == NULL)
         {
-          msg (ME, _("Opening stream for %s: %s."),
-               file_name, strerror (errno));
+         saved_errno = errno;     
+         msg (ME, _("Opening stream for %s: %s."),
+               file_name, strerror (saved_errno));
           close (fd);
           return NULL;
         }
@@ -86,8 +93,6 @@ replace_file_start (const char *file_name, const char *mode,
       rf = xmalloc (sizeof *rf);
       rf->file_name = NULL;
       rf->tmp_name = xstrdup (file_name);
-      if (tmp_name != NULL)
-        *tmp_name = rf->tmp_name;
       return rf;
     }
 
@@ -103,11 +108,12 @@ replace_file_start (const char *file_name, const char *mode,
   for (;;)
     {
       /* Generate unique temporary file name. */
-      rf->tmp_name = xasprintf ("%s.tmpXXXXXX", file_name);
+      rf->tmp_name = xasprintf ("%stmpXXXXXX", file_name);
       if (gen_tempname (rf->tmp_name, 0, 0600, GT_NOCREATE) < 0)
         {
+         saved_errno = errno;
           msg (ME, _("Creating temporary file to replace %s: %s."),
-               rf->file_name, strerror (errno));
+               rf->file_name, strerror (saved_errno));
           goto error;
         }
 
@@ -117,8 +123,9 @@ replace_file_start (const char *file_name, const char *mode,
         break;
       if (errno != EEXIST)
         {
+         saved_errno = errno;
           msg (ME, _("Creating temporary file %s: %s."),
-               rf->tmp_name, strerror (errno));
+               rf->tmp_name, strerror (saved_errno));
           goto error;
         }
       free (rf->tmp_name);
@@ -129,8 +136,9 @@ replace_file_start (const char *file_name, const char *mode,
   *fp = fdopen (fd, mode);
   if (*fp == NULL)
     {
+      saved_errno = errno;
       msg (ME, _("Opening stream for temporary file %s: %s."),
-           rf->tmp_name, strerror (errno));
+           rf->tmp_name, strerror (saved_errno));
       close (fd);
       unlink (rf->tmp_name);
       goto error;
@@ -140,17 +148,13 @@ replace_file_start (const char *file_name, const char *mode,
   ll_push_head (&all_files, &rf->ll);
   unblock_fatal_signals ();
 
-  if (tmp_name != NULL)
-    *tmp_name = rf->tmp_name;
-
   return rf;
 
 error:
   unblock_fatal_signals ();
   free_replace_file (rf);
   *fp = NULL;
-  if (tmp_name != NULL)
-    *tmp_name = NULL;
+  errno = saved_errno;
   return NULL;
 }