summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-07-02 14:01:22 +0200
committerLouis Burda <quent.burda@gmail.com>2023-06-23 00:35:52 +0200
commit26658a5e72e1443e36b85877d8b133cf0bfaa1a9 (patch)
treea1f6b51b6805c2d250fb454602351fff595509d6
parent4b2f75f2a045a29d02f15985a2180fd86b1e4810 (diff)
downloadwmsl-26658a5e72e1443e36b85877d8b133cf0bfaa1a9.tar.gz
wmsl-26658a5e72e1443e36b85877d8b133cf0bfaa1a9.zip
Handle interrupting of select through SIGALRM
-rw-r--r--wmsl.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/wmsl.c b/wmsl.c
index 0fff248..f05292d 100644
--- 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);
}