commit 130676c5756bf721a759241c354cbf4518c19a76 from: Martijn van Duren date: Mon Nov 2 19:57:59 2026 UTC Make sure output and error buffer are flushed commit - 2591f89b08653508cf6553ae7a7595d86133dc6e commit + 130676c5756bf721a759241c354cbf4518c19a76 blob - 8c84676826c361c2ec3c4f3a1607c78c8756855d blob + 6ef826b0e9f5c884304b6f5ae2c4a089c654bcc9 --- main.c +++ main.c @@ -16,6 +16,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include #include @@ -392,6 +393,7 @@ extends_sigchld(int fd, short event, void *arg) int st, code; pid_t pid; struct command *cmd; + int avail; if ((pid = wait(&st)) == -1) fatal("wait"); @@ -401,6 +403,30 @@ extends_sigchld(int fd, short event, void *arg) break; } + do { + if (cmd->outfd == -1) + break; + if (ioctl(cmd->outfd, FIONREAD, &avail) == -1) { + log_warn("%s: ioctl(FIONREAD)", cmd->token); + avail = 0; + } + if (avail > 0) + extends_cmd_out(cmd->outfd, EV_READ, cmd); + } while (avail > 0); + do { + if (cmd->errfd == -1) + break; + if (ioctl(cmd->errfd, FIONREAD, &avail) == -1) { + log_warn("%s: ioctl(FIONREAD)", cmd->token); + avail = 0; + } + if (avail > 0) + extends_cmd_err(cmd->errfd, EV_READ, cmd); + } while (avail > 0); + + if (cmd->errstr[0] != '\0') + log_warnx("%s: %s", cmd->token, cmd->errstr); + if (cmd->result == 0) { if (WIFCONTINUED(st)) return; @@ -418,8 +444,6 @@ extends_sigchld(int fd, short event, void *arg) if (imsg_compose(&pc, IMSG_FAIL, cmd->id, 0, -1, NULL, 0) == -1) fatal("imsg_compose"); } - if (cmd->errstr[0] != '\0') - log_warnx("%s: %s", cmd->token, cmd->errstr); cmd->errstr[0] = '\0'; event_del(&cmd->inev); event_del(&cmd->outev);