[gvfs] afp: use randomized names for temporary files
- From: Christian Kellner <gicmo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] afp: use randomized names for temporary files
- Date: Thu, 25 Aug 2011 19:25:44 +0000 (UTC)
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]