Add signal handlers so we clean up before exiting.
authorTom Hughes <tom.hughes@palm.com>
Tue, 12 Oct 2010 21:01:58 +0000 (14:01 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Tue, 12 Oct 2010 21:01:58 +0000 (14:01 -0700)
Add SIGTERM and SIGINT signal handlers so that we run the exit handlers
before exiting when getting these signals. Fixes an issue where we
couldn't run vi after CTRL+C'ing node because the stdin fd was left
non-blocking.

src/node.cc

index aea2570..14fc565 100644 (file)
@@ -1768,6 +1768,21 @@ static void AtExit() {
 }
 
 
+static void SignalExit(int signal) {
+  ev_unloop(EV_DEFAULT_ EVUNLOOP_ALL);
+}
+
+
+static int RegisterSignalHandler(int signal, void (*handler)(int)) {
+  struct sigaction sa;
+
+  memset(&sa, 0, sizeof(sa));
+  sa.sa_handler = handler;
+  sigfillset(&sa.sa_mask);
+  return sigaction(signal, &sa, NULL);
+}
+
+
 int Start(int argc, char *argv[]) {
   // Hack aroung with the argv pointer. Used for process.title = "blah".
   argv = node::OS::SetupArgs(argc, argv);
@@ -1792,10 +1807,9 @@ int Start(int argc, char *argv[]) {
   V8::SetFlagsFromCommandLine(&v8argc, v8argv, false);
 
   // Ignore SIGPIPE
-  struct sigaction sa;
-  bzero(&sa, sizeof(sa));
-  sa.sa_handler = SIG_IGN;
-  sigaction(SIGPIPE, &sa, NULL);
+  RegisterSignalHandler(SIGPIPE, SIG_IGN);
+  RegisterSignalHandler(SIGINT, SignalExit);
+  RegisterSignalHandler(SIGTERM, SignalExit);
 
 
   // Initialize the default ev loop.