[gvfs] afp: fix problem with creating new directories outside the volume root directory
- From: Christian Kellner <gicmo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] afp: fix problem with creating new directories outside the volume root directory
- Date: Thu, 25 Aug 2011 19:26:35 +0000 (UTC)
commit 4d8d70013d57784756f62d80e5e6f8ac1d70aceb
Author: Carl-Anton Ingmarsson <ca ingmarsson gmail com>
Date: Sat Jul 23 00:57:11 2011 +0200
afp: fix problem with creating new directories outside the volume root directory
we can't send a path to FPCreateDir so we first query the parent directory's
node-id
daemon/gvfsbackendafp.c | 50 +++++++++++++++++++++++++++++++++++++++-------
1 files changed, 42 insertions(+), 8 deletions(-)
---
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c
index cf9c4a8..b5b0360 100644
--- a/daemon/gvfsbackendafp.c
+++ b/daemon/gvfsbackendafp.c
@@ -1240,29 +1240,63 @@ make_directory_cb (GObject *source_object, GAsyncResult *res, gpointer user_data
g_vfs_job_succeeded (G_VFS_JOB (job));
}
-static gboolean
-try_make_directory (GVfsBackend *backend,
- GVfsJobMakeDirectory *job,
- const char *filename)
+static void
+make_directory_get_filedir_parms_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
{
- GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
+ GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
+ GVfsJobMakeDirectory *job = G_VFS_JOB_MAKE_DIRECTORY (user_data);
+
+ GFileInfo *info;
+ GError *err = NULL;
+ guint32 dir_id;
+ char *basename;
GVfsAfpCommand *comm;
+
+ info = get_filedir_parms_finish (afp_backend, res, &err);
+ if (!info)
+ {
+ g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
+ g_error_free (err);
+ return;
+ }
+
+ dir_id = g_file_info_get_attribute_uint32 (info, "afp::node-id");
+ g_object_unref (info);
comm = g_vfs_afp_command_new (AFP_COMMAND_CREATE_DIR);
/* pad byte */
g_vfs_afp_command_put_byte (comm, 0);
/* Volume ID */
g_vfs_afp_command_put_uint16 (comm, afp_backend->volume_id);
- /* Directory ID 2 == / */
- g_vfs_afp_command_put_uint32 (comm, 2);
+ /* Directory ID */
+ g_vfs_afp_command_put_uint32 (comm, dir_id);
+
/* Pathname */
- put_pathname (comm, filename);
+ basename = g_path_get_basename (job->filename);
+ put_pathname (comm, basename);
+ g_free (basename);
g_vfs_afp_connection_send_command (afp_backend->server->conn, comm, make_directory_cb,
G_VFS_JOB (job)->cancellable, job);
g_object_unref (comm);
+}
+static gboolean
+try_make_directory (GVfsBackend *backend,
+ GVfsJobMakeDirectory *job,
+ const char *filename)
+{
+ GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
+
+ char *dirname;
+
+ dirname = g_path_get_dirname (filename);
+ get_filedir_parms (afp_backend, dirname, 0, AFP_DIR_BITMAP_NODE_ID_BIT,
+ G_VFS_JOB (job)->cancellable, make_directory_get_filedir_parms_cb,
+ job);
+ g_free (dirname);
+
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]