diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 9a0ea67d8..28f2e8ea5 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -105,6 +105,23 @@ void test_daemons(const struct lightningd *ld) } tal_free(ctx); } +/* Check if all daemons exist in specified directory. */ +static bool has_all_daemons(const char* daemon_dir) +{ + size_t i; + bool missing_daemon = false; + const tal_t *tmpctx = tal_tmpctx(NULL); + + for (i = 0; i < ARRAY_SIZE(daemons); ++i) { + if (!path_is_file(path_join(tmpctx, daemon_dir, daemons[i]))) { + missing_daemon = true; + break; + } + } + + tal_free(tmpctx); + return !missing_daemon; +} static const char *find_my_path(const tal_t *ctx, const char *argv0) { @@ -154,6 +171,21 @@ static const char *find_my_path(const tal_t *ctx, const char *argv0) tal_free(tmpctx); return path_dirname(ctx, take(me)); } +static const char *find_my_pkglibexec_path(const tal_t *ctx, + const char *my_path TAKES) +{ + const char *pkglibexecdir; + pkglibexecdir = path_join(ctx, my_path, BINTOPKGLIBEXECDIR); + return path_simplify(ctx, take(pkglibexecdir)); +} +/* Determine the correct daemon dir. */ +static const char *find_daemon_dir(const tal_t *ctx, const char *argv0) +{ + const char *my_path = find_my_path(ctx, argv0); + if (has_all_daemons(my_path)) + return my_path; + return find_my_pkglibexec_path(ctx, take(my_path)); +} void derive_peer_seed(struct lightningd *ld, struct privkey *peer_seed, const struct pubkey *peer_id, const u64 channel_id) @@ -229,8 +261,10 @@ int main(int argc, char *argv[]) io_poll_override(debug_poll); - /* Figure out where we are first. */ - ld->daemon_dir = find_my_path(ld, argv[0]); + /* Figure out where our daemons are first. */ + ld->daemon_dir = find_daemon_dir(ld, argv[0]); + if (!ld->daemon_dir) + errx(1, "Could not find daemons"); register_opts(ld);