ソースを参照

Fix ctrl-c for non-interactive commands

Serj Kalichev 7 ヶ月 前
コミット
2f57f6dd18
2 ファイル変更11 行追加10 行削除
  1. 6 4
      bin/klish/interactive.c
  2. 5 6
      tinyrl/tinyrl/tinyrl.c

+ 6 - 4
bin/klish/interactive.c

@@ -264,9 +264,6 @@ bool_t cmd_ack_cb(ktp_session_t *ktp, const faux_msg_t *msg, void *udata)
 	int rc = -1;
 	faux_error_t *error = NULL;
 
-	// Disable SIGINT caught for non-interactive commands
-	tinyrl_disable_isig(ctx->tinyrl);
-
 	process_prompt_param(ctx->tinyrl, msg);
 	process_hotkey_param(ctx, msg);
 
@@ -288,6 +285,11 @@ bool_t cmd_ack_cb(ktp_session_t *ktp, const faux_msg_t *msg, void *udata)
 		ctx->pager_pipe = NULL;
 	}
 
+	// Disable SIGINT caught for non-interactive commands.
+	// Do it after pager exit. Else it can restore wrong tty mode after
+	// ISIG disabling
+	tinyrl_disable_isig(ctx->tinyrl);
+
 	tinyrl_set_busy(ctx->tinyrl, BOOL_FALSE);
 	if (!ktp_session_done(ktp))
 		tinyrl_redisplay(ctx->tinyrl);
@@ -463,7 +465,7 @@ static bool_t tinyrl_key_enter(tinyrl_t *tinyrl, unsigned char key)
 	tinyrl_set_busy(tinyrl, BOOL_TRUE);
 	// Suppose non-interactive command
 	// Caught SIGINT for non-interactive commands
-	tinyrl_enable_isig(ctx->tinyrl);
+	tinyrl_enable_isig(tinyrl);
 
 	key = key; // Happy compiler
 

+ 5 - 6
tinyrl/tinyrl/tinyrl.c

@@ -165,9 +165,9 @@ void tinyrl_enable_isig(tinyrl_t *tinyrl)
 	fd = fileno(istream);
 	if (tcgetattr(fd, &new_termios) < 0)
 		return;
-//	new_termios.c_lflag |= (ISIG | NOFLSH);
-//	new_termios.c_lflag |= (ISIG);
-	tcsetattr(fd, TCSADRAIN, &new_termios);
+
+	new_termios.c_lflag |= (ISIG | NOFLSH);
+	tcsetattr(fd, TCSANOW, &new_termios);
 }
 
 
@@ -185,9 +185,8 @@ void tinyrl_disable_isig(tinyrl_t *tinyrl)
 	fd = fileno(istream);
 	if (tcgetattr(fd, &new_termios) < 0)
 		return;
-//	new_termios.c_lflag &= ~(ISIG | NOFLSH);
-//	new_termios.c_lflag &= ~(ISIG);
-	tcsetattr(fd, TCSADRAIN, &new_termios);
+	new_termios.c_lflag &= ~(ISIG | NOFLSH);
+	tcsetattr(fd, TCSANOW, &new_termios);
 }