aboutsummaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-10-28 23:44:53 +0000
committerNick Mathewson <nickm@torproject.org>2007-10-28 23:44:53 +0000
commitf09d53bbf1ceeb71a028943037190336b69bb3c6 (patch)
tree852f36a6589a6ce89d8c0aa163e53687912e6b00 /src/or
parent20b108598993ecc2ec420288ebf9b995b519f9db (diff)
downloadtor-f09d53bbf1ceeb71a028943037190336b69bb3c6.tar
tor-f09d53bbf1ceeb71a028943037190336b69bb3c6.tar.gz
r16246@catbus: nickm | 2007-10-28 19:34:58 -0400
Implement a FallbackNetworkstatusFile (default to $prefix/share/tor/fallback-consensus) to that we know about lots of directory servers and routers when we start up the first time. svn:r12259
Diffstat (limited to 'src/or')
-rw-r--r--src/or/config.c4
-rw-r--r--src/or/networkstatus.c20
-rw-r--r--src/or/or.h3
3 files changed, 27 insertions, 0 deletions
diff --git a/src/or/config.c b/src/or/config.c
index 9997bfbe0..1f9e7b0af 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -118,6 +118,8 @@ typedef struct config_var_t {
/** An entry for config_vars: "The option <b>name</b> is obsolete." */
#define OBSOLETE(name) { name, CONFIG_TYPE_OBSOLETE, 0, NULL }
+
+
/** Array of configuration options. Until we disallow nonstandard
* abbreviations, order is significant, since the first matching option will
* be chosen first.
@@ -175,6 +177,8 @@ static config_var_t _option_vars[] = {
V(ExitNodes, STRING, NULL),
V(ExitPolicy, LINELIST, NULL),
V(ExitPolicyRejectPrivate, BOOL, "1"),
+ V(FallbackNetworkstatusFile, STRING,
+ DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "fallback-consensus"),
V(FascistFirewall, BOOL, "0"),
V(FirewallPorts, CSV, ""),
V(FastFirstHopPK, BOOL, "1"),
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index c5716f396..055da051f 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -158,6 +158,8 @@ router_reload_consensus_networkstatus(void)
{
char *filename;
char *s;
+ struct stat st;
+ or_options_t *options = get_options();
/* XXXX020 Suppress warnings if cached consensus is bad. */
@@ -182,6 +184,24 @@ router_reload_consensus_networkstatus(void)
tor_free(s);
}
tor_free(filename);
+
+ if (!current_consensus ||
+ (stat(options->FallbackNetworkstatusFile, &st)==0 &&
+ st.st_mtime > current_consensus->valid_after)) {
+ s = read_file_to_str(options->FallbackNetworkstatusFile,
+ RFTS_IGNORE_MISSING, NULL);
+ if (s) {
+ if (networkstatus_set_current_consensus(s, 1, 1)) {
+ log_info(LD_FS, "Couldn't load consensus networkstatus from \"%s\"",
+ options->FallbackNetworkstatusFile);
+ } else {
+ log_notice(LD_FS, "Loaded fallback consensus networkstaus from \"%s\"",
+ options->FallbackNetworkstatusFile);
+ }
+ tor_free(s);
+ }
+ }
+
routers_update_all_from_networkstatus(time(NULL));
return 0;
diff --git a/src/or/or.h b/src/or/or.h
index ae5d26666..46fffeced 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -2174,6 +2174,9 @@ typedef struct {
int V3AuthDistDelay;
/** The number of intervals we think a consensus should be valid. */
int V3AuthNIntervalsValid;
+
+ /** DOCDOC here and in tor.1 */
+ char *FallbackNetworkstatusFile;
} or_options_t;
/** Persistent state for an onion router, as saved to disk. */