diff options
author | Ross Lagerwall <rosslagerwall@gmail.com> | 2015-05-25 12:00:06 +0100 |
---|---|---|
committer | Ross Lagerwall <rosslagerwall@gmail.com> | 2015-06-07 16:51:04 +0100 |
commit | 9cefe0419fa2d03326313a72700159bc9014116a (patch) | |
tree | fbde16b154af15d2a0e13eeb88d9e6872dea3665 | |
parent | 44a2dfe5bfb2dfbe42387880008887b3a7a3fd64 (diff) | |
download | gvfs-9cefe0419fa2d03326313a72700159bc9014116a.tar.gz |
sftp: Allow queuing and waiting for commands on different connections
Update the infrastructure to allow submitting multiple commands to be
sent on different connections and then waiting for the all to complete.
https://bugzilla.gnome.org/show_bug.cgi?id=747128
-rw-r--r-- | daemon/gvfsbackendsftp.c | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c index 2b1b98a1..fe1d1a0a 100644 --- a/daemon/gvfsbackendsftp.c +++ b/daemon/gvfsbackendsftp.c @@ -1639,9 +1639,14 @@ multi_request_cb (GVfsBackendSftp *backend, } } +typedef struct +{ + Connection *connection; + GDataOutputStream *cmd; +} Command; + static void -queue_command_streams_and_free (Connection *conn, - GDataOutputStream **commands, +queue_command_streams_and_free (Command *commands, int n_commands, MultiReplyCallback callback, GVfsJob *job, @@ -1664,8 +1669,8 @@ queue_command_streams_and_free (Connection *conn, { reply = &data->replies[i]; reply->request = data; - queue_command_stream_and_free (conn, - commands[i], + queue_command_stream_and_free (commands[i].connection, + commands[i].cmd, multi_request_cb, job, reply); @@ -4442,20 +4447,22 @@ try_query_info (GVfsBackend *backend, GFileAttributeMatcher *matcher) { GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend); - GDataOutputStream *commands[3]; + Command commands[3]; GDataOutputStream *command; int n_commands; n_commands = 0; - command = commands[n_commands++] = + commands[n_commands].connection = &op_backend->command_connection; + command = commands[n_commands++].cmd = new_command_stream (op_backend, SSH_FXP_LSTAT); put_string (command, filename); if (! (job->flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS)) { - command = commands[n_commands++] = + commands[n_commands].connection = &op_backend->command_connection; + command = commands[n_commands++].cmd = new_command_stream (op_backend, SSH_FXP_STAT); put_string (command, filename); @@ -4464,14 +4471,14 @@ try_query_info (GVfsBackend *backend, if (g_file_attribute_matcher_matches (job->attribute_matcher, G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET)) { - command = commands[n_commands++] = + commands[n_commands].connection = &op_backend->command_connection; + command = commands[n_commands++].cmd = new_command_stream (op_backend, SSH_FXP_READLINK); put_string (command, filename); } - queue_command_streams_and_free (&op_backend->command_connection, - commands, n_commands, + queue_command_streams_and_free (commands, n_commands, query_info_reply, G_VFS_JOB (job), NULL); @@ -4819,20 +4826,21 @@ try_move (GVfsBackend *backend, { GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend); GDataOutputStream *command; - GDataOutputStream *commands[2]; + Command commands[2]; - command = commands[0] = + commands[0].connection = &op_backend->command_connection; + command = commands[0].cmd = new_command_stream (op_backend, SSH_FXP_LSTAT); put_string (command, source); - command = commands[1] = + commands[1].connection = &op_backend->command_connection; + command = commands[1].cmd = new_command_stream (op_backend, SSH_FXP_LSTAT); put_string (command, destination); - queue_command_streams_and_free (&op_backend->command_connection, - commands, 2, + queue_command_streams_and_free (commands, 2, move_lstat_reply, G_VFS_JOB (job), NULL); @@ -6405,7 +6413,7 @@ try_pull (GVfsBackend *backend, { GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend); SftpPullHandle *handle; - GDataOutputStream *commands[2]; + Command commands[2]; handle = g_slice_new0 (SftpPullHandle); handle->backend = g_object_ref (op_backend); @@ -6415,17 +6423,18 @@ try_pull (GVfsBackend *backend, handle->size = PULL_SIZE_INVALID; handle->max_req = 1; - commands[0] = new_command_stream (op_backend, - flags & G_FILE_COPY_NOFOLLOW_SYMLINKS ? SSH_FXP_LSTAT : SSH_FXP_STAT); - put_string (commands[0], source); + commands[0].connection = &op_backend->command_connection; + commands[0].cmd = new_command_stream (op_backend, + flags & G_FILE_COPY_NOFOLLOW_SYMLINKS ? SSH_FXP_LSTAT : SSH_FXP_STAT); + put_string (commands[0].cmd, source); - commands[1] = new_command_stream (op_backend, SSH_FXP_OPEN); - put_string (commands[1], source); - g_data_output_stream_put_uint32 (commands[1], SSH_FXF_READ, NULL, NULL); - g_data_output_stream_put_uint32 (commands[1], 0, NULL, NULL); + commands[1].connection = &op_backend->command_connection; + commands[1].cmd = new_command_stream (op_backend, SSH_FXP_OPEN); + put_string (commands[1].cmd, source); + g_data_output_stream_put_uint32 (commands[1].cmd, SSH_FXF_READ, NULL, NULL); + g_data_output_stream_put_uint32 (commands[1].cmd, 0, NULL, NULL); - queue_command_streams_and_free (&op_backend->command_connection, - commands, 2, + queue_command_streams_and_free (commands, 2, pull_open_reply, G_VFS_JOB(job), handle); |