summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoss Lagerwall <rosslagerwall@gmail.com>2015-05-25 12:00:06 +0100
committerRoss Lagerwall <rosslagerwall@gmail.com>2015-06-07 16:51:04 +0100
commit9cefe0419fa2d03326313a72700159bc9014116a (patch)
treefbde16b154af15d2a0e13eeb88d9e6872dea3665
parent44a2dfe5bfb2dfbe42387880008887b3a7a3fd64 (diff)
downloadgvfs-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.c59
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);