summaryrefslogtreecommitdiff
path: root/src/or/router.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-03-11 17:20:43 -0400
committerNick Mathewson <nickm@torproject.org>2013-03-11 17:20:43 -0400
commit07e26005a6cb7e47f1f90fcf6a377dfaaaa56789 (patch)
tree995e5e2e2072f1ff15eb1e78dfa5c8f9cb15d18d /src/or/router.c
parent051b1e8ac4114fb23904cdf8dead72d585904e0a (diff)
downloadtor-07e26005a6cb7e47f1f90fcf6a377dfaaaa56789.tar.gz
tor-07e26005a6cb7e47f1f90fcf6a377dfaaaa56789.zip
Treat a changed IPv6 ORPort like an IPv4 one in retry_all_listeners()
Fix for bug 6026
Diffstat (limited to 'src/or/router.c')
-rw-r--r--src/or/router.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/or/router.c b/src/or/router.c
index 422fe5db2e..91de221b28 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -1459,13 +1459,18 @@ consider_publishable_server(int force)
/** XXX not a very good interface. it's not reliable when there are
multiple listeners. */
uint16_t
-router_get_active_listener_port_by_type(int listener_type)
+router_get_active_listener_port_by_type_af(int listener_type,
+ sa_family_t family)
{
/* 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;
+ smartlist_t *conns = get_connection_array();
+ SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
+ if (conn->type == listener_type && !conn->marked_for_close &&
+ conn->socket_family == family) {
+ return conn->port;
+ }
+ } SMARTLIST_FOREACH_END(conn);
return 0;
}
@@ -1477,13 +1482,24 @@ router_get_active_listener_port_by_type(int listener_type)
uint16_t
router_get_advertised_or_port(const or_options_t *options)
{
- int port = get_primary_or_port();
+ return router_get_advertised_or_port_by_af(options, AF_INET);
+}
+
+/** As router_get_advertised_or_port(), but allows an address family argument.
+ */
+uint16_t
+router_get_advertised_or_port_by_af(const or_options_t *options,
+ sa_family_t family)
+{
+ int port = get_first_advertised_port_by_type_af(CONN_TYPE_OR_LISTENER,
+ family);
(void)options;
/* 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 router_get_active_listener_port_by_type_af(CONN_TYPE_OR_LISTENER,
+ family);
return port;
}
@@ -1503,7 +1519,8 @@ router_get_advertised_dir_port(const or_options_t *options, uint16_t dirport)
return dirport;
if (dirport_configured == CFG_AUTO_PORT)
- return router_get_active_listener_port_by_type(CONN_TYPE_DIR_LISTENER);
+ return router_get_active_listener_port_by_type_af(CONN_TYPE_DIR_LISTENER,
+ AF_INET);
return dirport_configured;
}