From: George Kadianakis Date: Sat, 31 Mar 2012 11:54:09 +0000 (+0200) Subject: Introduce and use router_get_active_listener_port_by_type(). X-Git-Tag: tor-0.2.3.16-alpha~81^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fedf76a2e6452124c38ecc51cea6567b9d5cc23d;p=thirdparty%2Ftor.git Introduce and use router_get_active_listener_port_by_type(). router_get_active_listener_port_by_type() iterates all connections, trying to find a listener of a specific type, and returns its TCP port. --- diff --git a/src/or/router.c b/src/or/router.c index bf15689a15..67d26e13e0 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1216,6 +1216,20 @@ consider_publishable_server(int force) } } +/** Return the port of the first active listener of type + * listener_type. */ +uint16_t +router_get_active_listener_port_by_type(int listener_type) +{ + /* Iterate all connections, find one of the right kind and return + the port. Not very sophisticated or fast, but effective. */ + const connection_t *c = connection_get_by_type(listener_type); + if (c) + return c->port; + + return 0; +} + /** Return the port that we should advertise as our ORPort; this is either * the one configured in the ORPort option, or the one we actually bound to * if ORPort is "auto". @@ -1226,12 +1240,11 @@ router_get_advertised_or_port(const or_options_t *options) int port = get_primary_or_port(); (void)options; - if (port == CFG_AUTO_PORT) { - connection_t *c = connection_get_by_type(CONN_TYPE_OR_LISTENER); - if (c) - return c->port; - return 0; - } + /* If the port is in 'auto' mode, we have to use + router_get_listener_port_by_type(). */ + if (port == CFG_AUTO_PORT) + return router_get_active_listener_port_by_type(CONN_TYPE_OR_LISTENER); + return port; } @@ -1248,12 +1261,10 @@ router_get_advertised_dir_port(const or_options_t *options, uint16_t dirport) if (!dirport_configured) return dirport; - if (dirport_configured == CFG_AUTO_PORT) { - connection_t *c = connection_get_by_type(CONN_TYPE_DIR_LISTENER); - if (c) - return c->port; - return 0; - } + + if (dirport_configured == CFG_AUTO_PORT) + return router_get_active_listener_port_by_type(CONN_TYPE_DIR_LISTENER); + return dirport_configured; } diff --git a/src/or/router.h b/src/or/router.h index fb914349f3..294736e70c 100644 --- a/src/or/router.h +++ b/src/or/router.h @@ -53,6 +53,7 @@ int authdir_mode_publishes_statuses(const or_options_t *options); int authdir_mode_tests_reachability(const or_options_t *options); int authdir_mode_bridge(const or_options_t *options); +uint16_t router_get_active_listener_port_by_type(int listener_type); uint16_t router_get_advertised_or_port(const or_options_t *options); uint16_t router_get_advertised_dir_port(const or_options_t *options, uint16_t dirport);