mirror of
https://github.com/neovim/neovim.git
synced 2025-12-08 23:52:39 +00:00
fix(system): handle SIGINT in --headless mode #36557
Problem: When running with `--headless --listen ./hello`, pressing Ctrl-C doesn’t log anything and doesn’t clean up the socket file. Solution: handle SIGINT like SIGTERM.
This commit is contained in:
@@ -27,7 +27,7 @@
|
|||||||
# include "nvim/os/os_win_console.h"
|
# include "nvim/os/os_win_console.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static SignalWatcher spipe, shup, squit, sterm, susr1, swinch, ststp;
|
static SignalWatcher spipe, shup, sint, squit, sterm, susr1, swinch, ststp;
|
||||||
#ifdef SIGPWR
|
#ifdef SIGPWR
|
||||||
static SignalWatcher spwr;
|
static SignalWatcher spwr;
|
||||||
#endif
|
#endif
|
||||||
@@ -50,6 +50,7 @@ void signal_init(void)
|
|||||||
|
|
||||||
signal_watcher_init(&main_loop, &spipe, NULL);
|
signal_watcher_init(&main_loop, &spipe, NULL);
|
||||||
signal_watcher_init(&main_loop, &shup, NULL);
|
signal_watcher_init(&main_loop, &shup, NULL);
|
||||||
|
signal_watcher_init(&main_loop, &sint, NULL);
|
||||||
signal_watcher_init(&main_loop, &squit, NULL);
|
signal_watcher_init(&main_loop, &squit, NULL);
|
||||||
signal_watcher_init(&main_loop, &sterm, NULL);
|
signal_watcher_init(&main_loop, &sterm, NULL);
|
||||||
signal_watcher_init(&main_loop, &ststp, NULL);
|
signal_watcher_init(&main_loop, &ststp, NULL);
|
||||||
@@ -70,6 +71,7 @@ void signal_teardown(void)
|
|||||||
signal_stop();
|
signal_stop();
|
||||||
signal_watcher_close(&spipe, NULL);
|
signal_watcher_close(&spipe, NULL);
|
||||||
signal_watcher_close(&shup, NULL);
|
signal_watcher_close(&shup, NULL);
|
||||||
|
signal_watcher_close(&sint, NULL);
|
||||||
signal_watcher_close(&squit, NULL);
|
signal_watcher_close(&squit, NULL);
|
||||||
signal_watcher_close(&sterm, NULL);
|
signal_watcher_close(&sterm, NULL);
|
||||||
signal_watcher_close(&ststp, NULL);
|
signal_watcher_close(&ststp, NULL);
|
||||||
@@ -90,6 +92,7 @@ void signal_start(void)
|
|||||||
signal_watcher_start(&spipe, on_signal, SIGPIPE);
|
signal_watcher_start(&spipe, on_signal, SIGPIPE);
|
||||||
#endif
|
#endif
|
||||||
signal_watcher_start(&shup, on_signal, SIGHUP);
|
signal_watcher_start(&shup, on_signal, SIGHUP);
|
||||||
|
signal_watcher_start(&sint, on_signal, SIGINT);
|
||||||
#ifdef SIGQUIT
|
#ifdef SIGQUIT
|
||||||
signal_watcher_start(&squit, on_signal, SIGQUIT);
|
signal_watcher_start(&squit, on_signal, SIGQUIT);
|
||||||
#endif
|
#endif
|
||||||
@@ -114,6 +117,7 @@ void signal_stop(void)
|
|||||||
signal_watcher_stop(&spipe);
|
signal_watcher_stop(&spipe);
|
||||||
#endif
|
#endif
|
||||||
signal_watcher_stop(&shup);
|
signal_watcher_stop(&shup);
|
||||||
|
signal_watcher_stop(&sint);
|
||||||
#ifdef SIGQUIT
|
#ifdef SIGQUIT
|
||||||
signal_watcher_stop(&squit);
|
signal_watcher_stop(&squit);
|
||||||
#endif
|
#endif
|
||||||
@@ -163,6 +167,8 @@ static char *signal_name(int signum)
|
|||||||
#endif
|
#endif
|
||||||
case SIGHUP:
|
case SIGHUP:
|
||||||
return "SIGHUP";
|
return "SIGHUP";
|
||||||
|
case SIGINT:
|
||||||
|
return "SIGINT";
|
||||||
#ifdef SIGUSR1
|
#ifdef SIGUSR1
|
||||||
case SIGUSR1:
|
case SIGUSR1:
|
||||||
return "SIGUSR1";
|
return "SIGUSR1";
|
||||||
@@ -191,7 +197,7 @@ static void deadly_signal(int signum)
|
|||||||
|
|
||||||
snprintf(IObuff, IOSIZE, "Nvim: Caught deadly signal '%s'\n", signal_name(signum));
|
snprintf(IObuff, IOSIZE, "Nvim: Caught deadly signal '%s'\n", signal_name(signum));
|
||||||
|
|
||||||
if (p_awa && signum != SIGTERM) {
|
if (p_awa && signum != SIGTERM && signum != SIGINT) {
|
||||||
autowrite_all();
|
autowrite_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,6 +231,7 @@ static void on_signal(SignalWatcher *handle, int signum, void *data)
|
|||||||
#ifdef MSWIN
|
#ifdef MSWIN
|
||||||
os_clear_hwnd();
|
os_clear_hwnd();
|
||||||
#endif
|
#endif
|
||||||
|
case SIGINT:
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
#ifdef SIGQUIT
|
#ifdef SIGQUIT
|
||||||
case SIGQUIT:
|
case SIGQUIT:
|
||||||
|
|||||||
@@ -66,6 +66,9 @@ describe("'autowriteall' on signal exit", function()
|
|||||||
it('dont write if SIGQUIT & awa off', function()
|
it('dont write if SIGQUIT & awa off', function()
|
||||||
test_deadly_sig('sigquit', false, false)
|
test_deadly_sig('sigquit', false, false)
|
||||||
end)
|
end)
|
||||||
|
it('dont write if SIGINT & awa on', function()
|
||||||
|
test_deadly_sig('sigint', true, false)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('autocmd Signal', function()
|
describe('autocmd Signal', function()
|
||||||
|
|||||||
Reference in New Issue
Block a user