changeset 1973:cd163b230cf9

Fix handling of remote disconnects
author Michael Pavone <pavone@retrodev.com>
date Fri, 08 May 2020 15:17:47 -0700
parents f2d37131840e
children 04b79a725b7f
files event_log.c util.c
diffstat 2 files changed, 14 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/event_log.c	Fri May 08 14:59:49 2020 -0700
+++ b/event_log.c	Fri May 08 15:17:47 2020 -0700
@@ -253,12 +253,20 @@
 			sent = send(remotes[i], remote_send_progress[i], output_stream.next_out - remote_send_progress[i], 0);
 			if (sent >= 0) {
 				remote_send_progress[i] += sent;
-			} else if (socket_error_is_wouldblock()) {
+			} else if (!socket_error_is_wouldblock()) {
 				socket_close(remotes[i]);
 				remotes[i] = remotes[num_remotes-1];
 				remote_send_progress[i] = remote_send_progress[num_remotes-1];
 				remote_needs_state[i] = remote_needs_state[num_remotes-1];
 				num_remotes--;
+				if (!num_remotes) {
+					//last remote disconnected, reset buffers/deflate
+					fully_active = 0;
+					deflateReset(&output_stream);
+					output_stream.next_out = compressed;
+					output_stream.avail_out = compressed_storage;
+					buffer.size = 0;
+				}
 				i--;
 				break;
 			}
--- a/util.c	Fri May 08 14:59:49 2020 -0700
+++ b/util.c	Fri May 08 15:17:47 2020 -0700
@@ -726,9 +726,14 @@
 
 #else
 #include <fcntl.h>
+#include <signal.h>
 
 void socket_init(void)
 {
+	//SIGPIPE on network sockets is not desired
+	//would be better to do this in a more limited way,
+	//but the alternatives are not portable
+	signal(SIGPIPE, SIG_IGN);
 }
 
 int socket_blocking(int sock, int should_block)