|
@@ -3485,7 +3485,9 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
|
|
|
char serviceid[REND_SERVICE_ID_LEN_BASE32+1];
|
|
|
smartlist_t *matching_ports;
|
|
|
rend_service_port_config_t *chosen_port;
|
|
|
- int unix_addrs;
|
|
|
+#ifndef HAVE_SYS_UN_H
|
|
|
+ int unix_addrs_rejected;
|
|
|
+#endif /* !defined(HAVE_SYS_UN_H) */
|
|
|
|
|
|
tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED);
|
|
|
tor_assert(circ->rend_data);
|
|
@@ -3501,45 +3503,58 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
|
|
|
return -2;
|
|
|
}
|
|
|
matching_ports = smartlist_new();
|
|
|
- unix_addrs = 0;
|
|
|
+#ifndef HAVE_SYS_UN_H
|
|
|
+ unix_addrs_rejected = 0;
|
|
|
+#endif /* !defined(HAVE_SYS_UN_H) */
|
|
|
SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p,
|
|
|
{
|
|
|
- /*
|
|
|
- * TODO don't just ignore AF_UNIX ports, but set up edge_connection_t
|
|
|
- * properly to use them.
|
|
|
- */
|
|
|
if (conn->base_.port == p->virtual_port) {
|
|
|
+#ifdef HAVE_SYS_UN_H
|
|
|
+ smartlist_add(matching_ports, p);
|
|
|
+#else
|
|
|
if (!(p->is_unix_addr)) {
|
|
|
smartlist_add(matching_ports, p);
|
|
|
} else {
|
|
|
- ++unix_addrs;
|
|
|
+ if (unix_addrs_rejected == 0) {
|
|
|
+ /* If we have no support, bitch about it for just the first one */
|
|
|
+ log_warn(LD_REND,
|
|
|
+ "Saw AF_UNIX virtual port mapping for port %d on service "
|
|
|
+ "%s, which is unsupported on this platform. Ignoring it.",
|
|
|
+ conn->base_.port, serviceid);
|
|
|
+ }
|
|
|
+ ++unix_addrs_rejected;
|
|
|
}
|
|
|
+#endif /* defined(HAVE_SYS_UN_H) */
|
|
|
}
|
|
|
});
|
|
|
chosen_port = smartlist_choose(matching_ports);
|
|
|
smartlist_free(matching_ports);
|
|
|
if (chosen_port) {
|
|
|
- tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr);
|
|
|
- conn->base_.port = chosen_port->real_port;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if (!unix_addrs) {
|
|
|
- log_info(LD_REND,
|
|
|
- "No virtual port mapping exists for port %d on service %s",
|
|
|
- conn->base_.port, serviceid);
|
|
|
- } else {
|
|
|
#ifdef HAVE_SYS_UN_H
|
|
|
- log_info(LD_REND,
|
|
|
- "Only AF_UNIX virtual port mappings exists for port %d "
|
|
|
- "on service %s, and support is not yet implemented",
|
|
|
- conn->base_.port, serviceid);
|
|
|
+ if (!(chosen_port->is_unix_addr)) {
|
|
|
#else
|
|
|
- log_info(LD_REND,
|
|
|
- "Only AF_UNIX virtual port mappings exists for port %d "
|
|
|
- "on service %s, and support is not available on this platform",
|
|
|
- conn->base_.port, serviceid);
|
|
|
+ {
|
|
|
#endif /* defined(HAVE_SYS_UN_H) */
|
|
|
+ /* Get a non-AF_UNIX connection ready for connection_exit_connect() */
|
|
|
+ tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr);
|
|
|
+ conn->base_.port = chosen_port->real_port;
|
|
|
+#ifdef HAVE_SYS_UN_H
|
|
|
+ } else {
|
|
|
+ /* Get an AF_UNIX connection ready for connection_exit_connect() */
|
|
|
+ conn->base_.socket_family = AF_UNIX;
|
|
|
+ tor_addr_make_unspec(&conn->base_.addr);
|
|
|
+ conn->base_.port = 1;
|
|
|
+ conn->base_.address = tor_strdup(chosen_port->unix_addr);
|
|
|
+#endif /* defined(HAVE_SYS_UN_H) */
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
+
|
|
|
+ log_info(LD_REND,
|
|
|
+ "No virtual port mapping exists for port %d on service %s",
|
|
|
+ conn->base_.port, serviceid);
|
|
|
+
|
|
|
if (service->allow_unknown_ports)
|
|
|
return -1;
|
|
|
else
|