diff options
author | Matt Johnston <matt@ucc.asn.au> | 2014-08-06 21:55:43 +0800 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2014-08-06 21:55:43 +0800 |
commit | 628a3f5ccad5e92116934ad31d224b018dcad15f (patch) | |
tree | 82eb45df6e0f89c7c0b8ac434c7ab93ba17ce4e7 /packet.c | |
parent | 0e7409c7ff6fc760018fce3d5e8b72247bf782b5 (diff) |
Test for EAGAIN too
Diffstat (limited to 'packet.c')
-rw-r--r-- | packet.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -93,9 +93,12 @@ void write_packet() { iov[i].iov_base = buf_getptr(writebuf, len); iov[i].iov_len = len; } + /* This may return EAGAIN. The main loop sometimes + calls write_packet() without bothering to test with select() since + it's likely to be necessary */ written = writev(ses.sock_out, iov, iov_max_count); if (written < 0) { - if (errno == EINTR) { + if (errno == EINTR || errno == EAGAIN) { m_free(iov); TRACE2(("leave write_packet: EINTR")) return; @@ -136,7 +139,7 @@ void write_packet() { written = write(ses.sock_out, buf_getptr(writebuf, len), len); if (written < 0) { - if (errno == EINTR) { + if (errno == EINTR || errno == EAGAIN) { TRACE2(("leave writepacket: EINTR")) return; } else { @@ -255,7 +258,7 @@ static int read_packet_init() { ses.remoteclosed(); } if (slen < 0) { - if (errno == EINTR) { + if (errno == EINTR || errno == EAGAIN) { TRACE2(("leave read_packet_init: EINTR")) return DROPBEAR_FAILURE; } |