_libssh2_channel_write: general code cleanup
simplified the function and removed some unused struct fields
This commit is contained in:
@@ -1994,8 +1994,6 @@ _libssh2_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) {
|
||||||
channel->write_bufwrote = 0;
|
|
||||||
|
|
||||||
_libssh2_debug(session, LIBSSH2_TRACE_CONN,
|
_libssh2_debug(session, LIBSSH2_TRACE_CONN,
|
||||||
"Writing %d bytes on channel %lu/%lu, stream #%d",
|
"Writing %d bytes on channel %lu/%lu, stream #%d",
|
||||||
(int) buflen, channel->local.id, channel->remote.id,
|
(int) buflen, channel->local.id, channel->remote.id,
|
||||||
@@ -2012,18 +2010,12 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
"data might be ignored");
|
"data might be ignored");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* [13] 9 = packet_type(1) + channelno(4) [ + streamid(4) ] +
|
|
||||||
buflen(4) */
|
|
||||||
channel->write_packet_len = (stream_id ? 13 : 9);
|
|
||||||
channel->write_state = libssh2_NB_state_allocated;
|
channel->write_state = libssh2_NB_state_allocated;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deduct the amount that has already been sent, and set buf accordingly. */
|
|
||||||
buflen -= channel->write_bufwrote;
|
|
||||||
buf += channel->write_bufwrote;
|
|
||||||
|
|
||||||
while (buflen > 0) {
|
|
||||||
if (channel->write_state == libssh2_NB_state_allocated) {
|
if (channel->write_state == libssh2_NB_state_allocated) {
|
||||||
|
unsigned char *s = channel->write_packet;
|
||||||
|
|
||||||
/* drain the incoming flow first */
|
/* drain the incoming flow first */
|
||||||
do
|
do
|
||||||
@@ -2031,19 +2023,18 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
while (rc > 0);
|
while (rc > 0);
|
||||||
|
|
||||||
if(channel->local.window_size <= 0) {
|
if(channel->local.window_size <= 0) {
|
||||||
/* there's no more room for data so we stop sending now */
|
/* there's no room for data so we stop */
|
||||||
break;
|
channel->write_state = libssh2_NB_state_idle;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
channel->write_bufwrite = buflen;
|
channel->write_bufwrite = buflen;
|
||||||
channel->write_s = channel->write_packet;
|
|
||||||
|
|
||||||
*(channel->write_s++) =
|
*(s++) = stream_id ? SSH_MSG_CHANNEL_EXTENDED_DATA :
|
||||||
stream_id ? SSH_MSG_CHANNEL_EXTENDED_DATA :
|
|
||||||
SSH_MSG_CHANNEL_DATA;
|
SSH_MSG_CHANNEL_DATA;
|
||||||
_libssh2_store_u32(&channel->write_s, channel->remote.id);
|
_libssh2_store_u32(&s, channel->remote.id);
|
||||||
if (stream_id)
|
if (stream_id)
|
||||||
_libssh2_store_u32(&channel->write_s, stream_id);
|
_libssh2_store_u32(&s, stream_id);
|
||||||
|
|
||||||
/* Don't exceed the remote end's limits */
|
/* Don't exceed the remote end's limits */
|
||||||
/* REMEMBER local means local as the SOURCE of the data */
|
/* REMEMBER local means local as the SOURCE of the data */
|
||||||
@@ -2065,7 +2056,8 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
}
|
}
|
||||||
/* store the size here only, the buffer is passed in as-is to
|
/* store the size here only, the buffer is passed in as-is to
|
||||||
_libssh2_transport_send() */
|
_libssh2_transport_send() */
|
||||||
_libssh2_store_u32(&channel->write_s, channel->write_bufwrite);
|
_libssh2_store_u32(&s, channel->write_bufwrite);
|
||||||
|
channel->write_packet_len = s - channel->write_packet;
|
||||||
|
|
||||||
_libssh2_debug(session, LIBSSH2_TRACE_CONN,
|
_libssh2_debug(session, LIBSSH2_TRACE_CONN,
|
||||||
"Sending %d bytes on channel %lu/%lu, stream_id=%d",
|
"Sending %d bytes on channel %lu/%lu, stream_id=%d",
|
||||||
@@ -2077,8 +2069,7 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
|
|
||||||
if (channel->write_state == libssh2_NB_state_created) {
|
if (channel->write_state == libssh2_NB_state_created) {
|
||||||
rc = _libssh2_transport_send(session, channel->write_packet,
|
rc = _libssh2_transport_send(session, channel->write_packet,
|
||||||
channel->write_s -
|
channel->write_packet_len,
|
||||||
channel->write_packet,
|
|
||||||
buf, channel->write_bufwrite);
|
buf, channel->write_bufwrite);
|
||||||
if (rc == LIBSSH2_ERROR_EAGAIN) {
|
if (rc == LIBSSH2_ERROR_EAGAIN) {
|
||||||
return _libssh2_error(session, rc,
|
return _libssh2_error(session, rc,
|
||||||
@@ -2103,13 +2094,13 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id,
|
|||||||
both about sent data as well as EAGAIN. So, by returning short
|
both about sent data as well as EAGAIN. So, by returning short
|
||||||
now, the caller will call this function again with new data to
|
now, the caller will call this function again with new data to
|
||||||
send */
|
send */
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
channel->write_state = libssh2_NB_state_idle;
|
channel->write_state = libssh2_NB_state_idle;
|
||||||
|
|
||||||
return wrote;
|
return wrote;
|
||||||
|
}
|
||||||
|
|
||||||
|
return LIBSSH2_ERROR_INVAL; /* reaching this point is really bad */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -398,9 +398,7 @@ struct _LIBSSH2_CHANNEL
|
|||||||
/* State variables used in libssh2_channel_write_ex() */
|
/* State variables used in libssh2_channel_write_ex() */
|
||||||
libssh2_nonblocking_states write_state;
|
libssh2_nonblocking_states write_state;
|
||||||
unsigned char write_packet[13];
|
unsigned char write_packet[13];
|
||||||
unsigned char *write_s;
|
|
||||||
size_t write_packet_len;
|
size_t write_packet_len;
|
||||||
size_t write_bufwrote;
|
|
||||||
size_t write_bufwrite;
|
size_t write_bufwrite;
|
||||||
|
|
||||||
/* State variables used in libssh2_channel_close() */
|
/* State variables used in libssh2_channel_close() */
|
||||||
|
Reference in New Issue
Block a user