From e258276c2bc0d334c2133e78acab33341c87e59b Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 10 Apr 2006 01:35:56 +0000 Subject: [PATCH] Change a dumb interface. Also, increment trusted_dir_server_t.n_networkstatus_failures when an all.z download fails entirely or partially. svn:r6345 --- src/or/directory.c | 15 ++++++++++++++- src/or/dirserv.c | 2 +- src/or/or.h | 2 +- src/or/routerlist.c | 12 ++++++------ 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 *outp 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