1
1

tweaks: factor out the installing and restoring of the ^C signal handler

So that these two functions can be used elsewhere too.
Этот коммит содержится в:
Benno Schulenberg 2019-05-26 13:10:47 +02:00
родитель b2926eb675
Коммит 8c5b67379f
4 изменённых файлов: 31 добавлений и 17 удалений

Просмотреть файл

@ -32,9 +32,6 @@
#define LOCKBUFSIZE 8192
static bool control_C_was_pressed;
/* Whether ^C was pressed while reading a file. */
/* A signal handler for when ^C is typed while reading from a file. */
RETSIGTYPE cancel_the_reading(int signal)
{

Просмотреть файл

@ -44,6 +44,9 @@ bool focusing = TRUE;
bool as_an_at = TRUE;
/* Whether a 0x0A byte should be shown as a ^@ instead of a ^J. */
bool control_C_was_pressed = FALSE;
/* Whether Ctrl+C was pressed (when a keyboard interrupt is enabled). */
bool suppress_cursorpos = FALSE;
/* Should we skip constant position display for current keystroke? */

Просмотреть файл

@ -62,8 +62,8 @@ static struct termios oldterm;
static struct sigaction act;
/* Used to set up all our fun signal handlers. */
static bool input_was_aborted = FALSE;
/* Whether reading from standard input was aborted via ^C. */
static struct sigaction oldaction, newaction;
/* Containers for the original and the temporary handler for SIGINT. */
/* Create a new linestruct node. Note that we do not set prevnode->next. */
linestruct *make_new_node(linestruct *prevnode)
@ -1044,17 +1044,34 @@ void close_and_go(void)
finish();
}
/* Make a note that reading from stdin was concluded with ^C. */
/* Note that Ctrl+C was pressed during some system call. */
RETSIGTYPE make_a_note(int signal)
{
input_was_aborted = TRUE;
control_C_was_pressed = TRUE;
}
/* Make ^C interrupt a system call and set a flag. */
void install_handler_for_Ctrl_C(void)
{
/* Enable the generation of a SIGINT when ^C is pressed. */
enable_signals();
/* Set up a signal handler so that pressing ^C will set a flag. */
newaction.sa_handler = make_a_note;
newaction.sa_flags = 0;
sigaction(SIGINT, &newaction, &oldaction);
}
/* Go back to ignoring ^C. */
void restore_handler_for_Ctrl_C(void)
{
sigaction(SIGINT, &oldaction, NULL);
disable_signals();
}
/* Read whatever comes from standard input into a new buffer. */
bool scoop_stdin(void)
{
struct sigaction oldaction, newaction;
/* Original and temporary handlers for SIGINT. */
FILE *stream;
int thetty;
@ -1067,9 +1084,6 @@ bool scoop_stdin(void)
fprintf(stderr, _("Reading data from keyboard; "
"type ^D or ^D^D to finish.\n"));
/* Enable the generation of a SIGINT when Ctrl+C is pressed. */
enable_signals();
/* Open standard input. */
stream = fopen("/dev/stdin", "rb");
if (stream == NULL) {
@ -1082,9 +1096,7 @@ bool scoop_stdin(void)
}
/* Set up a signal handler so that ^C will stop the reading. */
newaction.sa_handler = make_a_note;
newaction.sa_flags = 0;
sigaction(SIGINT, &newaction, &oldaction);
install_handler_for_Ctrl_C();
/* Read the input into a new buffer. */
make_new_buffer();
@ -1102,11 +1114,11 @@ bool scoop_stdin(void)
close(thetty);
/* If things went well, store the current state of the terminal. */
if (!input_was_aborted)
if (!control_C_was_pressed)
tcgetattr(0, &oldterm);
/* Restore the original ^C handler, the terminal setup, and curses mode. */
sigaction(SIGINT, &oldaction, NULL);
restore_handler_for_Ctrl_C();
terminal_init();
doupdate();

Просмотреть файл

@ -38,6 +38,8 @@ extern bool focusing;
extern bool as_an_at;
extern bool control_C_was_pressed;
extern bool suppress_cursorpos;
extern message_type lastmessage;