summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kellner <gicmo@gnome.org>2009-03-02 12:35:53 +0000
committerChristian Kellner <gicmo@src.gnome.org>2009-03-02 12:35:53 +0000
commit27b6264a101df7d701ba2078138e8b3294035d64 (patch)
tree8e0f11c20e6a53eb82d892feec02f69a858e9e83
parentc5c691e410a175107a7aae39b47393f200450435 (diff)
downloadgvfs-27b6264a101df7d701ba2078138e8b3294035d64.tar.gz
Implement query_info on sftp streams
2009-03-02 Christian Kellner <gicmo@gnome.org> * daemon/gvfsbackendsftp.c: Implement query_info on sftp streams svn path=/trunk/; revision=2273
-rw-r--r--ChangeLog5
-rw-r--r--daemon/gvfsbackendsftp.c70
2 files changed, 75 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 624d7236..db02b898 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-02 Christian Kellner <gicmo@gnome.org>
+
+ * daemon/gvfsbackendsftp.c:
+ Implement query_info on sftp streams
+
2009-03-02 Alexander Larsson <alexl@redhat.com>
Bug 550929 – nautilus sftp:// doesn't read User in ~/.ssh/config
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c
index 90cd9942..e0be27b9 100644
--- a/daemon/gvfsbackendsftp.c
+++ b/daemon/gvfsbackendsftp.c
@@ -52,6 +52,8 @@
#include "gvfsjobseekwrite.h"
#include "gvfsjobsetdisplayname.h"
#include "gvfsjobqueryinfo.h"
+#include "gvfsjobqueryinforead.h"
+#include "gvfsjobqueryinfowrite.h"
#include "gvfsjobmove.h"
#include "gvfsjobdelete.h"
#include "gvfsjobqueryfsinfo.h"
@@ -3577,6 +3579,72 @@ try_query_info (GVfsBackend *backend,
return TRUE;
}
+typedef struct {
+ GFileInfo *info;
+ GFileAttributeMatcher *attribute_matcher;
+} QueryInfoFStatData;
+
+static void
+query_info_fstat_reply (GVfsBackendSftp *backend,
+ int reply_type,
+ GDataInputStream *reply,
+ guint32 len,
+ GVfsJob *job,
+ gpointer user_data)
+{
+ QueryInfoFStatData *data = user_data;
+ GFileInfo *file_info;
+ GFileAttributeMatcher *attribute_matcher;
+
+ file_info = data->info;
+ attribute_matcher = data->attribute_matcher;
+ g_slice_free (QueryInfoFStatData, data);
+
+ if (reply_type == SSH_FXP_STATUS)
+ {
+ result_from_status (job, reply, -1, -1);
+ return;
+ }
+
+ if (reply_type != SSH_FXP_ATTRS)
+ {
+ g_vfs_job_failed (job, G_IO_ERROR, G_IO_ERROR_FAILED,
+ _("Invalid reply received"));
+ return;
+ }
+
+ parse_attributes (backend,
+ file_info,
+ NULL,
+ reply,
+ attribute_matcher);
+
+ g_vfs_job_succeeded (G_VFS_JOB (job));
+}
+
+static gboolean
+try_query_info_fstat (GVfsBackend *backend,
+ GVfsJob *job,
+ GVfsBackendHandle _handle,
+ GFileInfo *info,
+ GFileAttributeMatcher *attribute_matcher)
+{
+ SftpHandle *handle = _handle;
+ GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
+ GDataOutputStream *command;
+ QueryInfoFStatData *data;
+
+ command = new_command_stream (op_backend, SSH_FXP_FSTAT);
+ put_data_buffer (command, handle->raw_handle);
+
+ data = g_slice_new (QueryInfoFStatData);
+ data->info = info;
+ data->attribute_matcher = attribute_matcher;
+ queue_command_stream_and_free (op_backend, command, query_info_fstat_reply, G_VFS_JOB (job), data);
+
+ return TRUE;
+}
+
static void
move_reply (GVfsBackendSftp *backend,
int reply_type,
@@ -4106,6 +4174,8 @@ g_vfs_backend_sftp_class_init (GVfsBackendSftpClass *klass)
backend_class->try_close_read = try_close_read;
backend_class->try_close_write = try_close_write;
backend_class->try_query_info = try_query_info;
+ backend_class->try_query_info_on_read = (gpointer) try_query_info_fstat;
+ backend_class->try_query_info_on_write = (gpointer) try_query_info_fstat;
backend_class->try_enumerate = try_enumerate;
backend_class->try_create = try_create;
backend_class->try_append_to = try_append_to;