7474import org .graalvm .shadowed .org .jline .terminal .Terminal ;
7575import org .graalvm .shadowed .org .jline .terminal .TerminalBuilder ;
7676import org .graalvm .shadowed .org .jline .utils .InputStreamReader ;
77+ import org .graalvm .shadowed .org .jline .utils .Signals ;
7778
7879public class JLineConsoleHandler extends ConsoleHandler {
80+ private static final String [] SIGNALS = {"INT" , "QUIT" , "TSTP" , "CONT" , "WINCH" };
81+
7982 private final InputStream inputStream ;
8083 private final OutputStream outputStream ;
8184 private LineReader reader ;
@@ -93,10 +96,13 @@ public class JLineConsoleHandler extends ConsoleHandler {
9396 @ SuppressWarnings ("unused" )
9497 public void initializeReadline (Value readlineModule ) {
9598 Terminal terminal ;
99+ Object [] signalHandlers = stashSignalHandlers ();
96100 try {
97- terminal = TerminalBuilder .builder ().jna (false ).streams (inputStream , outputStream ).system (true ).nativeSignals ( false ). signalHandler ( Terminal . SignalHandler . SIG_IGN ). build ();
101+ terminal = TerminalBuilder .builder ().jna (false ).streams (inputStream , outputStream ).system (true ).build ();
98102 } catch (IOException ex ) {
99103 throw new RuntimeException ("unexpected error opening console reader" , ex );
104+ } finally {
105+ restoreSignalHandlers (signalHandlers );
100106 }
101107 final Value getCompleter = readlineModule .getMember ("get_completer" );
102108 final Value shouldRecord = readlineModule .getMember ("get_auto_history" );
@@ -226,6 +232,7 @@ public String readLine(String prompt) {
226232 }
227233 }
228234 if (lineBuffer .isEmpty ()) {
235+ Object [] signalHandlers = stashSignalHandlers ();
229236 try {
230237 String lines = reader .readLine (prompt );
231238 Collections .addAll (lineBuffer , lines .split ("\n " ));
@@ -235,11 +242,27 @@ public String readLine(String prompt) {
235242 return null ;
236243 } catch (Exception ex ) {
237244 throw new RuntimeException (ex );
245+ } finally {
246+ restoreSignalHandlers (signalHandlers );
238247 }
239248 }
240249 return lineBuffer .poll ();
241250 }
242251
252+ private static Object [] stashSignalHandlers () {
253+ Object [] handlers = new Object [SIGNALS .length ];
254+ for (int i = 0 ; i < SIGNALS .length ; i ++) {
255+ handlers [i ] = Signals .registerDefault (SIGNALS [i ]);
256+ }
257+ return handlers ;
258+ }
259+
260+ private static void restoreSignalHandlers (Object [] handlers ) {
261+ for (int i = 0 ; i < SIGNALS .length ; i ++) {
262+ Signals .unregister (SIGNALS [i ], handlers [i ]);
263+ }
264+ }
265+
243266 // Used via interop
244267 @ SuppressWarnings ("unused" )
245268 public CompletionState getCompletionState () {
0 commit comments