diff --git a/text-utils/more.c b/text-utils/more.c index 4c22533185b..953e94db10e 100644 --- a/text-utils/more.c +++ b/text-utils/more.c @@ -1350,7 +1350,7 @@ static void read_line(struct more_control *ctl) } /* returns: 0 timeout or nothing; <0 error, >0 success */ -static int more_poll(struct more_control *ctl, int timeout) +static int more_poll(struct more_control *ctl, int timeout, int *stderr_active) { enum { POLLFD_SIGNAL = 0, @@ -1364,6 +1364,9 @@ static int more_poll(struct more_control *ctl, int timeout) }; int has_data = 0; + if (stderr_active) + *stderr_active = 0; + while (!has_data) { int rc; @@ -1430,8 +1433,11 @@ static int more_poll(struct more_control *ctl, int timeout) } /* event on stderr (we reads user commands from stderr!) */ - if (pfd[POLLFD_STDERR].revents) + if (pfd[POLLFD_STDERR].revents) { has_data++; + if (stderr_active) + *stderr_active = 1; + } } return has_data; @@ -1502,7 +1508,7 @@ static void search(struct more_control *ctl, char buf[], int n) } break; } - more_poll(ctl, 0); + more_poll(ctl, 0, NULL); } /* Move ctrl+c signal handling back to more_key_command(). */ signal(SIGINT, SIG_DFL); @@ -1656,7 +1662,7 @@ static int skip_forwards(struct more_control *ctl, int nlines, cc_t comchar) static int more_key_command(struct more_control *ctl, char *filename) { int retval = 0; - int done = 0, search_again = 0; + int done = 0, search_again = 0, stderr_active = 0; char cmdbuf[INIT_BUF]; struct number_command cmd; @@ -1666,7 +1672,9 @@ static int more_key_command(struct more_control *ctl, char *filename) ctl->report_errors = 0; ctl->search_called = 0; for (;;) { - if (more_poll(ctl, -1) <= 0) + if (more_poll(ctl, -1, &stderr_active) <= 0) + continue; + if (stderr_active == 0) continue; cmd = read_command(ctl); if (cmd.key == more_kc_unknown_command)