chat: hopefully fix infinite spinning on input EOF
function old new delta chat_main 1295 1303 +8 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
7d06d6e186
commit
4b032a4d6c
@ -201,6 +201,9 @@ int chat_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
DIR_RECORD,
|
DIR_RECORD,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define inbuf bb_common_bufsiz1
|
||||||
|
setup_common_bufsiz();
|
||||||
|
|
||||||
// make x* functions fail with correct exitcode
|
// make x* functions fail with correct exitcode
|
||||||
xfunc_error_retval = ERR_IO;
|
xfunc_error_retval = ERR_IO;
|
||||||
|
|
||||||
@ -361,36 +364,37 @@ int chat_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
// get reply
|
// get reply
|
||||||
pfd.fd = STDIN_FILENO;
|
pfd.fd = STDIN_FILENO;
|
||||||
pfd.events = POLLIN;
|
pfd.events = POLLIN;
|
||||||
while (!exitcode
|
while (exitcode == ERR_OK
|
||||||
&& poll(&pfd, 1, timeout) > 0
|
&& poll(&pfd, 1, timeout) > 0
|
||||||
&& (pfd.revents & POLLIN)
|
/* && (pfd.revents & POLLIN) - may be untrue (e.g. only POLLERR set) */
|
||||||
) {
|
) {
|
||||||
llist_t *l;
|
llist_t *l;
|
||||||
ssize_t delta;
|
ssize_t delta;
|
||||||
#define buf bb_common_bufsiz1
|
|
||||||
setup_common_bufsiz();
|
|
||||||
|
|
||||||
// read next char from device
|
// read next char from device
|
||||||
if (safe_read(STDIN_FILENO, buf+buf_len, 1) > 0) {
|
if (safe_read(STDIN_FILENO, inbuf + buf_len, 1) <= 0) {
|
||||||
|
exitcode = ERR_IO;
|
||||||
|
goto expect_done;
|
||||||
|
}
|
||||||
|
|
||||||
// dump device input if RECORD fname
|
// dump device input if RECORD fname
|
||||||
if (record_fd > 0) {
|
if (record_fd > 0) {
|
||||||
full_write(record_fd, buf+buf_len, 1);
|
full_write(record_fd, inbuf + buf_len, 1);
|
||||||
}
|
}
|
||||||
// dump device input if ECHO ON
|
// dump device input if ECHO ON
|
||||||
if (echo) {
|
if (echo) {
|
||||||
// if (buf[buf_len] < ' ') {
|
// if (inbuf[buf_len] < ' ') {
|
||||||
// full_write2_str("^");
|
// full_write2_str("^");
|
||||||
// buf[buf_len] += '@';
|
// inbuf[buf_len] += '@';
|
||||||
// }
|
// }
|
||||||
full_write(STDERR_FILENO, buf+buf_len, 1);
|
full_write(STDERR_FILENO, inbuf + buf_len, 1);
|
||||||
}
|
}
|
||||||
buf_len++;
|
buf_len++;
|
||||||
// move input frame if we've reached higher bound
|
// move input frame if we've reached higher bound
|
||||||
if (buf_len > COMMON_BUFSIZE) {
|
if (buf_len > COMMON_BUFSIZE) {
|
||||||
memmove(buf, buf+buf_len-max_len, max_len);
|
memmove(inbuf, inbuf + buf_len - max_len, max_len);
|
||||||
buf_len = max_len;
|
buf_len = max_len;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// N.B. rule of thumb: values being looked for can
|
// N.B. rule of thumb: values being looked for can
|
||||||
// be found only at the end of input buffer
|
// be found only at the end of input buffer
|
||||||
// this allows to get rid of strstr() and memmem()
|
// this allows to get rid of strstr() and memmem()
|
||||||
@ -400,19 +404,19 @@ int chat_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
for (l = aborts, exitcode = ERR_ABORT; l; l = l->link, ++exitcode) {
|
for (l = aborts, exitcode = ERR_ABORT; l; l = l->link, ++exitcode) {
|
||||||
size_t len = strlen(l->data);
|
size_t len = strlen(l->data);
|
||||||
delta = buf_len - len;
|
delta = buf_len - len;
|
||||||
if (delta >= 0 && !memcmp(buf+delta, l->data, len))
|
if (delta >= 0 && !memcmp(inbuf + delta, l->data, len))
|
||||||
goto expect_done;
|
goto expect_done;
|
||||||
}
|
}
|
||||||
exitcode = ERR_OK;
|
exitcode = ERR_OK;
|
||||||
|
|
||||||
// expected reply received? -> goto next command
|
// expected reply received? -> goto next command
|
||||||
delta = buf_len - expect_len;
|
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;
|
goto expect_done;
|
||||||
#undef buf
|
|
||||||
} /* while (have data) */
|
} /* 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;
|
exitcode = ERR_TIMEOUT;
|
||||||
expect_done:
|
expect_done:
|
||||||
#if ENABLE_FEATURE_CHAT_NOFAIL
|
#if ENABLE_FEATURE_CHAT_NOFAIL
|
||||||
@ -434,7 +438,7 @@ int chat_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// bail out unless we expected successfully
|
// bail out unless we expected successfully
|
||||||
if (exitcode)
|
if (exitcode != ERR_OK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//-----------------------
|
//-----------------------
|
||||||
@ -478,7 +482,7 @@ int chat_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ('p' == c) {
|
if ('p' == c) {
|
||||||
usleep(10000);
|
msleep(10);
|
||||||
len--;
|
len--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user