aboutsummaryrefslogtreecommitdiff
path: root/src/os/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/signal.c')
-rw-r--r--src/os/signal.c163
1 files changed, 0 insertions, 163 deletions
diff --git a/src/os/signal.c b/src/os/signal.c
deleted file mode 100644
index d3bedad09c..0000000000
--- a/src/os/signal.c
+++ /dev/null
@@ -1,163 +0,0 @@
-#include <stdbool.h>
-
-#include <uv.h>
-
-#include "types.h"
-#include "vim.h"
-#include "globals.h"
-#include "memline.h"
-#include "eval.h"
-#include "term.h"
-#include "memory.h"
-#include "misc1.h"
-#include "misc2.h"
-#include "os/event_defs.h"
-#include "os/event.h"
-#include "os/signal.h"
-
-static uv_signal_t sint, spipe, shup, squit, sterm, swinch;
-#ifdef SIGPWR
-static uv_signal_t spwr;
-#endif
-
-static bool rejecting_deadly;
-static char * signal_name(int signum);
-static void deadly_signal(int signum);
-static void signal_cb(uv_signal_t *, int signum);
-
-void signal_init()
-{
- uv_signal_init(uv_default_loop(), &sint);
- uv_signal_init(uv_default_loop(), &spipe);
- uv_signal_init(uv_default_loop(), &shup);
- uv_signal_init(uv_default_loop(), &squit);
- uv_signal_init(uv_default_loop(), &sterm);
- uv_signal_init(uv_default_loop(), &swinch);
- uv_signal_start(&sint, signal_cb, SIGINT);
- uv_signal_start(&spipe, signal_cb, SIGPIPE);
- uv_signal_start(&shup, signal_cb, SIGHUP);
- uv_signal_start(&squit, signal_cb, SIGQUIT);
- uv_signal_start(&sterm, signal_cb, SIGTERM);
- uv_signal_start(&swinch, signal_cb, SIGWINCH);
-#ifdef SIGPWR
- uv_signal_init(uv_default_loop(), &spwr);
- uv_signal_start(&spwr, signal_cb, SIGPWR);
-#endif
-}
-
-void signal_stop()
-{
- uv_signal_stop(&sint);
- uv_signal_stop(&spipe);
- uv_signal_stop(&shup);
- uv_signal_stop(&squit);
- uv_signal_stop(&sterm);
- uv_signal_stop(&swinch);
-#ifdef SIGPWR
- uv_signal_stop(&spwr);
-#endif
-}
-
-void signal_reject_deadly()
-{
- rejecting_deadly = true;
-}
-
-void signal_accept_deadly()
-{
- rejecting_deadly = false;
-}
-
-void signal_handle(Event event)
-{
- int signum = event.data.signum;
-
- switch (signum) {
- case SIGINT:
- got_int = true;
- break;
-#ifdef SIGPWR
- case SIGPWR:
- // Signal of a power failure(eg batteries low), flush the swap files to
- // be safe
- ml_sync_all(false, false);
- break;
-#endif
- case SIGPIPE:
- // Ignore
- break;
- case SIGWINCH:
- shell_resized();
- break;
- case SIGTERM:
- case SIGQUIT:
- case SIGHUP:
- if (!rejecting_deadly) {
- deadly_signal(signum);
- }
- break;
- default:
- fprintf(stderr, "Invalid signal %d", signum);
- break;
- }
-}
-
-static char * signal_name(int signum)
-{
- switch (signum) {
- case SIGINT:
- return "SIGINT";
-#ifdef SIGPWR
- case SIGPWR:
- return "SIGPWR";
-#endif
- case SIGPIPE:
- return "SIGPIPE";
- case SIGWINCH:
- return "SIGWINCH";
- case SIGTERM:
- return "SIGTERM";
- case SIGQUIT:
- return "SIGQUIT";
- case SIGHUP:
- return "SIGHUP";
- default:
- return "Unknown";
- }
-}
-
-// This function handles deadly signals.
-// It tries to preserve any swap files and exit properly.
-// (partly from Elvis).
-// NOTE: Avoid unsafe functions, such as allocating memory, they can result in
-// a deadlock.
-static void deadly_signal(int signum)
-{
- // Set the v:dying variable.
- set_vim_var_nr(VV_DYING, 1);
-
- snprintf((char *)IObuff, sizeof(IObuff), "Vim: Caught deadly signal '%s'\n",
- signal_name(signum));
-
- // Preserve files and exit.
- preserve_exit();
-}
-
-static void signal_cb(uv_signal_t *handle, int signum)
-{
- if (rejecting_deadly) {
- if (signum == SIGINT) {
- got_int = true;
- }
-
- return;
- }
-
- Event event = {
- .type = kEventSignal,
- .data = {
- .signum = signum
- }
- };
- event_push(event);
-}