diff options
author | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 15:08:25 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 15:08:25 +0000 |
commit | 451768de012fd96a2c53fc81db61a2fd3c6eca56 (patch) | |
tree | 8cc5f82f21ada3b1b8294934d8f7220699a994a9 /daemon | |
parent | 1d6689a6b4c8f65428b6a924ff064ec0f433c521 (diff) | |
download | gvfs-451768de012fd96a2c53fc81db61a2fd3c6eca56.tar.gz |
Implement symlink_target
Original git commit by Alexander Larsson <alexl@redhat.com> at 1189516804 +0200
svn path=/trunk/; revision=931
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gvfsbackendsftp.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c index 75e3cdc0..6b74b5a0 100644 --- a/daemon/gvfsbackendsftp.c +++ b/daemon/gvfsbackendsftp.c @@ -1627,6 +1627,9 @@ get_info_finish (GVfsBackendSftp *backend, op_job->file_info); } + if (data->symlink_target) + g_file_info_set_symlink_target (op_job->file_info, data->symlink_target); + g_vfs_job_succeeded (G_VFS_JOB (job)); } @@ -1692,6 +1695,29 @@ get_info_lstat_reply (GVfsBackendSftp *backend, get_info_finish (backend, job); } +static void +get_info_readlink_reply (GVfsBackendSftp *backend, + int reply_type, + GDataInputStream *reply, + guint32 len, + GVfsJob *job, + gpointer user_data) +{ + GetInfoData *data; + guint32 count; + + data = job->backend_data; + + if (reply_type == SSH_FXP_NAME) + { + count = g_data_input_stream_get_uint32 (reply, NULL, NULL); + data->symlink_target = read_string (reply, NULL); + } + + if (--data->cb_count == 0) + get_info_finish (backend, job); +} + static gboolean try_get_info (GVfsBackend *backend, GVfsJobGetInfo *job, @@ -1725,11 +1751,22 @@ try_get_info (GVfsBackend *backend, put_string (command, filename); queue_command_stream_and_free (op_backend, command, id, get_info_stat_reply, G_VFS_JOB (job), NULL); } + + if (g_file_attribute_matcher_matches (job->attribute_matcher, + G_FILE_ATTRIBUTE_STD_SYMLINK_TARGET)) + { + data->cb_count++; + + command = new_command_stream (op_backend, + SSH_FXP_READLINK, + &id); + put_string (command, filename); + queue_command_stream_and_free (op_backend, command, id, get_info_readlink_reply, G_VFS_JOB (job), NULL); + } return TRUE; } - static void g_vfs_backend_sftp_class_init (GVfsBackendSftpClass *klass) { |