2010-03-21 Chris Allegretta <chrisa@asty.org>

* nano.c (page_stdin et al): Don't attempt to reset/reopen the terminal
          settings when reading stdin if it was aborted with SIGINT.  May fix Savannah
          bug 29114 reported by  Mike Frysinger.



git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4489 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
Chris Allegretta 2010-03-21 05:31:43 +00:00
parent fe2042da8a
commit 35b5976e69
2 changed files with 13 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2010-03-21 Chris Allegretta <chrisa@asty.org>
* nano.c (page_stdin et al): Don't attempt to reset/reopen the terminal
settings when reading stdin if it was aborted with SIGINT. May fix Savannah
bug 29114 reported by Mike Frysinger.
2010-03-21 Mike Frysinger <vapier@gentoo.org> 2010-03-21 Mike Frysinger <vapier@gentoo.org>
* doc/syntax/c.nanorc: Add additional support for #include_next and #pragma * doc/syntax/c.nanorc: Add additional support for #include_next and #pragma

View File

@ -1067,6 +1067,8 @@ void do_exit(void)
static struct sigaction pager_oldaction, pager_newaction; /* Original and temporary handlers for SIGINT. */ static struct sigaction pager_oldaction, pager_newaction; /* Original and temporary handlers for SIGINT. */
static bool pager_sig_failed = FALSE; /* Did sigaction() fail without changing the signal handlers? */ static bool pager_sig_failed = FALSE; /* Did sigaction() fail without changing the signal handlers? */
static bool pager_input_aborted = FALSE; /* Did someone invoke the pager and abort it via ^C? */
/* Things which need to be run regardless of whether /* Things which need to be run regardless of whether
we finished the stdin pipe correctly or not */ we finished the stdin pipe correctly or not */
@ -1087,7 +1089,8 @@ void finish_stdin_pager(void)
dup2(ttystdin,0); dup2(ttystdin,0);
close(ttystdin); close(ttystdin);
tcgetattr(0, &oldterm); if (!pager_input_aborted)
tcgetattr(0, &oldterm);
if (!pager_sig_failed && sigaction(SIGINT, &pager_oldaction, NULL) == -1) if (!pager_sig_failed && sigaction(SIGINT, &pager_oldaction, NULL) == -1)
nperror("sigaction"); nperror("sigaction");
terminal_init(); terminal_init();
@ -1099,13 +1102,15 @@ void finish_stdin_pager(void)
RETSIGTYPE cancel_stdin_pager(int signal) RETSIGTYPE cancel_stdin_pager(int signal)
{ {
/* Currently do nothing, just handle the intr silently */ /* Currently do nothing, just handle the intr silently */
pager_input_aborted = TRUE;
} }
/* Let nano read stdin for the first file at least */ /* Let nano read stdin for the first file at least */
void stdin_pager(void) void stdin_pager(void)
{ {
endwin(); endwin();
tcsetattr(0, TCSANOW, &oldterm); if (!pager_input_aborted)
tcsetattr(0, TCSANOW, &oldterm);
fprintf(stderr, _("Reading from stdin, ^C to abort\n")); fprintf(stderr, _("Reading from stdin, ^C to abort\n"));
/* Set things up so that Ctrl-C will cancel the new process. */ /* Set things up so that Ctrl-C will cancel the new process. */
@ -1125,7 +1130,7 @@ void stdin_pager(void)
nperror("sigaction"); nperror("sigaction");
} }
} }
open_buffer("", FALSE); open_buffer("", FALSE);
finish_stdin_pager(); finish_stdin_pager();
} }