diff options
| author | Louis Burda <quent.burda@gmail.com> | 2022-07-02 14:01:22 +0200 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2023-06-23 00:35:52 +0200 |
| commit | 26658a5e72e1443e36b85877d8b133cf0bfaa1a9 (patch) | |
| tree | a1f6b51b6805c2d250fb454602351fff595509d6 | |
| parent | 4b2f75f2a045a29d02f15985a2180fd86b1e4810 (diff) | |
| download | wmsl-26658a5e72e1443e36b85877d8b133cf0bfaa1a9.tar.gz wmsl-26658a5e72e1443e36b85877d8b133cf0bfaa1a9.zip | |
Handle interrupting of select through SIGALRM
| -rw-r--r-- | wmsl.c | 22 |
1 files changed, 13 insertions, 9 deletions
@@ -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); } |
