Commit 5a801a8c authored by Kamran Riaz Khan's avatar Kamran Riaz Khan
Browse files

Emits CONF_CHANGED events whenever Tor's configuration values change.

parent ce878874
......@@ -10,6 +10,7 @@
**/
#define CONFIG_PRIVATE
#define CONTROL_PRIVATE
#include "or.h"
#include "circuitbuild.h"
......@@ -693,6 +694,10 @@ get_options(void)
int
set_options(or_options_t *new_val, char **msg)
{
int i;
char *result;
smartlist_t *elements;
config_line_t *line;
or_options_t *old_options = global_options;
global_options = new_val;
/* Note that we pass the *old* options below, for comparison. It
......@@ -707,7 +712,35 @@ set_options(or_options_t *new_val, char **msg)
"Acting on config options left us in a broken state. Dying.");
exit(1);
}
/* Issues a CONF_CHANGED event to notify controller of the change. If Tor is
* just starting up then the old_options will be undefined. */
if (old_options) {
elements = smartlist_create();
for (i=0; options_format.vars[i].name; ++i) {
if (!option_is_same(&options_format, new_val, old_options,
options_format.vars[i].name)) {
line = get_assigned_option(&options_format, new_val,
options_format.vars[i].name, 0);
if (line) {
for (; line; line = line->next) {
char *tmp;
tor_asprintf(&tmp, "650-%s=%s", line->key, line->value);
smartlist_add(elements, tmp);
}
} else {
char *tmp;
tor_asprintf(&tmp, "650-%s", options_format.vars[i].name);
smartlist_add(elements, tmp);
}
}
}
result = smartlist_join_strings(elements, "\r\n", 0, NULL);
control_event_conf_changed(result);
tor_free(result);
SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp));
smartlist_free(elements);
}
config_free(&options_format, old_options);
return 0;
......
......@@ -74,7 +74,8 @@
#define EVENT_NEWCONSENSUS 0x0016
#define EVENT_BUILDTIMEOUT_SET 0x0017
#define EVENT_SIGNAL 0x0018
#define _EVENT_MAX 0x0018
#define EVENT_CONF_CHANGED 0x0019
#define _EVENT_MAX 0x0019
/* If _EVENT_MAX ever hits 0x0020, we need to make the mask wider. */
/** Bitfield: The bit 1&lt;&lt;e is set if <b>any</b> open control
......@@ -946,6 +947,7 @@ static const struct control_event_t control_event_table[] = {
{ EVENT_NEWCONSENSUS, "NEWCONSENSUS" },
{ EVENT_BUILDTIMEOUT_SET, "BUILDTIMEOUT_SET" },
{ EVENT_SIGNAL, "SIGNAL" },
{ EVENT_CONF_CHANGED, "CONF_CHANGED"},
{ 0, NULL },
};
......@@ -3996,6 +3998,19 @@ control_event_guard(const char *nickname, const char *digest,
return 0;
}
/** Called when a configuration option changes. This is generally triggered
* by SETCONF requests and RELOAD/SIGHUP signals. The <b>values</b> are the
* keyword/value pairs for the configuration changes tor is using. */
int
control_event_conf_changed(const char *values)
{
if(strlen(values) > 0) {
send_control_event(EVENT_CONF_CHANGED, 0,
"650-CONF_CHANGED\r\n%s\r\n650 OK\r\n", values);
}
return 0;
}
/** Helper: Return a newly allocated string containing a path to the
* file where we store our authentication cookie. */
static char *
......
......@@ -66,6 +66,7 @@ int control_event_server_status(int severity, const char *format, ...)
CHECK_PRINTF(2,3);
int control_event_guard(const char *nickname, const char *digest,
const char *status);
int control_event_conf_changed(const char *values);
int control_event_buildtimeout_set(const circuit_build_times_t *cbt,
buildtimeout_set_event_t type);
int control_event_signal(uintptr_t signal);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment