summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2006-04-10 01:35:56 +0000
committerNick Mathewson <nickm@torproject.org>2006-04-10 01:35:56 +0000
commite258276c2bc0d334c2133e78acab33341c87e59b (patch)
tree8113aa7c6b304360d19a1723d5f9b6a1ae9b3edc
parent06c30fb8b7289ae7b239a3da0d8e733984b2f4dd (diff)
downloadtor-e258276c2bc0d334c2133e78acab33341c87e59b.tar.gz
tor-e258276c2bc0d334c2133e78acab33341c87e59b.zip
Change a dumb interface. Also, increment trusted_dir_server_t.n_networkstatus_failures when an all.z download fails entirely or partially.
svn:r6345
-rw-r--r--src/or/directory.c15
-rw-r--r--src/or/dirserv.c2
-rw-r--r--src/or/or.h2
-rw-r--r--src/or/routerlist.c12
4 files changed, 22 insertions, 9 deletions
diff --git a/src/or/directory.c b/src/or/directory.c
index a506b87a7c..e191ae0d06 100644
--- a/src/or/directory.c
+++ b/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) {
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index d62386aad7..c80f426381 100644
--- a/src/or/dirserv.c
+++ b/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. */
diff --git a/src/or/or.h b/src/or/or.h
index 15b8d8e842..c18e78f9a7 100644
--- a/src/or/or.h
+++ b/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,
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 2eb08d9874..09408a8f59 100644
--- a/src/or/routerlist.c
+++ b/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