chat: hopefully fix infinite spinning on input EOF
No binary (build failed)
—
(log yok)
| @@ -201,6 +201,9 @@ int chat_main(int argc UNUSED_PARAM, char **argv) | |
| DIR_RECORD, | |
| }; | |
| + | #define inbuf bb_common_bufsiz1 |
| + | setup_common_bufsiz(); |
| + | |
| // make x* functions fail with correct exitcode | |
| xfunc_error_retval = ERR_IO; | |
| @@ -361,35 +364,36 @@ int chat_main(int argc UNUSED_PARAM, char **argv) | |
| // get reply | |
| pfd.fd = STDIN_FILENO; | |
| pfd.events = POLLIN; | |
| - | while (!exitcode |
| + | while (exitcode == ERR_OK |
| && poll(&pfd, 1, timeout) > 0 | |
| - | && (pfd.revents & POLLIN) |
| + | /* && (pfd.revents & POLLIN) - may be untrue (e.g. only POLLERR set) */ |
| ) { | |
| llist_t *l; | |
| ssize_t delta; | |
| - | #define buf bb_common_bufsiz1 |
| - | setup_common_bufsiz(); |
| // read next char from device | |
| - | if (safe_read(STDIN_FILENO, buf+buf_len, 1) > 0) { |
| - | // dump device input if RECORD fname |
| - | if (record_fd > 0) { |
| - | full_write(record_fd, buf+buf_len, 1); |
| - | } |
| - | // dump device input if ECHO ON |
| - | if (echo) { |
| - | // if (buf[buf_len] < ' ') { |
| - | // full_write2_str("^"); |
| - | // buf[buf_len] += '@'; |
| - | // } |
| - | full_write(STDERR_FILENO, buf+buf_len, 1); |
| - | } |
| - | buf_len++; |
| - | // move input frame if we've reached higher bound |
| - | if (buf_len > COMMON_BUFSIZE) { |
| - | memmove(buf, buf+buf_len-max_len, max_len); |
| - | buf_len = max_len; |
| - | } |
| + | if (safe_read(STDIN_FILENO, inbuf + buf_len, 1) <= 0) { |
| + | exitcode = ERR_IO; |
| + | goto expect_done; |
| + | } |
| + | |
| + | // dump device input if RECORD fname |
| + | if (record_fd > 0) { |
| + | full_write(record_fd, inbuf + buf_len, 1); |
| + | } |
| + | // dump device input if ECHO ON |
| + | if (echo) { |
| + | // if (inbuf[buf_len] < ' ') { |
| + | // full_write2_str("^"); |
| + | // inbuf[buf_len] += '@'; |
| + | // } |
| + | full_write(STDERR_FILENO, inbuf + buf_len, 1); |
| + | } |
| + | buf_len++; |
| + | // move input frame if we've reached higher bound |
| + | if (buf_len > COMMON_BUFSIZE) { |
| + | memmove(inbuf, inbuf + buf_len - max_len, max_len); |
| + | buf_len = max_len; |
| } | |
| // N.B. rule of thumb: values being looked for can | |
| // be found only at the end of input buffer | |
| @@ -399,20 +403,20 @@ int chat_main(int argc UNUSED_PARAM, char **argv) | |
| // abort condition is met? -> bail out | |
| for (l = aborts, exitcode = ERR_ABORT; l; l = l->link, ++exitcode) { | |
| size_t len = strlen(l->data); | |
| - | delta = buf_len-len; |
| - | if (delta >= 0 && !memcmp(buf+delta, l->data, len)) |
| + | delta = buf_len - len; |
| + | if (delta >= 0 && !memcmp(inbuf + delta, l->data, len)) |
| goto expect_done; | |
| } | |
| exitcode = ERR_OK; | |
| // expected reply received? -> goto next command | |
| delta = buf_len - expect_len; | |
| - | if (delta >= 0 && !memcmp(buf+delta, expect, expect_len)) |
| + | if (delta >= 0 && memcmp(inbuf + delta, expect, expect_len) == 0) |
| goto expect_done; | |
| - | #undef buf |
| } /* while (have data) */ | |
| - | // device timed out or unexpected reply received |
| + | // device timed out, or unexpected reply received, |
| + | // or we got a signal (poll() returned -1 with EINTR). |
| exitcode = ERR_TIMEOUT; | |
| expect_done: | |
| #if ENABLE_FEATURE_CHAT_NOFAIL | |
| @@ -434,7 +438,7 @@ int chat_main(int argc UNUSED_PARAM, char **argv) | |
| } | |
| #endif | |
| // bail out unless we expected successfully | |
| - | if (exitcode) |
| + | if (exitcode != ERR_OK) |
| break; | |
| //----------------------- | |
| @@ -478,7 +482,7 @@ int chat_main(int argc UNUSED_PARAM, char **argv) | |
| continue; | |
| } | |
| if ('p' == c) { | |
| - | usleep(10000); |
| + | msleep(10); |
| len--; | |
| continue; | |
| } | |