diff --git a/common/configdir.c b/common/configdir.c index 1873074f6f2a..248c8e73e010 100644 --- a/common/configdir.c +++ b/common/configdir.c @@ -57,6 +57,7 @@ static struct configvar **gather_file_configvars(const tal_t *ctx, enum configvar_src src, const char *filename, bool must_exist, + char **setconfig_file, size_t include_depth) { char *contents, **lines; @@ -72,6 +73,13 @@ static struct configvar **gather_file_configvars(const tal_t *ctx, return cvs; } + /* First .setconfig file is used for setconfig command */ + if (setconfig_file + && *setconfig_file == NULL + && strends(filename, ".setconfig")) { + *setconfig_file = tal_strdup(ctx, filename); + } + /* Break into lines. */ lines = tal_strsplit(contents, contents, "\r\n", STR_EMPTY_OK); for (size_t i = 0; i < tal_count(lines) - 1; i++) { @@ -93,6 +101,7 @@ static struct configvar **gather_file_configvars(const tal_t *ctx, take(path_dirname(NULL, filename)), included), true, + setconfig_file, include_depth + 1); cvs = configvar_join(ctx, take(cvs), take(sub)); continue; @@ -291,7 +300,7 @@ void minimal_config_opts(const tal_t *ctx, config_filename, basedir, config_netdir, - rpc_filename); + rpc_filename, NULL); tal_steal(ctx, *config_filename); tal_steal(ctx, *basedir); tal_steal(ctx, *config_netdir); @@ -304,7 +313,8 @@ struct configvar **initial_config_opts(const tal_t *ctx, char **config_filename, char **config_basedir, char **config_netdir, - char **rpc_filename) + char **rpc_filename, + char **setconfig_file) { struct configvar **cmdline_cvs, **config_cvs, **cvs; @@ -360,11 +370,15 @@ struct configvar **initial_config_opts(const tal_t *ctx, cmdline_cvs = gather_cmdline_args(tmpctx, argc, argv, remove_args); parse_configvars(cmdline_cvs, true, false, false); + if (setconfig_file) + *setconfig_file = NULL; + /* Base default or direct config can set network */ if (*config_filename) { config_cvs = gather_file_configvars(NULL, CONFIGVAR_EXPLICIT_CONF, - *config_filename, true, 0); + *config_filename, true, + setconfig_file, 0); } else { struct configvar **base_cvs, **net_cvs; char *dir = path_join(tmpctx, take(path_cwd(NULL)), *config_basedir); @@ -372,7 +386,8 @@ struct configvar **initial_config_opts(const tal_t *ctx, base_cvs = gather_file_configvars(tmpctx, CONFIGVAR_BASE_CONF, path_join(tmpctx, dir, "config"), - false, 0); + false, + setconfig_file, 0); /* This might set network! */ parse_configvars(configvar_join(tmpctx, base_cvs, cmdline_cvs), true, false, false); @@ -382,7 +397,7 @@ struct configvar **initial_config_opts(const tal_t *ctx, net_cvs = gather_file_configvars(tmpctx, CONFIGVAR_NETWORK_CONF, path_join(tmpctx, dir, "config"), - false, 0); + false, setconfig_file, 0); config_cvs = configvar_join(NULL, take(base_cvs), take(net_cvs)); } cvs = configvar_join(ctx, take(config_cvs), cmdline_cvs); diff --git a/common/configdir.h b/common/configdir.h index 68e06ca275f9..f8ef76f8a4d7 100644 --- a/common/configdir.h +++ b/common/configdir.h @@ -27,7 +27,8 @@ struct configvar **initial_config_opts(const tal_t *ctx, char **config_filename, char **config_basedir, char **config_netdir, - char **rpc_filename); + char **rpc_filename, + char **setconfig_file); /* This is called before we know all the options. */ void parse_configvars_early(struct configvar **cvs, bool developer); diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index 6834aa38a7c9..828ef03970d7 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -117,6 +117,9 @@ struct lightningd { /* Our config basedir, network directory, and rpc file */ char *config_basedir, *config_netdir; + /* Where setconfig() should write to (or NULL if not set up yet) */ + char *setconfig_file; + /* Location of the RPC socket. */ char *rpc_filename; /* Mode of the RPC filename. */ diff --git a/lightningd/options.c b/lightningd/options.c index 23a393f43364..240e5a60672e 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -1861,7 +1861,8 @@ void handle_early_opts(struct lightningd *ld, int argc, char *argv[]) &ld->config_filename, &ld->config_basedir, &ld->config_netdir, - &ld->rpc_filename); + &ld->rpc_filename, + &ld->setconfig_file); if (argc != 1) errx(1, "no arguments accepted");