Browse Source

Change a dumb interface. Also, increment trusted_dir_server_t.n_networkstatus_failures when an all.z download fails entirely or partially.

svn:r6345
Nick Mathewson 19 years ago
parent
commit
e258276c2b
4 changed files with 22 additions and 9 deletions
  1. 14 1
      src/or/directory.c
  2. 1 1
      src/or/dirserv.c
  3. 1 1
      src/or/or.h
  4. 6 6
      src/or/routerlist.c

+ 14 - 1
src/or/directory.c

@@ -89,7 +89,7 @@ directory_post_to_dirservers(uint8_t purpose, const char *payload,
   int post_via_tor;
   int post_to_v1_only;
 
-  router_get_trusted_dir_servers(&dirservers);
+  dirservers = router_get_trusted_dir_servers();
   tor_assert(dirservers);
   /* Only old dirservers handle rendezvous descriptor publishing. */
   post_to_v1_only = (purpose == DIR_PURPOSE_UPLOAD_RENDDESC);
@@ -296,6 +296,9 @@ connection_dir_download_networkstatus_failed(connection_t *conn)
   }
   if (!strcmpstart(conn->requested_resource, "all")) {
     /* We're a non-authoritative directory cache; try again. */
+    smartlist_t *trusted_dirs = router_get_trusted_dir_servers();
+    SMARTLIST_FOREACH(trusted_dirs, trusted_dir_server_t *, ds,
+                      ++ds->n_networkstatus_failures);
     directory_get_from_dirserver(conn->purpose, "all.z",
                                  0 /* don't retry_if_no_servers */);
   } else if (!strcmpstart(conn->requested_resource, "fp/")) {
@@ -993,6 +996,16 @@ connection_dir_client_reached_eof(connection_t *conn)
       which = smartlist_create();
       dir_split_resource_into_fingerprints(conn->requested_resource+3,
                                            which, NULL, 0);
+    } else if (conn->requested_resource &&
+               !strcmpstart(conn->requested_resource, "all")) {
+      which = smartlist_create();
+      SMARTLIST_FOREACH(router_get_trusted_dir_servers(),
+                        trusted_dir_server_t *, ds,
+        {
+          char *cp = tor_malloc(HEX_DIGEST_LEN+1);
+          base16_encode(cp, HEX_DIGEST_LEN+1, ds->digest, DIGEST_LEN);
+          smartlist_add(which, cp);
+        });
     }
     cp = body;
     while (*cp) {

+ 1 - 1
src/or/dirserv.c

@@ -969,7 +969,7 @@ dirserv_set_cached_networkstatus_v2(const char *networkstatus,
     digestmap_remove(cached_v2_networkstatus, identity);
   }
 
-  router_get_trusted_dir_servers(&trusted_dirs);
+  trusted_dirs = router_get_trusted_dir_servers();
   if (digestmap_size(cached_v2_networkstatus) >
       smartlist_len(trusted_dirs) + MAX_UNTRUSTED_NETWORKSTATUSES) {
     /* We need to remove the oldest untrusted networkstatus. */

+ 1 - 1
src/or/or.h

@@ -2290,7 +2290,7 @@ typedef struct trusted_dir_server_t {
 
 int router_reload_router_list(void);
 int router_reload_networkstatus(void);
-void router_get_trusted_dir_servers(smartlist_t **outp);
+smartlist_t *router_get_trusted_dir_servers(void);
 routerstatus_t *router_pick_directory_server(int requireother,
                                              int fascistfirewall,
                                              int for_v2_directory,

+ 6 - 6
src/or/routerlist.c

@@ -306,17 +306,17 @@ router_reload_router_list(void)
   return 0;
 }
 
-/** Set *<b>outp</b> to a smartlist containing a list of
- * trusted_dir_server_t * for all known trusted dirservers.  Callers
- * must not modify the list or its contents.
+/** Return a smartlist containing a list of trusted_dir_server_t * for all
+ * known trusted dirservers.  Callers must not modify the list or its
+ * contents.
  */
-void
-router_get_trusted_dir_servers(smartlist_t **outp)
+smartlist_t *
+router_get_trusted_dir_servers(void)
 {
   if (!trusted_dir_servers)
     trusted_dir_servers = smartlist_create();
 
-  *outp = trusted_dir_servers;
+  return trusted_dir_servers;
 }
 
 /** Try to find a running dirserver. If there are no running dirservers