channel_write: move some logic to _libssh2_channel_write
Some checks are better done in _libssh2_channel_write just once per write instead of in channel_write() since the looping will call the latter function multiple times per _libssh2_channel_write() invoke.
This commit is contained in:
parent
7899d28ecb
commit
aff9c825c8
@ -1994,27 +1994,6 @@ channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
buflen = 32700;
|
buflen = 32700;
|
||||||
|
|
||||||
if (channel->write_state == libssh2_NB_state_idle) {
|
if (channel->write_state == libssh2_NB_state_idle) {
|
||||||
_libssh2_debug(session, LIBSSH2_TRACE_CONN,
|
|
||||||
"Writing %d bytes on channel %lu/%lu, stream #%d",
|
|
||||||
(int) buflen, channel->local.id, channel->remote.id,
|
|
||||||
stream_id);
|
|
||||||
|
|
||||||
if (channel->local.close) {
|
|
||||||
return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_CLOSED,
|
|
||||||
"We've already closed this channel");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (channel->local.eof) {
|
|
||||||
return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_EOF_SENT,
|
|
||||||
"EOF has already been received, "
|
|
||||||
"data might be ignored");
|
|
||||||
}
|
|
||||||
|
|
||||||
channel->write_state = libssh2_NB_state_allocated;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (channel->write_state == libssh2_NB_state_allocated) {
|
|
||||||
unsigned char *s = channel->write_packet;
|
unsigned char *s = channel->write_packet;
|
||||||
|
|
||||||
/* drain the incoming flow first */
|
/* drain the incoming flow first */
|
||||||
@ -2022,11 +2001,9 @@ channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
rc = _libssh2_transport_read(session);
|
rc = _libssh2_transport_read(session);
|
||||||
while (rc > 0);
|
while (rc > 0);
|
||||||
|
|
||||||
if(channel->local.window_size <= 0) {
|
if(channel->local.window_size <= 0)
|
||||||
/* there's no room for data so we stop */
|
/* there's no room for data so we stop */
|
||||||
channel->write_state = libssh2_NB_state_idle;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
channel->write_bufwrite = buflen;
|
channel->write_bufwrite = buflen;
|
||||||
|
|
||||||
@ -2142,6 +2119,22 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
channel->transport_buf = NULL;
|
channel->transport_buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_libssh2_debug(channel->session, LIBSSH2_TRACE_CONN,
|
||||||
|
"Writing %d bytes on channel %lu/%lu, stream #%d",
|
||||||
|
(int) buflen, channel->local.id, channel->remote.id,
|
||||||
|
stream_id);
|
||||||
|
|
||||||
|
if (channel->local.close) {
|
||||||
|
return _libssh2_error(channel->session, LIBSSH2_ERROR_CHANNEL_CLOSED,
|
||||||
|
"We've already closed this channel");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel->local.eof) {
|
||||||
|
return _libssh2_error(channel->session, LIBSSH2_ERROR_CHANNEL_EOF_SENT,
|
||||||
|
"EOF has already been received, "
|
||||||
|
"data might be ignored");
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
rc = channel_write(channel, stream_id, buf, buflen);
|
rc = channel_write(channel, stream_id, buf, buflen);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user