aboutsummaryrefslogtreecommitdiff
path: root/src/or/config.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2013-02-11 17:09:10 -0500
committerRoger Dingledine <arma@torproject.org>2013-02-11 17:09:10 -0500
commitcc896f7c84c221d7dcfff1e0155533dce3ac5518 (patch)
tree55ff5874885e1208f15f728274fa80694897a45c /src/or/config.c
parent719940df2bdfbd0f5ee02a9ca404f345d2fc49e8 (diff)
downloadtor-cc896f7c84c221d7dcfff1e0155533dce3ac5518.tar.gz
tor-cc896f7c84c221d7dcfff1e0155533dce3ac5518.zip
Teach resolve_my_address() to return a cached answer
I didn't make any of the callers use this feature yet.
Diffstat (limited to 'src/or/config.c')
-rw-r--r--src/or/config.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/or/config.c b/src/or/config.c
index 7ca20e46b4..e37b148b7d 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1908,12 +1908,16 @@ static uint32_t last_resolved_addr = 0;
* holding that hostname. (If we didn't get our address by resolving a
* hostname, set *<b>hostname_out</b> to NULL.)
*
+ * If <b>use_cached_addr</b> is true, and we have a plausible answer,
+ * provide that answer and return.
+ *
* XXXX ipv6
*/
int
resolve_my_address(int warn_severity, const or_options_t *options,
uint32_t *addr_out,
- const char **method_out, char **hostname_out)
+ const char **method_out, char **hostname_out,
+ int use_cached_addr)
{
struct in_addr in;
uint32_t addr; /* host order */
@@ -1931,6 +1935,18 @@ resolve_my_address(int warn_severity, const or_options_t *options,
tor_assert(addr_out);
/*
+ * Step zero: if used_cached_addr is true, and we have a cached answer,
+ * just return it and be done.
+ */
+
+ if (use_cached_addr && last_resolved_addr) {
+ *addr_out = last_resolved_addr;
+ if (method_out)
+ *method_out = "CACHED";
+ return 0;
+ }
+
+ /*
* Step one: Fill in 'hostname' to be our best guess.
*/
@@ -2343,7 +2359,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
if (authdir_mode(options)) {
/* confirm that our address isn't broken, so we can complain now */
uint32_t tmp;
- if (resolve_my_address(LOG_WARN, options, &tmp, NULL, NULL) < 0)
+ if (resolve_my_address(LOG_WARN, options, &tmp, NULL, NULL, 0) < 0)
REJECT("Failed to resolve/guess local address. See logs for details.");
}