i3bar: Do not kill watcher on EOF
Patch status: merged
Patch by Tony Crisci
Long description:
Wait for the child process to exit on its own before freeing watcher-related resources. i3bar shows the last received status line until the process exits. Fixes a race condition where the termination signal was sometimes not received to display a meaningful error message.
To apply this patch, use:
curl http://cr.i3wm.org/patch/423/raw.patch | git am
b/i3bar/src/child.c
20 |
@@ -266,6 +266,8 @@ static int stdin_end_array(void *context) { |
21 |
/* |
22 |
* Helper function to read stdin |
23 |
* |
24 |
+ * Returns NULL on EOF. |
25 |
+ * |
26 |
*/ |
27 |
static unsigned char *get_buffer(ev_io *watcher, int *ret_buffer_len) { |
28 |
int fd = watcher->fd; |
29 |
@@ -285,9 +287,7 @@ static unsigned char *get_buffer(ev_io *watcher, int *ret_buffer_len) { |
30 |
exit(EXIT_FAILURE); |
31 |
} |
32 |
if (n == 0) { |
33 |
- /* end of file, kill the watcher */ |
34 |
ELOG("stdin: received EOF\n"); |
35 |
- cleanup(); |
36 |
*ret_buffer_len = -1; |
37 |
return NULL; |
38 |
} |