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.
This commit is contained in:
George Kadianakis
2012-03-31 13:54:09 +02:00
parent da6e0993dc
commit fedf76a2e6
2 changed files with 24 additions and 12 deletions
+23 -12
View File
@@ -1216,6 +1216,20 @@ consider_publishable_server(int force)
}
}
/** Return the port of the first active listener of type
* <b>listener_type</b>. */
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;
}
+1
View File
@@ -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);