changeset 1518:713b504dc577

Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
author Michael Pavone <pavone@retrodev.com>
date Wed, 31 Jan 2018 21:59:08 -0800
parents 9136b7ea1ccb
children 1f745318f10a
files megawifi.c
diffstat 1 files changed, 7 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/megawifi.c	Mon Jan 22 22:03:55 2018 -0800
+++ b/megawifi.c	Wed Jan 31 21:59:08 2018 -0800
@@ -19,6 +19,7 @@
 };
 #define STX 0x7E
 #define ETX 0x7E
+#define MAX_RECV_SIZE 1440
 
 #define E(N) N
 enum {
@@ -130,12 +131,11 @@
 			mw->channel_flags |= 1 << (channel + 1);
 		}
 	} else if (mw->channel_state[channel] == 2 && mw->receive_bytes < sizeof(mw->receive_buffer) - 4) {
-		int bytes = recv(
-			mw->sock_fds[channel],
-			mw->receive_buffer + mw->receive_bytes + 3,
-			sizeof(mw->receive_buffer) - 4 - mw->receive_bytes,
-			0
-		);
+		size_t max = sizeof(mw->receive_buffer) - 4 - mw->receive_bytes;
+		if (max > MAX_RECV_SIZE) {
+			max = MAX_RECV_SIZE;
+		}
+		int bytes = recv(mw->sock_fds[channel], mw->receive_buffer + mw->receive_bytes + 3, max, 0);
 		if (bytes > 0) {
 			mw_putc(mw, STX);
 			mw_putc(mw, bytes >> 8 | (channel+1) << 4);
@@ -315,7 +315,7 @@
 		}
 	} else if (mw->sock_fds[mw->transmit_channel - 1] >= 0 && mw->channel_state[mw->transmit_channel - 1] == 2) {
 		uint8_t channel = mw->transmit_channel - 1;
-		int sent = send(mw->sock_fds[channel], mw->transmit_buffer, mw->transmit_bytes, 0);
+		int sent = send(mw->sock_fds[channel], mw->transmit_buffer, mw->transmit_bytes, MSG_NOSIGNAL);
 		if (sent < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
 			close(mw->sock_fds[channel]);
 			mw->sock_fds[channel] = -1;