wmsl

Block-based window manager status line
git clone https://git.sinitax.com/sinitax/wmsl
Log | Files | Refs | README | LICENSE | sfeed.txt

commit 26658a5e72e1443e36b85877d8b133cf0bfaa1a9
parent 4b2f75f2a045a29d02f15985a2180fd86b1e4810
Author: Louis Burda <quent.burda@gmail.com>
Date:   Sat,  2 Jul 2022 14:01:22 +0200

Handle interrupting of select through SIGALRM

Diffstat:
Mwmsl.c | 22+++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/wmsl.c b/wmsl.c @@ -1,7 +1,9 @@ #include <X11/Xlib.h> +#include <sys/wait.h> #include <unistd.h> #include <err.h> +#include <errno.h> #include <signal.h> #include <time.h> #include <math.h> @@ -135,13 +137,13 @@ run_block(const char *cmd, pid_t *pid) if (*pid != 0) { close(output[1]); } else { + signal(SIGINT, NULL); + signal(SIGTERM, NULL); close(0); close(1); dup2(output[1], 1); close(output[0]); close(output[1]); - signal(SIGINT, NULL); - signal(SIGTERM, NULL); execl("/bin/sh", "sh", "-c", cmd, NULL); abort(); } @@ -170,13 +172,15 @@ read_block(int fd, char *buf, ssize_t size) timeout.tv_usec = (1000000000 - ns) / 1000; ret = select(fd + 1, &fdset, NULL, NULL, &timeout); - if (ret <= 0) break; clock_gettime(CLOCK_REALTIME, &stop); ns = (stop.tv_sec - start.tv_sec) * 1000000000; ns += stop.tv_nsec - start.tv_nsec; + if (ret < 0 && errno == EINTR) continue; + if (ret <= 0) break; + nread = read(fd, buf, size); if (nread <= 0) break; @@ -192,7 +196,6 @@ read_block(int fd, char *buf, ssize_t size) return false; } - void update_blocks(void) { @@ -217,22 +220,23 @@ update_blocks(void) fd = run_block(blocks[i].command, &child); memset(tmp_output, 0, sizeof(tmp_output)); - if (read_block(fd, tmp_output, sizeof(tmp_output) -1)) { + if (read_block(fd, tmp_output, sizeof(tmp_output)-1)) { output_len = strlen(tmp_output); + debug("%i: %s\n", i, tmp_output); } else { output_len = 0; + debug("%i: NO OUTPUT\n", i); } - if (output_len != strlen(blocks[i].output) - || strncmp(tmp_output, blocks[i].output, output_len)) { - memcpy(blocks[i].output, tmp_output, output_len); - blocks[i].output[output_len] = '\0'; + if (strcmp(tmp_output, blocks[i].output)) { + strncpy(blocks[i].output, tmp_output, OUTPUTMAX); debug("new output from cmd: %s\n", blocks[i].command); update = true; } kill(child, SIGKILL); close(fd); + waitpid(child, NULL, 0); } else { output_len = strlen(blocks[i].output); }