Commit Diff


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 <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -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);