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:
M | wmsl.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);
}