aboutsummaryrefslogtreecommitdiff
path: root/src/or/connection.c
diff options
context:
space:
mode:
authorLinus Nordberg <linus@torproject.org>2012-09-20 17:09:25 +0200
committerLinus Nordberg <linus@torproject.org>2012-09-20 17:09:25 +0200
commit1cbf45bed1451997e0815bedca8e816d87e081ce (patch)
tree5751a090bff30421dbc4682e38074a56687be5e6 /src/or/connection.c
parentcff3b8c93cf312956e629b4caab8f5e48d1e10dd (diff)
downloadtor-1cbf45bed1451997e0815bedca8e816d87e081ce.tar
tor-1cbf45bed1451997e0815bedca8e816d87e081ce.tar.gz
Make option OutboundBindAddress accept IPv6 addresses too.
Implements ticket 6786.
Diffstat (limited to 'src/or/connection.c')
-rw-r--r--src/or/connection.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/src/or/connection.c b/src/or/connection.c
index d8f5d875c..d64c676bf 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -1377,23 +1377,34 @@ connection_connect(connection_t *conn, const char *address,
make_socket_reuseable(s);
- if (options->OutboundBindAddress && !tor_addr_is_loopback(addr)) {
- struct sockaddr_in ext_addr;
-
- memset(&ext_addr, 0, sizeof(ext_addr));
- ext_addr.sin_family = AF_INET;
- ext_addr.sin_port = 0;
- if (!tor_inet_aton(options->OutboundBindAddress, &ext_addr.sin_addr)) {
- log_warn(LD_CONFIG,"Outbound bind address '%s' didn't parse. Ignoring.",
- options->OutboundBindAddress);
- } else {
- if (bind(s, (struct sockaddr*)&ext_addr,
- (socklen_t)sizeof(ext_addr)) < 0) {
- *socket_error = tor_socket_errno(s);
- log_warn(LD_NET,"Error binding network socket: %s",
- tor_socket_strerror(*socket_error));
- tor_close_socket(s);
- return -1;
+ if (!tor_addr_is_loopback(addr)) {
+ const tor_addr_t *ext_addr = NULL;
+ if (protocol_family == AF_INET &&
+ !tor_addr_is_null(&options->_OutboundBindAddressIPv4))
+ ext_addr = &options->_OutboundBindAddressIPv4;
+ else if (protocol_family == AF_INET6 &&
+ !tor_addr_is_null(&options->_OutboundBindAddressIPv6))
+ ext_addr = &options->_OutboundBindAddressIPv6;
+ if (ext_addr) {
+ struct sockaddr_storage ext_addr_sa;
+ socklen_t ext_addr_len = 0;
+ memset(&ext_addr_sa, 0, sizeof(ext_addr_sa));
+ ext_addr_len = tor_addr_to_sockaddr(ext_addr, 0,
+ (struct sockaddr *) &ext_addr_sa,
+ sizeof(ext_addr_sa));
+ if (ext_addr_len == 0) {
+ log_warn(LD_NET,
+ "Error converting OutboundBindAddress %s into sockaddr. "
+ "Ignoring.", fmt_addr(ext_addr));
+ } else {
+ if (bind(s, (struct sockaddr *) &ext_addr_sa, ext_addr_len) < 0) {
+ *socket_error = tor_socket_errno(s);
+ log_warn(LD_NET,"Error binding network socket to %s: %s",
+ fmt_addr(ext_addr),
+ tor_socket_strerror(*socket_error));
+ tor_close_socket(s);
+ return -1;
+ }
}
}
}