[gvfs] afp: use randomized names for temporary files



commit 631c3ddc9c7fa474d948a1a5fb6d5908ae2edb94
Author: Carl-Anton Ingmarsson <ca ingmarsson gmail com>
Date:   Thu Jul 14 21:34:00 2011 +0200

    afp: use randomized names for temporary files

 daemon/gvfsbackendafp.c |   48 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 39 insertions(+), 9 deletions(-)
---
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c
index a0405d1..4244bef 100644
--- a/daemon/gvfsbackendafp.c
+++ b/daemon/gvfsbackendafp.c
@@ -1436,8 +1436,10 @@ replace_open_fork_cb (GVfsJob        *job,
   g_vfs_job_succeeded (G_VFS_JOB (job));
 }
 
+static void replace_create_tmp_file (GVfsBackendAfp *afp_backend, GVfsJobOpenForWrite *job);
+
 static void
-replace_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+replace_create_tmp_file_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
   GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
   GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data);
@@ -1448,8 +1450,14 @@ replace_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 
   if (!create_file_finish (afp_backend, res, &err))
   {
-    g_vfs_job_failed (G_VFS_JOB (job), err->domain, err->code,
-                      _("Couldn't create temporary file (%s)"), err->message);
+    if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_EXISTS))
+      replace_create_tmp_file (afp_backend, job);
+
+    else
+    {
+      g_vfs_job_failed (G_VFS_JOB (job), err->domain, err->code,
+                        _("Couldn't create temporary file (%s)"), err->message);
+    }
     g_error_free (err);
     return;
   }
@@ -1460,6 +1468,33 @@ replace_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
              replace_open_fork_cb);
 }
 
+static void
+random_chars (char *str, int len)
+{
+  int i;
+  const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+  for (i = 0; i < len; i++)
+    str[i] = chars[g_random_int_range (0, strlen(chars))];
+}
+
+static void
+replace_create_tmp_file (GVfsBackendAfp *afp_backend, GVfsJobOpenForWrite *job)
+{
+  char basename[] = "~gvfXXXX.tmp";
+  char *dir, *tmp_filename;
+
+  random_chars (basename + 4, 4);
+  dir = g_path_get_dirname (job->filename);
+
+  tmp_filename = g_build_filename (dir, basename, NULL);
+  g_free (dir);
+
+  g_object_set_data_full (G_OBJECT (job), "TempFilename", tmp_filename, g_free);
+  create_file (afp_backend, tmp_filename, FALSE, G_VFS_JOB (job)->cancellable,
+               replace_create_tmp_file_cb, job);
+}
+
 static gboolean
 try_replace (GVfsBackend *backend,
              GVfsJobOpenForWrite *job,
@@ -1470,8 +1505,6 @@ try_replace (GVfsBackend *backend,
 {
   GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
 
-  char *tmp_filename;
-  
   if (make_backup)
   { 
     /* FIXME: implement! */
@@ -1481,10 +1514,7 @@ try_replace (GVfsBackend *backend,
     return TRUE;
   }
 
-  tmp_filename = g_strdup_printf ("%s.tmp", filename);
-  g_object_set_data_full (G_OBJECT (job), "TempFilename", tmp_filename, g_free); 
-  create_file (afp_backend, tmp_filename, TRUE, G_VFS_JOB (job)->cancellable,
-               replace_cb, job);
+  replace_create_tmp_file (afp_backend, job);
 
   return TRUE;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]