]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Remember which of our guards are directory caches
authorNick Mathewson <nickm@torproject.org>
Tue, 11 Dec 2012 16:43:27 +0000 (11:43 -0500)
committerNick Mathewson <nickm@torproject.org>
Wed, 26 Dec 2012 04:10:41 +0000 (23:10 -0500)
src/or/entrynodes.c
src/or/entrynodes.h

index 8712241f629816bfa83cc4e1af9bcf94213f3fa6..f013481c38357168731a9d26eb81338107744685 100644 (file)
@@ -125,6 +125,15 @@ entry_guard_set_status(entry_guard_t *e, const node_t *node,
     control_event_guard(e->nickname, e->identity, "GOOD");
     changed = 1;
   }
+
+  if (node) {
+    int is_dir = node_is_dir(node) != 0;
+    if (e->is_dir_cache != is_dir) {
+      e->is_dir_cache = is_dir;
+      changed = 1;
+    }
+  }
+
   return changed;
 }
 
@@ -341,6 +350,7 @@ add_an_entry_guard(const node_t *chosen, int reset_status, int prepend)
            node_describe(node));
   strlcpy(entry->nickname, node_get_nickname(node), sizeof(entry->nickname));
   memcpy(entry->identity, node->identity, DIGEST_LEN);
+  entry->is_dir_cache = node_is_dir(node) != 0;
   /* Choose expiry time smudged over the past month. The goal here
    * is to a) spread out when Tor clients rotate their guards, so they
    * don't all select them on the same day, and b) avoid leaving a
@@ -972,6 +982,17 @@ entry_guards_parse_state(or_state_t *state, int set, char **msg)
                             "Bad hex digest for EntryGuard");
         }
       }
+      if (smartlist_len(args) >= 3) {
+        const char *is_cache = smartlist_get(args, 2);
+        if (!strcasecmp(is_cache, "DirCache")) {
+          node->is_dir_cache = 1;
+        } else if (!strcasecmp(is_cache, "NoDirCache")) {
+          node->is_dir_cache = 0;
+        } else {
+          log_warn(LD_CONFIG, "Bogus third argument to EntryGuard line: %s",
+                   escaped(is_cache));
+        }
+      }
       SMARTLIST_FOREACH(args, char*, cp, tor_free(cp));
       smartlist_free(args);
       if (*msg)
@@ -1138,7 +1159,8 @@ entry_guards_update_state(or_state_t *state)
       *next = line = tor_malloc_zero(sizeof(config_line_t));
       line->key = tor_strdup("EntryGuard");
       base16_encode(dbuf, sizeof(dbuf), e->identity, DIGEST_LEN);
-      tor_asprintf(&line->value, "%s %s", e->nickname, dbuf);
+      tor_asprintf(&line->value, "%s %s %sDirCache", e->nickname, dbuf,
+                   e->is_dir_cache ? "" : "No");
       next = &(line->next);
       if (e->unreachable_since) {
         *next = line = tor_malloc_zero(sizeof(config_line_t));
index 4d031c35938924d797111084f5850b67001756bd..24f2eeffe9504a1f22ff2dfb2c45a3c40c55b269 100644 (file)
@@ -35,6 +35,7 @@ typedef struct entry_guard_t {
                                       * for this node already? */
   unsigned int path_bias_disabled : 1; /**< Have we disabled this node because
                                         * of path bias issues? */
+  unsigned int is_dir_cache : 1; /**< DOCDOC */
   time_t bad_since; /**< 0 if this guard is currently usable, or the time at
                       * which it was observed to become (according to the
                       * directory or the user configuration) unusable. */