Mercurial > dropbear
diff packet.c @ 529:da6340a60039
- Try to write out as much as we can
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 26 Feb 2009 12:18:11 +0000 |
parents | a3748e54273c |
children | 22a0d8355c2c 164b7c2cd5df |
line wrap: on
line diff
--- a/packet.c Wed Nov 12 13:13:00 2008 +0000 +++ b/packet.c Thu Feb 26 12:18:11 2009 +0000 @@ -46,14 +46,16 @@ static void buf_compress(buffer * dest, buffer * src, unsigned int len); #endif -/* non-blocking function writing out a current encrypted packet */ -void write_packet() { +/* non-blocking function writing out a current encrypted packet. Returns + * DROPBEAR_SUCCESS if entire packet was written, DROPBEAR_FAILURE + * otherwise */ +static int write_packet() { int len, written; + int ret = DROPBEAR_FAILURE; buffer * writebuf = NULL; TRACE(("enter write_packet")) - dropbear_assert(!isempty(&ses.writequeue)); /* Get the next buffer in the queue of encrypted packets to write*/ writebuf = (buffer*)examine(&ses.writequeue); @@ -84,12 +86,19 @@ dequeue(&ses.writequeue); buf_free(writebuf); writebuf = NULL; + ret = DROPBEAR_SUCCESS; } else { /* More packet left to write, leave it in the queue for later */ buf_incrpos(writebuf, written); } TRACE(("leave write_packet")) + return ret; +} + +void write_packets() { + /* keep writing packets while we can. */ + while (!isempty(&ses.writequeue) && write_packet() == DROPBEAR_SUCCESS) {} } /* Non-blocking function reading available portion of a packet into the