From 9dea3a03b925f8cd83f2a975c4d5899f7691252d Mon Sep 17 00:00:00 2001 From: George Kadianakis Date: Thu, 23 Feb 2012 17:51:48 -0800 Subject: [PATCH] Add pluggable transport info to extra-info descriptors. --- src/or/router.c | 7 +++++++ src/or/transports.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/or/transports.h | 2 ++ 3 files changed, 54 insertions(+) diff --git a/src/or/router.c b/src/or/router.c index 352c456f1f..795afe2b3a 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -2344,6 +2344,13 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, } } + /* Add information about the pluggable transports we support. */ + if (options->ServerTransportPlugin) { + char *pluggable_transports = pt_get_extra_info_descriptor_string(); + if (pluggable_transports) + smartlist_add(chunks, pluggable_transports); + } + if (should_record_bridge_info(options) && write_stats_to_extrainfo) { const char *bridge_stats = geoip_get_bridge_stats_extrainfo(now); if (bridge_stats) { diff --git a/src/or/transports.c b/src/or/transports.c index e0492b8d6b..e5a54463de 100644 --- a/src/or/transports.c +++ b/src/or/transports.c @@ -1373,6 +1373,51 @@ pt_prepare_proxy_list_for_config_read(void) tor_assert(unconfigured_proxies_n == 0); } +/** Return the pluggable transport string that we should display in + * our extra-info descriptor. If we shouldn't display such a string, + * or we have nothing to display, return NULL. The string is + * allocated on the heap and it's the responsibility of the caller to + * free it. */ +char * +pt_get_extra_info_descriptor_string(void) +{ + char *the_string = NULL; + smartlist_t *string_chunks = NULL; + + if (!managed_proxy_list) + return NULL; + + string_chunks = smartlist_new(); + + /* For each managed proxy, add its transports to the chunks list. */ + SMARTLIST_FOREACH_BEGIN(managed_proxy_list, const managed_proxy_t *, mp) { + if ((!mp->is_server) || (mp->conf_state != PT_PROTO_COMPLETED)) + continue; + + tor_assert(mp->transports); + + SMARTLIST_FOREACH_BEGIN(mp->transports, const transport_t *, t) { + smartlist_add_asprintf(string_chunks, + "method %s %s:%u", + t->name, fmt_addr(&t->addr), t->port); + } SMARTLIST_FOREACH_END(t); + + } SMARTLIST_FOREACH_END(mp); + + if (smartlist_len(string_chunks) == 0) { + smartlist_free(string_chunks); + return NULL; + } + + /* Join all the chunks into the final string. */ + the_string = smartlist_join_strings(string_chunks, "\n", 1, NULL); + + SMARTLIST_FOREACH(string_chunks, char *, s, tor_free(s)); + smartlist_free(string_chunks); + + return the_string; +} + /** The tor config was read. * Destroy all managed proxies that were marked by a previous call to * prepare_proxy_list_for_config_read() and are not used by the new diff --git a/src/or/transports.h b/src/or/transports.h index 39f7bf4024..17d99dd754 100644 --- a/src/or/transports.h +++ b/src/or/transports.h @@ -46,6 +46,8 @@ void pt_configure_remaining_proxies(void); int pt_proxies_configuration_pending(void); +char *pt_get_extra_info_descriptor_string(void); + void pt_free_all(void); void pt_prepare_proxy_list_for_config_read(void);