Rusty Russell
9 years ago
6 changed files with 141 additions and 1 deletions
@ -0,0 +1,95 @@ |
|||
#include "configdir.h" |
|||
#include "log.h" |
|||
#include <ccan/opt/opt.h> |
|||
#include <ccan/tal/grab_file/grab_file.h> |
|||
#include <ccan/tal/path/path.h> |
|||
#include <ccan/tal/str/str.h> |
|||
#include <errno.h> |
|||
|
|||
static char *default_configdir(const tal_t *ctx) |
|||
{ |
|||
char *path; |
|||
const char *env = getenv("HOME"); |
|||
if (!env) |
|||
return "."; |
|||
|
|||
path = path_join(ctx, env, ".lightning"); |
|||
return path; |
|||
} |
|||
|
|||
void configdir_register_opts(const tal_t *ctx, |
|||
char **configdir, char **rpc_filename) |
|||
{ |
|||
*configdir = default_configdir(ctx); |
|||
*rpc_filename = "lightning-rpc"; |
|||
|
|||
opt_register_early_arg("--lightning-dir", opt_set_charp, opt_show_charp, |
|||
configdir, |
|||
"working directory: all other files are relative to this"); |
|||
|
|||
opt_register_arg("--rpc-file", opt_set_charp, opt_show_charp, |
|||
rpc_filename, |
|||
"Set JSON-RPC socket (or /dev/tty)"); |
|||
} |
|||
|
|||
/* FIXME: make this nicer! */ |
|||
static void config_log_stderr_exit(const char *fmt, ...) |
|||
{ |
|||
char *msg; |
|||
va_list ap; |
|||
|
|||
va_start(ap, fmt); |
|||
|
|||
/* This is the format we expect: mangle it to remove '--'. */ |
|||
if (streq(fmt, "%s: %.*s: %s")) { |
|||
const char *argv0 = va_arg(ap, const char *); |
|||
unsigned int len = va_arg(ap, unsigned int); |
|||
const char *arg = va_arg(ap, const char *); |
|||
const char *problem = va_arg(ap, const char *); |
|||
|
|||
msg = tal_fmt(NULL, "%s line %s: %.*s: %s", |
|||
argv0, arg+strlen(arg)+1, len-2, arg+2, problem); |
|||
} else { |
|||
msg = tal_vfmt(NULL, fmt, ap); |
|||
} |
|||
va_end(ap); |
|||
|
|||
fatal("%s", msg); |
|||
} |
|||
|
|||
/* We turn the config file into cmdline arguments. */ |
|||
void opt_parse_from_config(const tal_t *ctx) |
|||
{ |
|||
char *contents, **lines; |
|||
char **argv; |
|||
int i, argc; |
|||
|
|||
contents = grab_file(ctx, "config"); |
|||
/* Doesn't have to exist. */ |
|||
if (!contents) { |
|||
if (errno != ENOENT) |
|||
fatal("Opening and reading config: %s", |
|||
strerror(errno)); |
|||
return; |
|||
} |
|||
|
|||
lines = tal_strsplit(contents, contents, "\r\n", STR_NO_EMPTY); |
|||
|
|||
/* We have to keep argv around, since opt will point into it */ |
|||
argv = tal_arr(ctx, char *, argc = 1); |
|||
argv[0] = "lightning config file"; |
|||
|
|||
for (i = 0; i < tal_count(lines) - 1; i++) { |
|||
if (strstarts(lines[i], "#")) |
|||
continue; |
|||
/* Only valid forms are "foo" and "foo=bar" */ |
|||
tal_resize(&argv, argc+1); |
|||
/* Stash line number after nul. */ |
|||
argv[argc++] = tal_fmt(argv, "--%s%c%u", lines[i], 0, i+1); |
|||
} |
|||
tal_resize(&argv, argc+1); |
|||
argv[argc] = NULL; |
|||
|
|||
opt_parse(&argc, argv, config_log_stderr_exit); |
|||
tal_free(contents); |
|||
} |
@ -0,0 +1,11 @@ |
|||
#ifndef LIGHTNING_DAEMON_CONFIGDIR_H |
|||
#define LIGHTNING_DAEMON_CONFIGDIR_H |
|||
#include "config.h" |
|||
#include <ccan/tal/tal.h> |
|||
|
|||
void configdir_register_opts(const tal_t *ctx, |
|||
char **config_dir, char **rpc_filename); |
|||
|
|||
void opt_parse_from_config(const tal_t *ctx); |
|||
|
|||
#endif /* LIGHTNING_DAEMON_CONFIGDIR_H */ |
Loading…
Reference in new issue