From 5c670a186c1f45a2ddfcab00c065f994d8a888f7 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 25 Oct 2006 21:39:42 +0000 Subject: [PATCH] r9386@Kushana: nickm | 2006-10-25 17:35:38 -0400 Resolve bug 347: translate v0 controller signal numbers into internal signal numbers; leave v1 signal numbers alone. svn:r8828 --- ChangeLog | 2 ++ src/or/control.c | 26 +++++++++++++++----------- src/or/main.c | 18 ------------------ src/or/or.h | 1 - 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 13de42e8f2..0e0734b152 100644 --- a/ChangeLog +++ b/ChangeLog @@ -64,6 +64,8 @@ Changes in version 0.1.2.3-alpha - 2006-10-?? requests will now get an error rather than timing out. - Resolve two memory leaks when rebuilding the on-disk router cache (reported by fookoowa). + - Controller signals now work on non-Unix platforms that don't define + SIGUSR1 and SIGUSR2 the way we expect. Changes in version 0.1.2.2-alpha - 2006-10-07 diff --git a/src/or/control.c b/src/or/control.c index 0947ad2a0a..60a233211d 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -1252,6 +1252,18 @@ handle_control_signal(control_connection_t *conn, uint32_t len, return 0; } else { sig = (uint8_t)body[0]; + switch (sig) + { + case 1: sig = SIGHUP; break; + case 2: sig = SIGINT; break; + case 10: sig = SIGUSR1; break; + case 12: sig = SIGUSR2; break; + case 15: sig = SIGTERM; break; + case SIGNEWNYM: break; + default: + send_control0_error(conn, ERR_SYNTAX, "Unrecognized signal number."); + return 0; + } } } else { int n = 0; @@ -1281,17 +1293,9 @@ handle_control_signal(control_connection_t *conn, uint32_t len, return 0; } - if (!control_signal_check(sig)) { - if (STATE_IS_V0(conn->_base.state)) - send_control0_error(conn, ERR_SYNTAX, "Unrecognized signal number."); - else - connection_write_str_to_buf("551 Unable to act on signal\r\n", - conn); - } else { - /* Send DONE first, in case the signal makes us shut down. */ - send_control_done(conn); - control_signal_act(sig); - } + /* Send DONE first, in case the signal makes us shut down. */ + send_control_done(conn); + control_signal_act(sig); return 0; } diff --git a/src/or/main.c b/src/or/main.c index 30d5fcc584..0dafa54050 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1229,24 +1229,6 @@ do_main_loop(void) } } -/* DOCDOC */ -int -control_signal_check(int the_signal) -{ - switch (the_signal) - { - case 1: - case 2: - case 10: - case 12: - case 15: - case SIGNEWNYM: - return 1; - default: - return 0; - } -} - /** Used to implement the SIGNAL control command: if we accept * the_signal as a remote pseudo-signal, act on it. */ /* We don't re-use catch() here because: diff --git a/src/or/or.h b/src/or/or.h index 1a58165598..9036ef0192 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2273,7 +2273,6 @@ void connection_start_writing(connection_t *conn); void directory_all_unreachable(time_t now); void directory_info_has_arrived(time_t now, int from_cache); -int control_signal_check(int the_signal); void control_signal_act(int the_signal); void handle_signals(int is_parent); void tor_cleanup(void);