diff options
-rw-r--r-- | configure.in | 6 | ||||
-rw-r--r-- | doc/TODO | 5 | ||||
-rw-r--r-- | src/config/Makefile.am | 6 | ||||
-rw-r--r-- | src/or/config.c | 4 | ||||
-rw-r--r-- | src/or/networkstatus.c | 20 | ||||
-rw-r--r-- | src/or/or.h | 3 |
6 files changed, 42 insertions, 2 deletions
diff --git a/configure.in b/configure.in index dbeb756ce9..08adf087df 100644 --- a/configure.in +++ b/configure.in @@ -619,6 +619,12 @@ AC_SUBST(LOCALSTATEDIR) AH_TEMPLATE([LOCALSTATEDIR], [Default location to store state files.]) AC_DEFINE_UNQUOTED(LOCALSTATEDIR,"$LOCALSTATEDIR") +dnl Note: this is not the same as Tor's "DataDir" config option. +DATADIR=`eval echo $datadir` +AC_SUBST(DATADIR) +AH_TEMPLATE([DATADIR], [Default location for platform-independent read-only data.]) +AC_DEFINE_UNQUOTED(DATADIR,"$DATADIR") + # Set CFLAGS _after_ all the above checks, since our warnings are stricter # than autoconf's macros like. if test $ac_cv_c_compiler_gnu = yes; then @@ -21,8 +21,9 @@ Things we'd like to do in 0.2.0.x: licenses for other components of the bundles. - Before the feature freeze: (Nick) - - Support for preconfigured mirror lists - - Use a pre-shipped fallback consensus. + o Support for preconfigured mirror lists + o Use a pre-shipped fallback consensus. + o Code to install a pre-defined fallback consensus . Download consensuses (et al) via if-modified-since o Implement backend support for sending if-modified-since o Use it for consensuses. diff --git a/src/config/Makefile.am b/src/config/Makefile.am index b440abc5c4..88dd2d4c59 100644 --- a/src/config/Makefile.am +++ b/src/config/Makefile.am @@ -3,3 +3,9 @@ confdir = $(sysconfdir)/tor EXTRA_DIST = conf_DATA = torrc.sample + +data_DATA = fallback-consensus + +# If we don't have it, fake it. +fallback-consensus: + touch fallback-consensus
\ No newline at end of file diff --git a/src/or/config.c b/src/or/config.c index 9997bfbe0e..1f9e7b0af6 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 c5716f3969..055da051f9 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 ae5d266666..46fffecedd 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. */ |