diff options
author | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 15:08:33 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 15:08:33 +0000 |
commit | 1055155d3a0d0d530e5f55e7b6fe19ccca1cba47 (patch) | |
tree | 77df6c1ee8c60fb67546c6a8b33218c088b0decd /daemon | |
parent | 2650b73099c9744fe006b1f143028566982d97ac (diff) | |
download | gvfs-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.c | 61 |
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; |