On Thu, 11 Aug 2011, Henrik Nordström wrote:
> _libssh2_channel_write() clearly do return 0 immedately if the window
> have collapsed after draining the incoming transport.
>
> if(channel->local.window_size <= 0)
> /* there's no room for data so we stop */
> return 0;
>
>
> I guess it should
> a) Block if not non-blocking.
> b) Return EAGAIN if non-blocking and indicate it needs to read from the
> transport (wait for window update)
I agree.
As it calls _libssh2_transport_read() just before that, I'm thinking that
perhaps we should just make a patch like below. It would work because
_libssh2_transport_read() itself stores the correct bits that the app should
wait for after EAGAIN is returned.
diff --git a/src/channel.c b/src/channel.c
index efb2b48..be6a680 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -2022,7 +2022,7 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int
strea
if(channel->local.window_size <= 0)
/* there's no room for data so we stop */
- return 0;
+ return (rc==LIBSSH2_ERROR_EAGAIN?rc:0);
channel->write_bufwrite = buflen;
-- / daniel.haxx.se
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
Received on 2011-08-11