[or-cvs] a whole swath of fixes
Roger Dingledine
arma at seul.org
Tue Jul 20 10:17:46 UTC 2004
Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/home2/arma/work/onion/cvs/src/or
Modified Files:
config.c connection.c dirserv.c main.c or.h router.c
routerparse.c
Log Message:
a whole swath of fixes
introduce an authdir_mode() macro to match the others.
don't initialize uptime to the number of seconds since 1970.
non-authoritative dirservers don't cache their directory on disk.
make only authdirservers use clique_mode.
only read approved-routers file if you're an authdirserver.
even authdirservers fetch a new directory in do_hup.
retry_all_connections() is now called retry_all_listeners().
router_parse_list_from_string() correctly reports the router number
it's working on.
only call dirserv_add_own_fingerprint() and
dirserv_add_descriptor() on startup if we're an authdirserver.
if AuthDir and !ORPort then fail.
if AuthDir and ClientOnly then fail.
Index: config.c
===================================================================
RCS file: /home/or/cvsroot/src/or/config.c,v
retrieving revision 1.127
retrieving revision 1.128
diff -u -d -r1.127 -r1.128
--- config.c 18 Jul 2004 21:47:04 -0000 1.127
+++ config.c 20 Jul 2004 10:17:43 -0000 1.128
@@ -726,9 +726,15 @@
result = -1;
}
- /* XXX008 if AuthDir and !ORPort then fail */
+ if(options->AuthoritativeDir && !options->ORPort) {
+ log(LOG_WARN,"Running as authoritative directory, but no ORPort set.");
+ result = -1;
+ }
- /* XXX008 if AuthDir and ClientOnly then fail */
+ if(options->AuthoritativeDir && options->ClientOnly) {
+ log(LOG_WARN,"Running as authoritative directory, but ClientOnly also set.");
+ result = -1;
+ }
if(options->SocksPort >= 1 &&
(options->PathlenCoinWeight < 0.0 || options->PathlenCoinWeight >= 1.0)) {
Index: connection.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection.c,v
retrieving revision 1.242
retrieving revision 1.243
diff -u -d -r1.242 -r1.243
--- connection.c 19 Jul 2004 23:26:21 -0000 1.242
+++ connection.c 20 Jul 2004 10:17:43 -0000 1.243
@@ -540,14 +540,9 @@
return 0;
}
-/** Start all connections that should be up but aren't.
- * - Connect to all ORs if you're an OR.
- * - Relaunch listeners for each port you have open.
+/** (Re)launch listeners for each port you should have open.
*/
-int retry_all_connections(void) {
- if(clique_mode()) {
- router_retry_connections();
- }
+int retry_all_listeners(void) {
if (retry_listeners(CONN_TYPE_OR_LISTENER, options.ORBindAddress,
options.ORPort, "0.0.0.0")<0)
Index: dirserv.c
===================================================================
RCS file: /home/or/cvsroot/src/or/dirserv.c,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -d -r1.60 -r1.61
--- dirserv.c 16 Jul 2004 23:05:40 -0000 1.60
+++ dirserv.c 20 Jul 2004 10:17:43 -0000 1.61
@@ -619,7 +619,6 @@
void dirserv_set_cached_directory(const char *directory, time_t when)
{
time_t now;
- char filename[512];
tor_assert(!options.AuthoritativeDir);
now = time(NULL);
if (when>cached_directory_published &&
@@ -628,10 +627,6 @@
cached_directory = tor_strdup(directory);
cached_directory_len = strlen(cached_directory);
cached_directory_published = when;
- sprintf(filename,"%s/cached-directory", get_data_directory(&options));
- if(write_str_to_file(filename,cached_directory) < 0) {
- log_fn(LOG_WARN, "Couldn't write cached directory to disk. Ignoring.");
- }
}
}
Index: main.c
===================================================================
RCS file: /home/or/cvsroot/src/or/main.c,v
retrieving revision 1.293
retrieving revision 1.294
diff -u -d -r1.293 -r1.294
--- main.c 18 Jul 2004 21:47:04 -0000 1.293
+++ main.c 20 Jul 2004 10:17:43 -0000 1.294
@@ -361,7 +361,7 @@
if(conn->type == CONN_TYPE_DIR &&
!conn->marked_for_close &&
conn->timestamp_lastwritten + 5*60 < now) {
- log_fn(LOG_WARN,"Expiring wedged directory conn (fd %d, purpose %d)", conn->s, conn->purpose);
+ log_fn(LOG_INFO,"Expiring wedged directory conn (fd %d, purpose %d)", conn->s, conn->purpose);
connection_mark_for_close(conn);
return;
}
@@ -403,28 +403,49 @@
* - We believe we are reachable from the outside.
*/
static int decide_if_publishable_server(time_t now) {
+ int r;
- if(options.AuthoritativeDir)
- return 1;
if(options.ClientOnly)
return 0;
if(!options.ORPort)
return 0;
+
+ /* XXX008 for now, you're only a server if you're a server */
+ return server_mode();
+
+
/* here, determine if we're reachable */
+ if(0) { /* we've recently failed to reach our IP/ORPort from the outside */
+ return 0;
+ }
- if(stats_n_seconds_uptime < MIN_UPTIME_TO_PUBLISH_DESC)
+ r = rep_hist_bandwidth_assess(now);
+
+
+// set_advertised_bandwidth(r);
+
+ if(r < MIN_BW_TO_PUBLISH_DESC)
return 0;
- if(rep_hist_bandwidth_assess(now) < MIN_BW_TO_PUBLISH_DESC)
+ if(options.AuthoritativeDir)
+ return 1;
+ if(stats_n_seconds_uptime < MIN_UPTIME_TO_PUBLISH_DESC)
return 0;
+
return 1;
}
-/** Return true iff we try to stay connected to all ORs at once. This
- * option should go away as Tor becomes more P2P.
+/** Return true iff we believe ourselves to be an authoritative
+ * directory server.
+ */
+int authdir_mode(void) {
+ return (options.AuthoritativeDir != 0);
+}
+
+/** Return true iff we try to stay connected to all ORs at once.
*/
int clique_mode(void) {
- return (options.ORPort != 0);
+ return authdir_mode();
}
/** Return true iff we are trying to be a server.
@@ -495,10 +516,10 @@
routerlist_remove_old_routers(); /* purge obsolete entries */
- if(options.AuthoritativeDir) {
+ if(authdir_mode()) {
/* We're a directory; dump any old descriptors. */
dirserv_remove_old_servers();
- /* dirservers try to reconnect too, in case connections have failed */
+ /* dirservers try to reconnect, in case connections have failed */
router_retry_connections();
}
@@ -582,7 +603,8 @@
if(now.tv_sec > current_second) { /* the second has rolled over. check more stuff. */
- stats_n_seconds_uptime += (now.tv_sec - current_second);
+ if(current_second)
+ stats_n_seconds_uptime += (now.tv_sec - current_second);
assert_all_pending_dns_resolves_ok();
run_scheduled_events(now.tv_sec);
assert_all_pending_dns_resolves_ok();
@@ -674,11 +696,11 @@
log_fn(LOG_ERR,"Error reloading rendezvous service keys");
exit(1);
}
- if(retry_all_connections() < 0) {
+ if(retry_all_listeners() < 0) {
log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
return -1;
}
- if(options.DirPort) {
+ if(authdir_mode()) {
/* reload the approved-routers file */
sprintf(keydir,"%s/approved-routers", get_data_directory(&options));
log_fn(LOG_INFO,"Reloading approved fingerprints from %s...",keydir);
@@ -688,10 +710,9 @@
/* Since we aren't fetching a directory, we won't retry rendezvous points
* when it gets in. Try again now. */
rend_services_introduce();
- } else {
- /* fetch a new directory */
- directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, NULL, 0);
}
+ /* Fetch a new directory. Even authdirservers do this. */
+ directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, NULL, 0);
if(server_mode()) {
/* Restart cpuworker and dnsworker processes, so they get up-to-date
* configuration options. */
@@ -736,20 +757,18 @@
}
}
- if(options.DirPort) { /* the directory is already here, run startup things */
- has_fetched_directory = 1;
+ if(authdir_mode()) {
+ /* the directory is already here, run startup things */
directory_has_arrived();
}
if(server_mode()) {
- cpu_init(); /* launch cpuworkers. Need to do this *after* we've read the onion key. */
+ /* launch cpuworkers. Need to do this *after* we've read the onion key. */
+ cpu_init();
}
- /* start up the necessary connections based on which ports are
- * non-zero. This is where we try to connect to all the other ORs,
- * and start the listeners.
- */
- if(retry_all_connections() < 0) {
+ /* start up the necessary listeners based on which ports are non-zero. */
+ if(retry_all_listeners() < 0) {
log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
return -1;
}
Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.383
retrieving revision 1.384
diff -u -d -r1.383 -r1.384
--- or.h 20 Jul 2004 06:44:16 -0000 1.383
+++ or.h 20 Jul 2004 10:17:43 -0000 1.384
@@ -1043,7 +1043,7 @@
void connection_expire_held_open(void);
int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port);
-int retry_all_connections(void);
+int retry_all_listeners(void);
void connection_bucket_init(void);
void connection_bucket_refill(struct timeval *now);
@@ -1194,6 +1194,7 @@
void connection_start_writing(connection_t *conn);
void directory_has_arrived(void);
+int authdir_mode(void);
int clique_mode(void);
int server_mode(void);
int exit_server_mode(void);
Index: router.c
===================================================================
RCS file: /home/or/cvsroot/src/or/router.c,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -d -r1.64 -r1.65
--- router.c 18 Jul 2004 21:47:04 -0000 1.64
+++ router.c 20 Jul 2004 10:17:43 -0000 1.65
@@ -280,20 +280,23 @@
}
/* 4. Dump router descriptor to 'router.desc' */
/* Must be called after keys are initialized. */
- if (!(router_get_my_descriptor())) {
+ tmp = mydesc = router_get_my_descriptor();
+ if (!mydesc) {
log_fn(LOG_ERR, "Error initializing descriptor.");
return -1;
}
- /* We need to add our own fingerprint so it gets recognized. */
- if (dirserv_add_own_fingerprint(options.Nickname, get_identity_key())) {
- log_fn(LOG_ERR, "Error adding own fingerprint to approved set");
- return -1;
- }
- tmp = mydesc = router_get_my_descriptor();
- if (dirserv_add_descriptor(&tmp) != 1) {
- log(LOG_ERR, "Unable to add own descriptor to directory.");
- return -1;
+ if(authdir_mode()) {
+ /* We need to add our own fingerprint so it gets recognized. */
+ if (dirserv_add_own_fingerprint(options.Nickname, get_identity_key())) {
+ log_fn(LOG_ERR, "Error adding own fingerprint to approved set");
+ return -1;
+ }
+ if (dirserv_add_descriptor(&tmp) != 1) {
+ log(LOG_ERR, "Unable to add own descriptor to directory.");
+ return -1;
+ }
}
+
sprintf(keydir,"%s/router.desc", datadir);
log_fn(LOG_INFO,"Dumping descriptor to %s...",keydir);
if (write_str_to_file(keydir, mydesc)) {
@@ -313,31 +316,26 @@
strcat(fingerprint, "\n");
if (write_str_to_file(keydir, fingerprint))
return -1;
- if(!options.DirPort)
+ if(!authdir_mode())
return 0;
- /* 6. [dirserver only] load approved-routers file */
+ /* 6. [authdirserver only] load approved-routers file */
sprintf(keydir,"%s/approved-routers", datadir);
log_fn(LOG_INFO,"Loading approved fingerprints from %s...",keydir);
if(dirserv_parse_fingerprint_file(keydir) < 0) {
log_fn(LOG_ERR, "Error loading fingerprints");
return -1;
}
- /* 7. [dirserver only] load old directory, if it's there */
+ /* 7. [authdirserver only] load old directory, if it's there */
sprintf(keydir,"%s/cached-directory", datadir);
log_fn(LOG_INFO,"Loading cached directory from %s...",keydir);
cp = read_file_to_str(keydir);
if(!cp) {
log_fn(LOG_INFO,"Cached directory %s not present. Ok.",keydir);
} else {
- if(options.AuthoritativeDir) {
- if(dirserv_load_from_directory_string(cp) < 0){
- log_fn(LOG_ERR, "Cached directory %s is corrupt", keydir);
- tor_free(cp);
- return -1;
- }
- } else {
- /* set time to 1 so it will be replaced on first download. */
- dirserv_set_cached_directory(cp, 1);
+ if(dirserv_load_from_directory_string(cp) < 0){
+ log_fn(LOG_ERR, "Cached directory %s is corrupt", keydir);
+ tor_free(cp);
+ return -1;
}
tor_free(cp);
}
@@ -510,6 +508,10 @@
log_fn(LOG_WARN, "Couldn't dump router to string.");
return -1;
}
+ /* XXX008 NM: no, we shouldn't just blindly assume we're an
+ * authdirserver just because our dir_port is set. We should
+ * take these next two lines out, and then set our is_trusted_dir
+ * variable if we find ourselves in the dirservers file. Yes/no? */
if (ri->dir_port)
ri->is_trusted_dir = 1;
return 0;
Index: routerparse.c
===================================================================
RCS file: /home/or/cvsroot/src/or/routerparse.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- routerparse.c 16 Jul 2004 23:33:42 -0000 1.14
+++ routerparse.c 20 Jul 2004 10:17:43 -0000 1.15
@@ -330,7 +330,7 @@
log_fn(LOG_WARN, "Unable to compute digest of directory");
goto err;
}
- log(LOG_DEBUG,"Received directory hashes to %s",hex_str(digest,4));
+ log_fn(LOG_DEBUG,"Received directory hashes to %s",hex_str(digest,4));
if ((end = strstr(str,"\nrouter "))) {
++end;
@@ -573,7 +573,6 @@
{
routerinfo_t *router;
smartlist_t *routers;
- int rarray_len = 0;
const char *end;
tor_assert(s && *s);
@@ -609,7 +608,7 @@
router->status_set_at = time(NULL);
}
smartlist_add(routers, router);
- log_fn(LOG_DEBUG,"just added router #%d.",rarray_len);
+ log_fn(LOG_DEBUG,"just added router #%d.",smartlist_len(routers));
}
if (*dest)
More information about the tor-commits
mailing list