Commit 0963716b by Carlos Martín Nieto

ssh: libssh2_channel_write() behaves like send()

When the stream writing function was written, it assume that
libssh2_channel_write() would always write all of the data to the
wire. This is only true for the first 32k of data, which it tries to
fit into one ssh packet.

Since it can perform short writes, call it in a loop like we do for
send(), advancing the buffer offset.
parent 28f087c8
...@@ -132,11 +132,22 @@ static int ssh_stream_write( ...@@ -132,11 +132,22 @@ static int ssh_stream_write(
size_t len) size_t len)
{ {
ssh_stream *s = (ssh_stream *)stream; ssh_stream *s = (ssh_stream *)stream;
size_t off = 0;
ssize_t ret = 0;
if (!s->sent_command && send_command(s) < 0) if (!s->sent_command && send_command(s) < 0)
return -1; return -1;
if (libssh2_channel_write(s->channel, buffer, len) < LIBSSH2_ERROR_NONE) { do {
ret = libssh2_channel_write(s->channel, buffer + off, len - off);
if (ret < 0)
break;
off += ret;
} while (off < len);
if (ret < 0) {
ssh_error(s->session, "SSH could not write data"); ssh_error(s->session, "SSH could not write data");
return -1; return -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment