Test for EAGAIN too

This commit is contained in:
Matt Johnston 2014-08-06 21:55:43 +08:00
parent 0e7409c7ff
commit 628a3f5cca

View File

@ -93,9 +93,12 @@ void write_packet() {
iov[i].iov_base = buf_getptr(writebuf, len); iov[i].iov_base = buf_getptr(writebuf, len);
iov[i].iov_len = 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); written = writev(ses.sock_out, iov, iov_max_count);
if (written < 0) { if (written < 0) {
if (errno == EINTR) { if (errno == EINTR || errno == EAGAIN) {
m_free(iov); m_free(iov);
TRACE2(("leave write_packet: EINTR")) TRACE2(("leave write_packet: EINTR"))
return; return;
@ -136,7 +139,7 @@ void write_packet() {
written = write(ses.sock_out, buf_getptr(writebuf, len), len); written = write(ses.sock_out, buf_getptr(writebuf, len), len);
if (written < 0) { if (written < 0) {
if (errno == EINTR) { if (errno == EINTR || errno == EAGAIN) {
TRACE2(("leave writepacket: EINTR")) TRACE2(("leave writepacket: EINTR"))
return; return;
} else { } else {
@ -255,7 +258,7 @@ static int read_packet_init() {
ses.remoteclosed(); ses.remoteclosed();
} }
if (slen < 0) { if (slen < 0) {
if (errno == EINTR) { if (errno == EINTR || errno == EAGAIN) {
TRACE2(("leave read_packet_init: EINTR")) TRACE2(("leave read_packet_init: EINTR"))
return DROPBEAR_FAILURE; return DROPBEAR_FAILURE;
} }