Parcourir la source

Make running-routers fetch (apparently) work

svn:r2871
Nick Mathewson il y a 21 ans
Parent
commit
2078b136f6
2 fichiers modifiés avec 14 ajouts et 6 suppressions
  1. 12 5
      src/or/directory.c
  2. 2 1
      src/or/routerparse.c

+ 12 - 5
src/or/directory.c

@@ -140,10 +140,10 @@ directory_post_to_dirservers(uint8_t purpose, const char *payload,
     });
 }
 
-/** Start a connection to a random running directory server, using
- * connection purpose 'purpose' requesting 'payload' (length
- * 'payload_len').  The purpose should be one of
- * 'DIR_PURPOSE_FETCH_DIR' or 'DIR_PURPOSE_FETCH_RENDDESC'.
+/** Start a connection to a random running directory server, using connection
+ * purpose 'purpose' requesting 'payload' (length 'payload_len').  The purpose
+ * should be one of 'DIR_PURPOSE_FETCH_DIR' or 'DIR_PURPOSE_FETCH_RENDDESC' or
+ * 'DIR_PURPOSE_FETCH_RUNNING_LIST.'
  */
 void
 directory_get_from_dirserver(uint8_t purpose, const char *resource)
@@ -163,6 +163,9 @@ directory_get_from_dirserver(uint8_t purpose, const char *resource)
         ds = router_pick_trusteddirserver(1, get_options()->FascistFirewall);
       }
     }
+  } else if (purpose == DIR_PURPOSE_FETCH_RUNNING_LIST) {
+    /* right now, running-routers isn't cached, so ask a trusted directory */
+    ds = router_pick_trusteddirserver(0, get_options()->FascistFirewall);
   } else { // (purpose == DIR_PURPOSE_FETCH_RENDDESC)
     /* only ask authdirservers, any of them will do */
     /* Never use fascistfirewall; we're going via Tor. */
@@ -241,6 +244,9 @@ directory_initiate_command(const char *address, uint32_t addr,
     case DIR_PURPOSE_UPLOAD_RENDDESC:
       log_fn(LOG_DEBUG,"initiating hidden-service descriptor upload");
       break;
+    case DIR_PURPOSE_FETCH_RUNNING_LIST:
+      log_fn(LOG_DEBUG,"initiating running-routers fetch");
+      break;
     default:
       log_fn(LOG_ERR, "Unrecognized directory connection purpose.");
       tor_assert(0);
@@ -270,7 +276,8 @@ directory_initiate_command(const char *address, uint32_t addr,
   conn->state = DIR_CONN_STATE_CONNECTING;
 
   if(purpose == DIR_PURPOSE_FETCH_DIR ||
-     purpose == DIR_PURPOSE_UPLOAD_DIR) {
+     purpose == DIR_PURPOSE_UPLOAD_DIR ||
+     purpose == DIR_PURPOSE_FETCH_RUNNING_LIST) {
     /* then we want to connect directly */
     switch(connection_connect(conn, conn->address, addr, dir_port)) {
       case -1:

+ 2 - 1
src/or/routerparse.c

@@ -529,9 +529,10 @@ router_parse_runningrouters(const char *str)
   for (i=0;i<tok->n_args;++i) {
     smartlist_add(new_list->running_routers, tok->args[i]);
   }
+  tok->n_args = 0; /* Don't free the elements of tok->args. */
 
   if (!(tok = find_first_by_keyword(tokens, K_DIRECTORY_SIGNATURE))) {
-    log_fn(LOG_WARN, "Missing signature on directory");
+    log_fn(LOG_WARN, "Missing signature on running-routers");
     goto err;
   }
   declared_key = find_dir_signing_key(str);