input: ensure that standard input uses blocking mode

The function get_key_buffer() assumes waiting_mode = TRUE, but stdin
can be in non-blocking mode when a program (before nano) turned stdin
to non-blocking mode and did not change it back (possibly because it
crashed).  So, explicitly set stdin to blocking mode at startup.

Signed-off-by: Lion Yang <lion@aosc.io>
master
Lion Yang 2017-11-08 13:49:48 +08:00 committed by Benno Schulenberg
parent 7e6bb91593
commit f0d3685591
1 changed files with 6 additions and 1 deletions

View File

@ -1887,7 +1887,7 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int optchr; int stdin_flags, optchr;
#if defined(ENABLED_WRAPORJUSTIFY) && defined(ENABLE_NANORC) #if defined(ENABLED_WRAPORJUSTIFY) && defined(ENABLE_NANORC)
bool fill_used = FALSE; bool fill_used = FALSE;
/* Was the fill option used on the command line? */ /* Was the fill option used on the command line? */
@ -1978,6 +1978,11 @@ int main(int argc, char **argv)
/* Back up the terminal settings so that they can be restored. */ /* Back up the terminal settings so that they can be restored. */
tcgetattr(0, &oldterm); tcgetattr(0, &oldterm);
/* Get the state of standard input and ensure it uses blocking mode. */
stdin_flags = fcntl(0, F_GETFL, 0);
if (stdin_flags != -1)
fcntl(0, F_SETFL, stdin_flags & ~O_NONBLOCK);
#ifdef ENABLE_UTF8 #ifdef ENABLE_UTF8
/* If setting the locale is successful and it uses UTF-8, we need /* If setting the locale is successful and it uses UTF-8, we need
* to use the multibyte functions for text processing. */ * to use the multibyte functions for text processing. */