summaryrefslogtreecommitdiff
path: root/src/or/routerlist.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-10-14 01:44:32 +0000
committerNick Mathewson <nickm@torproject.org>2004-10-14 01:44:32 +0000
commit0d5a847f12724d1a86898ca3246850c06ceaebf1 (patch)
tree69b36dff2fd5411525ff0f99540c3b4268058255 /src/or/routerlist.c
parent55634e4eec5924985d74c8590b6a8c7291988e9c (diff)
downloadtor-0d5a847f12724d1a86898ca3246850c06ceaebf1.tar.gz
tor-0d5a847f12724d1a86898ca3246850c06ceaebf1.zip
Remove need for dirservers file: now, we note trusted dirservers in configuration options, and only need to remember addr:port and key digest for each one.
svn:r2479
Diffstat (limited to 'src/or/routerlist.c')
-rw-r--r--src/or/routerlist.c63
1 files changed, 17 insertions, 46 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 91575d7f1f..e942e9623b 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -22,7 +22,7 @@ static smartlist_t *trusted_dir_servers = NULL;
/* static function prototypes */
static routerinfo_t *
-router_pick_directory_server_impl(int requireauth, int requireothers, int fascistfirewall);
+router_pick_directory_server_impl(int requireothers, int fascistfirewall);
static trusted_dir_server_t *
router_pick_trusteddirserver_impl(int requireother, int fascistfirewall);
static void mark_all_trusteddirservers_up(void);
@@ -49,17 +49,6 @@ int router_reload_router_list(void)
{
char filename[512];
routerlist_clear_trusted_directories();
- if (options.RouterFile) {
- log_fn(LOG_INFO, "Loading router list from %s", options.RouterFile);
- if (router_load_routerlist_from_file(options.RouterFile, 1) < 0) {
- log_fn(LOG_ERR,"Error loading router list '%s'.", options.RouterFile);
- return -1;
- }
- } else {
- log_fn(LOG_INFO, "Loading internal default router list.");
- if (config_assign_default_dirservers() < 0)
- return -1;
- }
if (get_data_directory(&options)) {
char *s;
snprintf(filename,sizeof(filename),"%s/cached-directory", get_data_directory(&options));
@@ -70,7 +59,7 @@ int router_reload_router_list(void)
if (router_load_routerlist_from_directory(s, NULL, 0) < 0) {
log_fn(LOG_WARN, "Cached directory '%s' was unparseable; ignoring.", filename);
}
- if(routerlist->published_on > time(NULL) - OLD_MIN_ONION_KEY_LIFETIME/2) {
+ if( routerlist && routerlist->published_on > time(NULL) - OLD_MIN_ONION_KEY_LIFETIME/2) {
/* XXX use new onion key lifetime when 0.0.8 servers are obsolete */
directory_has_arrived(); /* do things we've been waiting to do */
}
@@ -84,22 +73,25 @@ int router_reload_router_list(void)
* in our routerlist, set all the authoritative ones as running again,
* and pick one. If there are no dirservers at all in our routerlist,
* reload the routerlist and try one last time. */
-routerinfo_t *router_pick_directory_server(int requireauth, int requireothers) {
+routerinfo_t *router_pick_directory_server(int requireothers) {
routerinfo_t *choice;
- choice = router_pick_directory_server_impl(requireauth, requireothers, options.FascistFirewall);
+ if (!routerlist)
+
+
+ choice = router_pick_directory_server_impl(requireothers, options.FascistFirewall);
if(choice)
return choice;
- log_fn(LOG_INFO,"No dirservers are reachable. Trying them all again.");
+ log_fn(LOG_INFO,"No reachable router entries for dirservers. Trying them all again.");
/* mark all authdirservers as up again */
mark_all_trusteddirservers_up();
/* try again */
- choice = router_pick_directory_server_impl(requireauth, requireothers, 0);
+ choice = router_pick_directory_server_impl(requireothers, options.FascistFirewall);
if(choice)
return choice;
- log_fn(LOG_WARN,"Still no dirservers %s. Reloading and trying again.",
+ log_fn(LOG_INFO,"Still no %s router entries. Reloading and trying again.",
options.FascistFirewall ? "reachable" : "known");
has_fetched_directory=0; /* reset it */
routerlist_clear_trusted_directories();
@@ -107,7 +99,7 @@ routerinfo_t *router_pick_directory_server(int requireauth, int requireothers) {
return NULL;
}
/* give it one last try */
- choice = router_pick_directory_server_impl(requireauth, requireothers, 0);
+ choice = router_pick_directory_server_impl(requireothers, 0);
return choice;
}
@@ -143,7 +135,7 @@ trusted_dir_server_t *router_pick_trusteddirserver(int requireothers) {
* it has to be a trusted server. If requireothers, it cannot be us.
*/
static routerinfo_t *
-router_pick_directory_server_impl(int requireauth, int requireothers, int fascistfirewall)
+router_pick_directory_server_impl(int requireothers, int fascistfirewall)
{
int i;
routerinfo_t *router;
@@ -159,8 +151,6 @@ router_pick_directory_server_impl(int requireauth, int requireothers, int fascis
router = smartlist_get(routerlist->routers, i);
if(!router->is_running || !router->dir_port)
continue;
- if(requireauth && !router->is_trusted_dir)
- continue;
if(requireothers && router_is_me(router))
continue;
if(fascistfirewall) {
@@ -224,24 +214,11 @@ static void mark_all_trusteddirservers_up(void) {
/** Return 0 if \exists an authoritative dirserver that's currently
* thought to be running, else return 1.
*/
-int all_directory_servers_down(void) {
- int i;
- routerinfo_t *router;
- if(!routerlist)
- return 1; /* if no dirservers, I guess they're all down */
- for(i=0;i< smartlist_len(routerlist->routers); i++) {
- router = smartlist_get(routerlist->routers, i);
- if(router->is_running && router->is_trusted_dir) {
- tor_assert(router->dir_port > 0);
- return 0;
- }
- }
- /* XXXX NM look at trusted_dir_servers instead.
+int all_trusted_directory_servers_down(void) {
if (!trusted_dir_servers)
return 1;
SMARTLIST_FOREACH(trusted_dir_servers, trusted_dir_server_t *, dir,
if (dir->is_running) return 0);
- */
return 1;
}
@@ -680,15 +657,14 @@ int router_add_to_routerlist(routerinfo_t *router) {
*/
for (i = 0; i < smartlist_len(routerlist->routers); ++i) {
r = smartlist_get(routerlist->routers, i);
+
+ r->is_trusted_dir = router_digest_is_trusted_dir(r->identity_digest);
+
if (!crypto_pk_cmp_keys(router->identity_pkey, r->identity_pkey)) {
if (router->published_on > r->published_on) {
log_fn(LOG_DEBUG, "Replacing entry for router '%s/%s' [%s]",
router->nickname, r->nickname, hex_str(id_digest,DIGEST_LEN));
/* Remember whether we trust this router as a dirserver. */
- /*XXXXNM first test is redundant; second should move elsewhere */
- if (r->is_trusted_dir ||
- router_digest_is_trusted_dir(router->identity_digest))
- router->is_trusted_dir = 1;
/* If the address hasn't changed; no need to re-resolve. */
if (!strcasecmp(r->address, router->address))
router->addr = r->addr;
@@ -698,10 +674,6 @@ int router_add_to_routerlist(routerinfo_t *router) {
} else {
log_fn(LOG_DEBUG, "Skipping old entry for router '%s'",
router->nickname);
- /* If we now trust 'router', then we trust the one in the routerlist
- * too. */
- if (router->is_trusted_dir)
- r->is_trusted_dir = 1;
/* Update the is_running status to whatever we were told. */
r->is_running = router->is_running;
routerinfo_free(router);
@@ -803,7 +775,6 @@ void routerlist_clear_trusted_directories(void)
SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, r,
r->is_trusted_dir = 0);
}
- clear_trusted_dir_servers();
}
/** Helper function: read routerinfo elements from s, and throw out the
@@ -1154,7 +1125,7 @@ void add_trusted_dir_server(const char *addr, uint16_t port, const char *digest)
ent = tor_malloc(sizeof(trusted_dir_server_t));
ent->address = tor_strdup(addr);
- ent->addr = a;
+ ent->addr = ntohl(a);
ent->dir_port = port;
ent->is_running = 1;
memcpy(ent->digest, digest, DIGEST_LEN);