summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--event_log.c10
-rw-r--r--util.c5
2 files changed, 14 insertions, 1 deletions
diff --git a/event_log.c b/event_log.c
index 041a736..0ef8baa 100644
--- a/event_log.c
+++ b/event_log.c
@@ -253,12 +253,20 @@ static void flush_socket(void)
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;
}
diff --git a/util.c b/util.c
index 4962b52..1c55e09 100644
--- a/util.c
+++ b/util.c
@@ -726,9 +726,14 @@ int socket_error_is_wouldblock(void)
#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)