summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@src.gnome.org>2007-09-13 15:08:33 +0000
committerAlexander Larsson <alexl@src.gnome.org>2007-09-13 15:08:33 +0000
commit1055155d3a0d0d530e5f55e7b6fe19ccca1cba47 (patch)
tree77df6c1ee8c60fb67546c6a8b33218c088b0decd /daemon
parent2650b73099c9744fe006b1f143028566982d97ac (diff)
downloadgvfs-1055155d3a0d0d530e5f55e7b6fe19ccca1cba47.tar.gz
Support symlink_target for readdir
Original git commit by Alexander Larsson <alexl@redhat.com> at 1189519012 +0200 svn path=/trunk/; revision=934
Diffstat (limited to 'daemon')
-rw-r--r--daemon/gvfsbackendsftp.c61
1 files changed, 55 insertions, 6 deletions
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c
index b62d737b..4a886931 100644
--- a/daemon/gvfsbackendsftp.c
+++ b/daemon/gvfsbackendsftp.c
@@ -1381,6 +1381,38 @@ read_dir_data_free (ReadDirData *data)
g_slice_free (ReadDirData, data);
}
+static void
+read_dir_readlink_reply (GVfsBackendSftp *backend,
+ int reply_type,
+ GDataInputStream *reply,
+ guint32 len,
+ GVfsJob *job,
+ gpointer user_data)
+{
+ ReadDirData *data;
+ guint32 count;
+ GFileInfo *info = user_data;
+ char *target;
+
+ data = job->backend_data;
+
+ if (reply_type == SSH_FXP_NAME)
+ {
+ count = g_data_input_stream_get_uint32 (reply, NULL, NULL);
+ target = read_string (reply, NULL);
+ if (target)
+ {
+ g_file_info_set_symlink_target (info, target);
+ g_free (target);
+ }
+ }
+
+ g_vfs_job_enumerate_add_info (G_VFS_JOB_ENUMERATE (job), info);
+ g_object_unref (info);
+
+ if (--data->outstanding_requests == 0)
+ g_vfs_job_enumerate_done (G_VFS_JOB_ENUMERATE (job));
+}
static void
read_dir_got_stat_info (GVfsBackendSftp *backend,
@@ -1388,10 +1420,29 @@ read_dir_got_stat_info (GVfsBackendSftp *backend,
GFileInfo *info)
{
GVfsJobEnumerate *enum_job;
+ GDataOutputStream *command;
+ ReadDirData *data;
+ guint32 id;
+ char *abs_name;
- enum_job = G_VFS_JOB_ENUMERATE (job);
+ data = job->backend_data;
- g_vfs_job_enumerate_add_info (enum_job, info);
+ enum_job = G_VFS_JOB_ENUMERATE (job);
+
+ if (g_file_attribute_matcher_matches (enum_job->attribute_matcher,
+ G_FILE_ATTRIBUTE_STD_SYMLINK_TARGET))
+ {
+ data->outstanding_requests++;
+ command = new_command_stream (backend,
+ SSH_FXP_READLINK,
+ &id);
+ abs_name = g_build_filename (enum_job->filename, g_file_info_get_name (info), NULL);
+ put_string (command, abs_name);
+ g_free (abs_name);
+ queue_command_stream_and_free (backend, command, id, read_dir_readlink_reply, G_VFS_JOB (job), g_object_ref (info));
+ }
+ else
+ g_vfs_job_enumerate_add_info (enum_job, info);
}
@@ -1429,8 +1480,7 @@ read_dir_symlink_reply (GVfsBackendSftp *backend,
g_object_unref (lstat_info);
- data->outstanding_requests--;
- if (data->outstanding_requests == 0)
+ if (--data->outstanding_requests == 0)
g_vfs_job_enumerate_done (G_VFS_JOB_ENUMERATE (job));
}
@@ -1457,8 +1507,7 @@ read_dir_reply (GVfsBackendSftp *backend,
{
/* Ignore all error, including the expected END OF FILE.
* Real errors are expected in open_dir anyway */
- data->outstanding_requests --;
- if (data->outstanding_requests == 0)
+ if (--data->outstanding_requests == 0)
g_vfs_job_enumerate_done (enum_job);
return;