Hi,
bugfix update to 4.16.1 released on late January.
Comments ? Ok ?
Cheers
Giovanni
Index: Makefile
===================================================================
RCS file: /var/cvs/ports/x11/i3/Makefile,v
retrieving revision 1.115
diff -u -p -r1.115 Makefile
--- Makefile 18 Jan 2019 11:34:20 -0000 1.115
+++ Makefile 9 Mar 2019 13:08:55 -0000
@@ -2,8 +2,7 @@
COMMENT = improved dynamic tiling window manager
-DISTNAME = i3-4.16
-REVISION = 0
+DISTNAME = i3-4.16.1
CATEGORIES = x11
Index: distinfo
===================================================================
RCS file: /var/cvs/ports/x11/i3/distinfo,v
retrieving revision 1.30
diff -u -p -r1.30 distinfo
--- distinfo 13 Jan 2019 12:48:10 -0000 1.30
+++ distinfo 9 Mar 2019 13:09:04 -0000
@@ -1,2 +1,2 @@
-SHA256 (i3-4.16.tar.bz2) = zGCl9RjF43tBQ7ZEqEC7KtKmPqencZVMMyzVY322VbQ=
-SIZE (i3-4.16.tar.bz2) = 1213251
+SHA256 (i3-4.16.1.tar.bz2) = q2XCXAasvcZ8uj/yPiqC6heRHe9l9P0CALtvk4I3hXY=
+SIZE (i3-4.16.1.tar.bz2) = 1211532
Index: patches/patch-docs_ipc
===================================================================
RCS file: patches/patch-docs_ipc
diff -N patches/patch-docs_ipc
--- patches/patch-docs_ipc 18 Jan 2019 11:34:20 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,20 +0,0 @@
-$OpenBSD: patch-docs_ipc,v 1.1 2019/01/18 11:34:20 giovanni Exp $
-
-Index: docs/ipc
---- docs/ipc.orig
-+++ docs/ipc
-@@ -693,14 +693,6 @@ program does not want to cope which such kinds of race
- event based library may not have a problem here), I suggest you create a
- separate connection to receive events.
-
--If an event message needs to be sent and the socket is not writeable (write
--returns EAGAIN, happens when the socket doesn't have enough buffer space for
--writing new data) then i3 uses a queue system to store outgoing messages for
--each client. This is combined with a timer: if the message queue for a client
is
--not empty and no data where successfully written in the past 10 seconds, the
--connection is killed. Practically, this means that your client should try to
--always read events from the socket to avoid having its connection closed.
--
- === Subscribing to events
-
- By sending a message of type SUBSCRIBE with a JSON-encoded array as payload
Index: patches/patch-include_config_directives_h
===================================================================
RCS file: patches/patch-include_config_directives_h
diff -N patches/patch-include_config_directives_h
--- patches/patch-include_config_directives_h 18 Jan 2019 11:34:20 -0000
1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,13 +0,0 @@
-$OpenBSD: patch-include_config_directives_h,v 1.1 2019/01/18 11:34:20 giovanni
Exp $
-
-Index: include/config_directives.h
---- include/config_directives.h.orig
-+++ include/config_directives.h
-@@ -63,7 +63,6 @@ CFGFUN(assign_output, const char *output);
- CFGFUN(assign, const char *workspace, bool is_number);
- CFGFUN(no_focus);
- CFGFUN(ipc_socket, const char *path);
--CFGFUN(ipc_kill_timeout, const long timeout_ms);
- CFGFUN(restart_state, const char *path);
- CFGFUN(popup_during_fullscreen, const char *value);
- CFGFUN(color, const char *colorclass, const char *border, const char
*background, const char *text, const char *indicator, const char *child_border);
Index: patches/patch-include_ipc_h
===================================================================
RCS file: patches/patch-include_ipc_h
diff -N patches/patch-include_ipc_h
--- patches/patch-include_ipc_h 18 Jan 2019 11:57:36 -0000 1.5
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,27 +0,0 @@
-$OpenBSD: patch-include_ipc_h,v 1.5 2019/01/18 11:57:36 giovanni Exp $
-
-Index: include/ipc.h
---- include/ipc.h.orig
-+++ include/ipc.h
-@@ -35,11 +35,6 @@ typedef struct ipc_client {
- * event has been sent by i3. */
- bool first_tick_sent;
-
-- struct ev_io *callback;
-- struct ev_timer *timeout;
-- uint8_t *buffer;
-- size_t buffer_size;
--
- TAILQ_ENTRY(ipc_client)
- clients;
- } ipc_client;
-@@ -129,9 +124,3 @@ void ipc_send_barconfig_update_event(Barconfig *barcon
- * For the binding events, we send the serialized binding struct.
- */
- void ipc_send_binding_event(const char *event_type, Binding *bind);
--
--/**
-- * Set the maximum duration that we allow for a connection with an
unwriteable
-- * socket.
-- */
--void ipc_set_kill_timeout(ev_tstamp new);
Index: patches/patch-include_libi3_h
===================================================================
RCS file: patches/patch-include_libi3_h
diff -N patches/patch-include_libi3_h
--- patches/patch-include_libi3_h 18 Jan 2019 11:57:36 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,20 +0,0 @@
-$OpenBSD: patch-include_libi3_h,v 1.3 2019/01/18 11:57:36 giovanni Exp $
-
-Index: include/libi3.h
---- include/libi3.h.orig
-+++ include/libi3.h
-@@ -167,14 +167,6 @@ int sasprintf(char **strp, const char *fmt, ...);
- ssize_t writeall(int fd, const void *buf, size_t count);
-
- /**
-- * Like writeall, but instead of retrying upon EAGAIN (returned when a write
-- * would block), the function stops and returns the total number of bytes
-- * written so far.
-- *
-- */
--ssize_t writeall_nonblock(int fd, const void *buf, size_t count);
--
--/**
- * Safe-wrapper around writeall which exits if it returns -1 (meaning that
- * write failed)
- *
Index: patches/patch-libi3_safewrappers_c
===================================================================
RCS file: patches/patch-libi3_safewrappers_c
diff -N patches/patch-libi3_safewrappers_c
--- patches/patch-libi3_safewrappers_c 18 Jan 2019 11:57:36 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,43 +0,0 @@
-$OpenBSD: patch-libi3_safewrappers_c,v 1.1 2019/01/18 11:57:36 giovanni Exp $
-
-Index: libi3/safewrappers.c
---- libi3/safewrappers.c.orig
-+++ libi3/safewrappers.c
-@@ -68,9 +68,10 @@ int sasprintf(char **strp, const char *fmt, ...) {
-
- ssize_t writeall(int fd, const void *buf, size_t count) {
- size_t written = 0;
-+ ssize_t n = 0;
-
- while (written < count) {
-- const ssize_t n = write(fd, ((char *)buf) + written, count - written);
-+ n = write(fd, buf + written, count - written);
- if (n == -1) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
-@@ -79,25 +80,6 @@ ssize_t writeall(int fd, const void *buf, size_t count
- written += (size_t)n;
- }
-
-- return written;
--}
--
--ssize_t writeall_nonblock(int fd, const void *buf, size_t count) {
-- size_t written = 0;
--
-- while (written < count) {
-- const ssize_t n = write(fd, ((char *)buf) + written, count - written);
-- if (n == -1) {
-- if (errno == EAGAIN) {
-- return written;
-- } else if (errno == EINTR) {
-- continue;
-- } else {
-- return n;
-- }
-- }
-- written += (size_t)n;
-- }
- return written;
- }
-
Index: patches/patch-src_ipc_c
===================================================================
RCS file: patches/patch-src_ipc_c
diff -N patches/patch-src_ipc_c
--- patches/patch-src_ipc_c 18 Jan 2019 11:57:36 -0000 1.18
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,209 +0,0 @@
-$OpenBSD: patch-src_ipc_c,v 1.18 2019/01/18 11:57:36 giovanni Exp $
-
-Index: src/ipc.c
---- src/ipc.c.orig
-+++ src/ipc.c
-@@ -38,38 +38,8 @@ static void set_nonblock(int sockfd) {
- err(-1, "Could not set O_NONBLOCK");
- }
-
--/*
-- * Given a message and a message type, create the corresponding header, merge
it
-- * with the message and append it to the given client's output buffer.
-- *
-- */
--static void append_payload(ipc_client *client, uint32_t message_type, const
char *payload) {
-- const size_t size = strlen(payload);
-- const i3_ipc_header_t header = {
-- .magic = {'i', '3', '-', 'i', 'p', 'c'},
-- .size = size,
-- .type = message_type};
-- const size_t header_size = sizeof(i3_ipc_header_t);
-- const size_t message_size = header_size + size;
--
-- client->buffer = srealloc(client->buffer, client->buffer_size +
message_size);
-- memcpy(client->buffer + client->buffer_size, ((void *)&header),
header_size);
-- memcpy(client->buffer + client->buffer_size + header_size, payload, size);
-- client->buffer_size += message_size;
--}
--
- static void free_ipc_client(ipc_client *client) {
- close(client->fd);
--
-- ev_io_stop(main_loop, client->callback);
-- FREE(client->callback);
-- if (client->timeout) {
-- ev_timer_stop(main_loop, client->timeout);
-- FREE(client->timeout);
-- }
--
-- free(client->buffer);
--
- for (int i = 0; i < client->num_events; i++) {
- free(client->events[i]);
- }
-@@ -78,69 +48,7 @@ static void free_ipc_client(ipc_client *client) {
- free(client);
- }
-
--static void ipc_client_timeout(EV_P_ ev_timer *w, int revents);
--static void ipc_socket_writeable_cb(EV_P_ struct ev_io *w, int revents);
--
--static ev_tstamp kill_timeout = 10.0;
--
--void ipc_set_kill_timeout(ev_tstamp new) {
-- kill_timeout = new;
--}
--
- /*
-- * Try to write the contents of the pending buffer to the client's
subscription
-- * socket. Will set, reset or clear the timeout and io callbacks depending on
-- * the result of the write operation.
-- *
-- */
--static void ipc_push_pending(ipc_client *client) {
-- const ssize_t result = writeall_nonblock(client->fd, client->buffer,
client->buffer_size);
-- if (result < 0) {
-- return;
-- }
--
-- if ((size_t)result == client->buffer_size) {
-- /* Everything was written successfully: clear the timer and stop the
io
-- * callback. */
-- FREE(client->buffer);
-- client->buffer_size = 0;
-- if (client->timeout) {
-- ev_timer_stop(main_loop, client->timeout);
-- FREE(client->timeout);
-- }
-- ev_io_stop(main_loop, client->callback);
-- return;
-- }
--
-- /* Otherwise, make sure that the io callback is enabled and create a new
-- * timer if needed. */
-- ev_io_start(main_loop, client->callback);
--
-- if (!client->timeout) {
-- struct ev_timer *timeout = scalloc(1, sizeof(struct ev_timer));
-- ev_timer_init(timeout, ipc_client_timeout, kill_timeout, 0.);
-- timeout->data = client;
-- client->timeout = timeout;
-- ev_set_priority(timeout, EV_MINPRI);
-- ev_timer_start(main_loop, client->timeout);
-- } else if (result > 0) {
-- /* Keep the old timeout when nothing is written. Otherwise, we would
-- * keep a dead connection by continuously renewing its timeouts. */
-- ev_timer_stop(main_loop, client->timeout);
-- ev_timer_set(client->timeout, kill_timeout, 0.0);
-- ev_timer_start(main_loop, client->timeout);
-- }
-- if (result == 0) {
-- return;
-- }
--
-- /* Shift the buffer to the left and reduce the allocated space. */
-- client->buffer_size -= (size_t)result;
-- memmove(client->buffer, client->buffer + result, client->buffer_size);
-- client->buffer = srealloc(client->buffer, client->buffer_size);
--}
--
--/*
- * Sends the specified event to all IPC clients which are currently connected
- * and subscribed to this kind of event.
- *
-@@ -159,11 +67,7 @@ void ipc_send_event(const char *event, uint32_t messag
- if (!interested)
- continue;
-
-- const bool push_now = (current->buffer_size == 0);
-- append_payload(current, message_type, payload);
-- if (push_now) {
-- ipc_push_pending(current);
-- }
-+ ipc_send_message(current->fd, strlen(payload), message_type, (const
uint8_t *)payload);
- }
- }
-
-@@ -1382,62 +1286,6 @@ static void ipc_receive_message(EV_P_ struct ev_io *w,
- FREE(message);
- }
-
--static void ipc_client_timeout(EV_P_ ev_timer *w, int revents) {
-- /* No need to be polite and check for writeability, the other callback
would
-- * have been called by now. */
-- ipc_client *client = (ipc_client *)w->data;
--
-- char *cmdline = NULL;
--#if defined(__linux__) && defined(SO_PEERCRED)
-- struct ucred peercred;
-- socklen_t so_len = sizeof(peercred);
-- if (getsockopt(client->fd, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len)
!= 0) {
-- goto end;
-- }
-- char *exepath;
-- sasprintf(&exepath, "/proc/%d/cmdline", peercred.pid);
--
-- int fd = open(exepath, O_RDONLY);
-- free(exepath);
-- if (fd == -1) {
-- goto end;
-- }
-- char buf[512] = {'\0'}; /* cut off cmdline for the error message. */
-- const ssize_t n = read(fd, buf, sizeof(buf));
-- close(fd);
-- if (n < 0) {
-- goto end;
-- }
-- for (char *walk = buf; walk < buf + n - 1; walk++) {
-- if (*walk == '\0') {
-- *walk = ' ';
-- }
-- }
-- cmdline = buf;
--
-- if (cmdline) {
-- ELOG("client %p with pid %d and cmdline '%s' on fd %d timed out,
killing\n", client, peercred.pid, cmdline, client->fd);
-- }
--
--end:
--#endif
-- if (!cmdline) {
-- ELOG("client %p on fd %d timed out, killing\n", client, client->fd);
-- }
--
-- free_ipc_client(client);
--}
--
--static void ipc_socket_writeable_cb(EV_P_ ev_io *w, int revents) {
-- DLOG("fd %d writeable\n", w->fd);
-- ipc_client *client = (ipc_client *)w->data;
--
-- /* If this callback is called then there should be a corresponding active
-- * timer. */
-- assert(client->timeout != NULL);
-- ipc_push_pending(client);
--}
--
- /*
- * Handler for activity on the listening socket, meaning that a new client
- * has just connected and we should accept() him. Sets up the event handler
-@@ -1466,16 +1314,11 @@ void ipc_new_client(EV_P_ struct ev_io *w, int revents
- ev_io_init(package, ipc_receive_message, client, EV_READ);
- ev_io_start(EV_A_ package);
-
-- ipc_client *new = scalloc(1, sizeof(ipc_client));
--
-- package = scalloc(1, sizeof(struct ev_io));
-- package->data = new;
-- ev_io_init(package, ipc_socket_writeable_cb, client, EV_WRITE);
--
- DLOG("IPC: new client connected on fd %d\n", w->fd);
-
-+
-+ ipc_client *new = scalloc(1, sizeof(ipc_client));
- new->fd = client;
-- new->callback = package;
-
- TAILQ_INSERT_TAIL(&all_clients, new, clients);
- }
Index: patches/patch-testcases_t_298-ipc-misbehaving-connection_t
===================================================================
RCS file: patches/patch-testcases_t_298-ipc-misbehaving-connection_t
diff -N patches/patch-testcases_t_298-ipc-misbehaving-connection_t
--- patches/patch-testcases_t_298-ipc-misbehaving-connection_t 18 Jan 2019
11:57:36 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,75 +0,0 @@
-$OpenBSD: patch-testcases_t_298-ipc-misbehaving-connection_t,v 1.1 2019/01/18
11:57:36 giovanni Exp $
-
-Index: testcases/t/298-ipc-misbehaving-connection.t
---- testcases/t/298-ipc-misbehaving-connection.t.orig
-+++ testcases/t/298-ipc-misbehaving-connection.t
-@@ -1,69 +0,0 @@
--#!perl
--# vim:ts=4:sw=4:expandtab
--#
--# Please read the following documents before working on tests:
--# • https://build.i3wm.org/docs/testsuite.html
--# (or docs/testsuite)
--#
--# • https://build.i3wm.org/docs/lib-i3test.html
--# (alternatively: perldoc ./testcases/lib/i3test.pm)
--#
--# • https://build.i3wm.org/docs/ipc.html
--# (or docs/ipc)
--#
--# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
--# (unless you are already familiar with Perl)
--#
--# Test that i3 will not hang if a connected client stops reading from its
--# subscription socket and that the client is killed after a delay.
--# Ticket: #2999
--# Bug still in: 4.15-180-g715cea61
--use i3test i3_config => <<EOT;
--# i3 config file (v4)
--font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
--# Set the timeout to 500ms to reduce the duration of this test.
--ipc_kill_timeout 500
--EOT
--
--# Manually connect to i3 so that we can choose to not read events
--use IO::Socket::UNIX;
--my $sock = IO::Socket::UNIX->new(Peer => get_socket_path());
--my $magic = "i3-ipc";
--my $payload = '["workspace"]';
--my $message = $magic . pack("LL", length($payload), 2) . $payload;
--print $sock $message;
--
--# Constantly switch between 2 workspaces to generate events.
--fresh_workspace;
--open_window;
--fresh_workspace;
--open_window;
--
--eval {
-- local $SIG{ALRM} = sub { die "Timeout\n" };
-- # 500 is an arbitrarily large number to make sure that the socket becomes
-- # non-writeable.
-- for (my $i = 0; $i < 500; $i++) {
-- alarm 1;
-- cmd 'workspace back_and_forth';
-- alarm 0;
-- }
--};
--ok(!$@, 'i3 didn\'t hang');
--
--# Wait for connection timeout
--sleep 1;
--
--use IO::Select;
--my $s = IO::Select->new($sock);
--my $reached_eof = 0;
--while ($s->can_read(0.05)) {
-- if (read($sock, my $buffer, 100) == 0) {
-- $reached_eof = 1;
-- last;
-- }
--}
--ok($reached_eof, 'socket connection closed');
--
--close $sock;
--done_testing;