options: use NULL for unset Tor settings.

Rename tor_proxyaddrs and tor_serviceaddrs to tor_proxyaddr and tor_serviceaddr:
the 's' at the end suggests that there can be more than one.

Make them NULL or non-NULL, rather than using all-zero if unset.

Hand them the same way to gossipd; it's a bit of a hack since we don't
have optional fields, so we use a counter which is always 0 or 1.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2018-05-10 08:48:23 +09:30
parent ef09961713
commit 11db7ca9e6
8 changed files with 36 additions and 32 deletions

View file

@ -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);

View file

@ -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

1 #include <common/cryptomsg.h>
18 gossipctl_init,,update_channel_interval,u32
19 gossipctl_init,,reconnect,bool
20 gossipctl_init,,tor_proxyaddrs,struct wireaddr # This is 0 or 1.
21 gossipctl_init,,use_tor_proxy_always,bool gossipctl_init,,num_tor_proxyaddrs,u16
22 gossipctl_init,,tor_proxyaddr,num_tor_proxyaddrs*struct wireaddr
23 gossipctl_init,,use_tor_proxy_always,bool
24 gossipctl_init,,dev_allow_localhost,bool
25 # Activate the gossip daemon, so others can connect.
26 gossipctl_activate,3025

View file

@ -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);

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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;
};

View file

@ -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 */

View file

@ -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");