Commit f96400d9 authored by Nick Mathewson's avatar Nick Mathewson 🥔
Browse files

bug10449: a dying owning controller makes Tor exit immediately

If you want a slow shutdown, send SIGNAL SHUTDOWN.

(Why not just have the default be SIGNAL QUIT?  Because this case
should only happen when an owning controller has crashed, and a
crashed controller won't be able to give the user any "tor is
shutting down" feedback, and so the user gets confused for a while.
See bug 10449 for more info)
parent 696b484d
Loading
Loading
Loading
Loading

changes/bug10449

0 → 100644
+8 −0
Original line number Diff line number Diff line
  o Minor bugfixes:
    - Exit immediately when exiting because of dropped connection from
      a process-owning controller. Previously, if we were running in
      server mode, we would wait for a little while as in the when we
      got an INT signal--but this was problematic, since there was no
      feedback for the user. Controllers that want to do a clean
      shutdown should send an INT signal, and let the user know what's
      going on. Fix for bug 10449; bugfix on 0.2.2.28-beta.
 No newline at end of file
+4 −13
Original line number Diff line number Diff line
@@ -3181,23 +3181,14 @@ connection_control_reached_eof(control_connection_t *conn)
static void
lost_owning_controller(const char *owner_type, const char *loss_manner)
{
  int shutdown_slowly = server_mode(get_options());

  log_notice(LD_CONTROL, "Owning controller %s has %s -- %s.",
             owner_type, loss_manner,
             shutdown_slowly ? "shutting down" : "exiting now");
  log_notice(LD_CONTROL, "Owning controller %s has %s -- exiting now.",
             owner_type, loss_manner);

  /* XXXX Perhaps this chunk of code should be a separate function,
   * called here and by process_signal(SIGINT). */

  if (!shutdown_slowly) {
  tor_cleanup();
  exit(0);
}
  /* XXXX This will close all listening sockets except control-port
   * listeners.  Perhaps we should close those too. */
  hibernate_begin_shutdown();
}

/** Called when <b>conn</b> is being freed. */
void