diff --git a/gossipd/gossip.c b/gossipd/gossip.c index 7510d56e2..a1e88a1ef 100644 --- a/gossipd/gossip.c +++ b/gossipd/gossip.c @@ -147,7 +147,7 @@ struct daemon { /* Automatically reconnect. */ bool reconnect; - struct wireaddr *tor_proxyaddrs; + struct wireaddr *tor_proxyaddr; bool use_tor_proxy_always; }; @@ -1739,7 +1739,6 @@ static struct io_plan *gossip_init(struct daemon_conn *master, struct bitcoin_blkid chain_hash; u32 update_channel_interval; bool dev_allow_localhost; - daemon->tor_proxyaddrs = tal_arrz(daemon, struct wireaddr, 1); if (!fromwire_gossipctl_init( daemon, msg, &daemon->broadcast_interval, &chain_hash, @@ -1747,7 +1746,7 @@ static struct io_plan *gossip_init(struct daemon_conn *master, &daemon->localfeatures, &daemon->proposed_wireaddr, &daemon->proposed_listen_announce, daemon->rgb, daemon->alias, &update_channel_interval, &daemon->reconnect, - daemon->tor_proxyaddrs, &daemon->use_tor_proxy_always, + &daemon->tor_proxyaddr, &daemon->use_tor_proxy_always, &dev_allow_localhost)) { master_badmsg(WIRE_GOSSIPCTL_INIT, msg); } @@ -1929,7 +1928,7 @@ static struct io_plan *conn_init(struct io_conn *conn, struct reaching *reach) return io_close(conn); } - if (!use_tor && reach->daemon->tor_proxyaddrs->port > 0) { + if (!use_tor && reach->daemon->tor_proxyaddr) { /* We dont use tor proxy if we only have ip */ if (reach->daemon->use_tor_proxy_always || do_we_use_tor_addr(reach->daemon->announcable)) @@ -1940,7 +1939,7 @@ static struct io_plan *conn_init(struct io_conn *conn, struct reaching *reach) io_set_finish(conn, connect_failed, reach); if (use_tor) { assert(reach->addr.itype == ADDR_INTERNAL_WIREADDR); - return io_tor_connect(conn, reach->daemon->tor_proxyaddrs, + return io_tor_connect(conn, reach->daemon->tor_proxyaddr, &reach->addr.u.wireaddr, reach); } return io_connect(conn, &ai, connection_out, reach); diff --git a/gossipd/gossip_wire.csv b/gossipd/gossip_wire.csv index 4524a3c96..5822e8b26 100644 --- a/gossipd/gossip_wire.csv +++ b/gossipd/gossip_wire.csv @@ -18,7 +18,9 @@ gossipctl_init,,rgb,3*u8 gossipctl_init,,alias,32*u8 gossipctl_init,,update_channel_interval,u32 gossipctl_init,,reconnect,bool -gossipctl_init,,tor_proxyaddrs,struct wireaddr +# This is 0 or 1. +gossipctl_init,,num_tor_proxyaddrs,u16 +gossipctl_init,,tor_proxyaddr,num_tor_proxyaddrs*struct wireaddr gossipctl_init,,use_tor_proxy_always,bool gossipctl_init,,dev_allow_localhost,bool diff --git a/gossipd/tor.h b/gossipd/tor.h index 8b0eb082d..d4e4cd56f 100644 --- a/gossipd/tor.h +++ b/gossipd/tor.h @@ -10,7 +10,7 @@ struct reaching; bool do_we_use_tor_addr(const struct wireaddr *wireaddrs); struct io_plan *io_tor_connect(struct io_conn *conn, - const struct wireaddr *tor_proxyaddrs, + const struct wireaddr *tor_proxyaddr, const struct wireaddr *addr, struct reaching *reach); diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index 6e5dff9c7..c5ab606b0 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -226,7 +226,7 @@ void gossip_init(struct lightningd *ld) get_offered_local_features(tmpctx), wireaddrs, listen_announce, ld->rgb, ld->alias, ld->config.channel_update_interval, ld->reconnect, - ld->tor_proxyaddrs, ld->use_tor_proxy_always, + ld->tor_proxyaddr, ld->use_tor_proxy_always, allow_localhost); subd_send_msg(ld->gossip, msg); } diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 1707a37b8..22fcace8a 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -84,9 +84,9 @@ static struct lightningd *new_lightningd(const tal_t *ctx) ld->pidfile = NULL; ld->ini_autocleaninvoice_cycle = 0; ld->ini_autocleaninvoice_expiredby = 86400; - ld->tor_service_password = tal_arrz(ld, char, 32); - ld->tor_proxyaddrs = tal_arrz(ld, struct wireaddr,1); - ld->tor_serviceaddrs = tal_arrz(ld, struct wireaddr,1); + ld->tor_service_password = NULL; + ld->tor_proxyaddr = NULL; + ld->tor_serviceaddr = NULL; ld->use_tor_proxy_always = false; return ld; } diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index afb3259bb..98ccc8365 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -203,8 +203,8 @@ struct lightningd { #endif /* DEVELOPER */ /* tor support */ - struct wireaddr *tor_proxyaddrs; - struct wireaddr *tor_serviceaddrs; + struct wireaddr *tor_proxyaddr; + struct wireaddr *tor_serviceaddr; char *tor_service_password; bool use_tor_proxy_always; }; diff --git a/lightningd/options.c b/lightningd/options.c index 16458fc85..bebced635 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -297,28 +297,29 @@ static char *opt_set_offline(struct lightningd *ld) static char *opt_add_torproxy_addr(const char *arg, struct lightningd *ld) { + tal_free(ld->tor_proxyaddr); - if (!parse_wireaddr(arg, ld->tor_proxyaddrs,9050,NULL)) { - return tal_fmt(NULL, "Unable to parse Tor proxy address '%s'", arg); + /* We use a tal_arr here, so we can marshal it to gossipd */ + ld->tor_proxyaddr = tal_arr(ld, struct wireaddr, 1); + + if (!parse_wireaddr(arg, ld->tor_proxyaddr, 9050, NULL)) { + return tal_fmt(NULL, "Unable to parse Tor proxy address '%s'", + arg); } return NULL; } static char *opt_add_tor_service_addr(const char *arg, struct lightningd *ld) { - - if (!parse_wireaddr(arg, ld->tor_serviceaddrs,9051,NULL)) { - return tal_fmt(NULL, "Unable to parse Tor service address '%s'", arg); + tal_free(ld->tor_serviceaddr); + ld->tor_serviceaddr = tal(ld, struct wireaddr); + if (!parse_wireaddr(arg, ld->tor_serviceaddr, 9051, NULL)) { + return tal_fmt(NULL, "Unable to parse Tor service address '%s'", + arg); } return NULL; } -static char *opt_add_tor_service_password(const char *arg, struct lightningd *ld) -{ - ld->tor_service_password = tal_fmt(ld, "%.30s", arg); - return NULL; -} - static void config_register_opts(struct lightningd *ld) { opt_register_noarg("--daemon", opt_set_bool, &ld->daemon, @@ -426,8 +427,9 @@ static void config_register_opts(struct lightningd *ld) ld,"Set a socks v5 proxy IP address and port"); opt_register_arg("--tor-service",opt_add_tor_service_addr, NULL, ld,"Set a tor service api IP address and port"); - opt_register_arg("--tor-service-password", opt_add_tor_service_password, NULL, - ld,"Set a Tor hidden service password"); + opt_register_arg("--tor-service-password", opt_set_talstr, NULL, + &ld->tor_service_password, + "Set a Tor hidden service password"); opt_register_arg("--tor-auto-listen", opt_set_bool_arg, opt_show_bool, &ld->config.tor_enable_auto_hidden_service , "Generate and use a temp auto hidden-service and show the onion address"); opt_register_arg("--always-use-tor-proxy", opt_set_bool_arg, opt_show_bool, @@ -978,11 +980,12 @@ static void add_config(struct lightningd *ld, ADDR_ANNOUNCE); return; } else if (opt->cb_arg == (void *)opt_add_torproxy_addr) { - answer = fmt_wireaddr(name0, ld->tor_proxyaddrs); + if (ld->tor_proxyaddr) + answer = fmt_wireaddr(name0, ld->tor_proxyaddr); } else if (opt->cb_arg == (void *)opt_add_tor_service_addr) { - answer = fmt_wireaddr(name0, ld->tor_serviceaddrs); - } else if (opt->cb_arg == (void *)opt_add_tor_service_password) { - answer = tal_fmt(name0, "%s", ld->tor_service_password); + if (ld->tor_serviceaddr) + answer = fmt_wireaddr(name0, + ld->tor_serviceaddr); #if DEVELOPER } else if (strstarts(name, "dev-")) { /* Ignore dev settings */ diff --git a/lightningd/tor.c b/lightningd/tor.c index c20110e73..0ce2e784d 100644 --- a/lightningd/tor.c +++ b/lightningd/tor.c @@ -173,8 +173,8 @@ void tor_init(struct lightningd *ld) return; /* FIXME: Need better way to convert wireaddr to addrinfo... */ - if (getaddrinfo(fmt_wireaddr_without_port(ld, ld->tor_serviceaddrs), - tal_fmt(tmpctx, "%d", ld->tor_serviceaddrs->port), NULL, + if (getaddrinfo(fmt_wireaddr_without_port(ld, ld->tor_serviceaddr), + tal_fmt(tmpctx, "%d", ld->tor_serviceaddr->port), NULL, &ai_tor) != 0) errx(1, "getaddrinfo failed for Tor service");