If a client disconnects while i3 still wants to write the reply, this
could lead to exits of i3 before.
int bytes_to_go = buffer_size;
while (sent_bytes < bytes_to_go) {
int n = write(fd, msg + sent_bytes, bytes_to_go);
- if (n == -1)
- err(EXIT_FAILURE, "write() failed");
+ if (n == -1) {
+ DLOG("write() failed: %s\n", strerror(errno));
+ return;
+ }
sent_bytes += n;
bytes_to_go -= n;
xcb_check_cb(NULL, NULL, 0);
setup_signal_handler();
+
+ /* Ignore SIGPIPE to survive errors when an IPC client disconnects
+ * while we are sending him a message */
+ signal(SIGPIPE, SIG_IGN);
+
/* Ungrab the server to receive events and enter libev’s eventloop */
xcb_ungrab_server(conn);