diff options
author | Roger Dingledine <arma@torproject.org> | 2002-09-26 12:09:10 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2002-09-26 12:09:10 +0000 |
commit | 01f6727306c784f790fcf50077007a8b958c4e03 (patch) | |
tree | b639469b98752910f59562bc018c0d5e9707aa49 /src/or/main.c | |
parent | d6360c57bc888ee61705ea56918a0256afe2f68c (diff) | |
download | tor-01f6727306c784f790fcf50077007a8b958c4e03.tar tor-01f6727306c784f790fcf50077007a8b958c4e03.tar.gz |
directory servers in and functional
proxies now periodically pull down an hourly-updated directory,
and replace their router list with it if it parses correctly.
svn:r112
Diffstat (limited to 'src/or/main.c')
-rw-r--r-- | src/or/main.c | 139 |
1 files changed, 86 insertions, 53 deletions
diff --git a/src/or/main.c b/src/or/main.c index ccf98f655..7a1fbc39f 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -21,10 +21,6 @@ static int please_dumpstats=0; /* whether we should dump stats during the loop * /* private key */ static crypto_pk_env_t *prkey; -/* router array */ -static routerinfo_t **router_array = NULL; -static int rarray_len = 0; - /********* END VARIABLES ************/ /**************************************************************************** @@ -154,44 +150,6 @@ connection_t *connection_get_by_type(int type) { -/* the next 4 functions should move to routers.c once we get it - * cleaned up more. The router_array and rarray_len variables should - * move there too. - */ - -routerinfo_t *router_get_by_addr_port(uint32_t addr, uint16_t port) { - int i; - routerinfo_t *router; - - assert(router_array); - - for(i=0;i<rarray_len;i++) { - router = router_array[i]; - if ((router->addr == addr) && (router->or_port == port)) - return router; - } - - return NULL; -} - -routerinfo_t *router_get_first_in_route(unsigned int *route, int routelen) { - return router_array[route[routelen-1]]; -} - -/* a wrapper around new_route. put all these in routers.c perhaps? */ -unsigned int *router_new_route(int *routelen) { - return new_route(options.CoinWeight, router_array, rarray_len, routelen); -} - -/* a wrapper around create_onion */ -unsigned char *router_create_onion(unsigned int *route, int routelen, int *len, crypt_path_t **cpath) { - return create_onion(router_array,rarray_len,route,routelen,len,cpath); -} - - - - - /* FIXME can we cut this function out? */ connection_t *connect_to_router_as_op(routerinfo_t *router) { return connection_connect_to_router_as_op(router, options.ORPort); @@ -252,12 +210,13 @@ void check_conn_read(int i) { retval = connection_or_handle_listener_read(conn); } else if (conn->type == CONN_TYPE_AP_LISTENER) { retval = connection_ap_handle_listener_read(conn); + } else if (conn->type == CONN_TYPE_DIR_LISTENER) { + retval = connection_dir_handle_listener_read(conn); } else { - /* else it's an OP, OR, or exit */ retval = connection_read_to_buf(conn); if (retval >= 0) { /* all still well */ retval = connection_process_inbuf(conn); -// log(LOG_DEBUG,"check_conn_read(): connection_process_inbuf returned %d.",retval); +// log(LOG_DEBUG,"check_conn_read(): connection_process_inbuf returned %d.",retval); if(retval >= 0 && !connection_state_is_open(conn) && conn->receiver_bucket == 0) { log(LOG_DEBUG,"check_conn_read(): receiver bucket reached 0 before handshake finished. Closing."); retval = -1; @@ -286,8 +245,7 @@ void check_conn_write(int i) { conn = connection_array[i]; // log(LOG_DEBUG,"check_conn_write(): socket %d wants to write.",conn->s); - if(conn->type == CONN_TYPE_OP_LISTENER || - conn->type == CONN_TYPE_OR_LISTENER) { + if(connection_is_listener(conn)) { log(LOG_DEBUG,"check_conn_write(): Got a listener socket. Can't happen!"); retval = -1; } else { @@ -337,6 +295,8 @@ int prepare_for_poll(int *timeout) { connection_t *tmpconn; struct timeval now, soonest; static int current_second = 0; /* from previous calls to gettimeofday */ + static int time_to_rebuild_directory = 0; + static int time_to_fetch_directory = 0; int ms_until_conn; *timeout = -1; /* set it to never timeout, possibly overridden below */ @@ -352,6 +312,34 @@ int prepare_for_poll(int *timeout) { if(gettimeofday(&now,NULL) < 0) return -1; + if(options.Role & ROLE_DIR_SERVER) { + if(time_to_rebuild_directory < now.tv_sec) { + /* it's time to rebuild our directory */ + if(time_to_rebuild_directory == 0) { + /* we just started up. if we build a directory now it will be meaningless. */ + log(LOG_DEBUG,"prepare_for_poll(): Delaying initial dir build for 15 seconds."); + time_to_rebuild_directory = now.tv_sec + 15; /* try in 15 seconds */ + } else { + directory_rebuild(); + time_to_rebuild_directory = now.tv_sec + options.DirRebuildPeriod; + } + } + *timeout = 1000*(time_to_rebuild_directory - now.tv_sec) + (1000 - (now.tv_usec / 1000)); +// log(LOG_DEBUG,"prepare_for_poll(): DirBuild timeout is %d",*timeout); + } + + if(!(options.Role & ROLE_DIR_SERVER)) { + if(time_to_fetch_directory < now.tv_sec) { + /* it's time to fetch a new directory */ + /* NOTE directory servers do not currently fetch directories. + * Hope this doesn't bite us later. + */ + directory_initiate_fetch(router_pick_directory_server()); + time_to_fetch_directory = now.tv_sec + options.DirFetchPeriod; + } + *timeout = 1000*(time_to_fetch_directory - now.tv_sec) + (1000 - (now.tv_usec / 1000)); + } + if(need_to_refill_buckets) { if(now.tv_sec > current_second) { /* the second has already rolled over! */ // log(LOG_DEBUG,"prepare_for_poll(): The second has rolled over, immediately refilling."); @@ -359,8 +347,8 @@ int prepare_for_poll(int *timeout) { connection_increment_receiver_bucket(connection_array[i]); current_second = now.tv_sec; /* remember which second it is, for next time */ } + /* this timeout is definitely sooner than either of the above two */ *timeout = 1000 - (now.tv_usec / 1000); /* how many milliseconds til the next second? */ -// log(LOG_DEBUG,"prepare_for_poll(): %d milliseconds til next second.",*timeout); } if(options.LinkPadding) { @@ -406,9 +394,7 @@ int do_main_loop(void) { int poll_result; /* load the routers file */ - router_array = router_get_list_from_file(options.RouterFile,&rarray_len, options.ORPort); - if (!router_array) - { + if(router_get_list_from_file(options.RouterFile, options.ORPort) < 0) { log(LOG_ERR,"Error loading router list."); return -1; } @@ -429,8 +415,8 @@ int do_main_loop(void) { /* start-up the necessary connections based on global_role. This is where we * try to connect to all the other ORs, and start the listeners */ - retry_all_connections(options.Role, router_array, rarray_len, prkey, - options.ORPort, options.OPPort, options.APPort); + retry_all_connections(options.Role, prkey, options.ORPort, + options.OPPort, options.APPort, options.DirPort); for(;;) { if(please_dumpstats) { @@ -496,7 +482,7 @@ void dumpstats (void) { /* dump stats to stdout */ int i; connection_t *conn; extern char *conn_type_to_string[]; - extern char *conn_state_to_string[][10]; + extern char *conn_state_to_string[][15]; printf("Dumping stats:\n"); @@ -515,6 +501,53 @@ void dumpstats (void) { /* dump stats to stdout */ please_dumpstats = 0; } +void dump_directory_to_string(char *s, int maxlen) { + int i; + connection_t *conn; + char *pkey; + int pkeylen; + int written; + routerinfo_t *router; + + for(i=0;i<nfds;i++) { + conn = connection_array[i]; + + if(conn->type != CONN_TYPE_OR) + continue; /* we only want to list ORs */ + router = router_get_by_addr_port(conn->addr,conn->port); + if(!router) { + log(LOG_ERR,"dump_directory_to_string(): couldn't find router %d:%d!",conn->addr,conn->port); + return; + } + if(crypto_pk_write_public_key_to_string(router->pkey,&pkey,&pkeylen)<0) { + log(LOG_ERR,"dump_directory_to_string(): write pkey to string failed!"); + return; + } + written = snprintf(s, maxlen, "%s %d %d %d %d %d\n%s\n", + router->address, + router->or_port, + router->op_port, + router->ap_port, + router->dir_port, + router->bandwidth, + pkey); + + free(pkey); + + if(written < 0 || written > maxlen) { + /* apparently different glibcs do different things on error.. so check both */ + log(LOG_ERR,"dump_directory_to_string(): tried to exceed string length."); + s[maxlen-1] = 0; /* make sure it's null terminated */ + return; + } + + maxlen -= written; + s += written; + + } + +} + int main(int argc, char *argv[]) { int retval = 0; |