From: Inga Stotland <inga.stotland@xxxxxxxxx> --- mesh/main.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/mesh/main.c b/mesh/main.c index 173f57a8f..95a66cc9d 100644 --- a/mesh/main.c +++ b/mesh/main.c @@ -33,11 +33,14 @@ #include <sys/stat.h> #include <ell/ell.h> +#include <dbus/dbus.h> + #include "lib/bluetooth.h" #include "lib/mgmt.h" #include "mesh/mesh.h" #include "mesh/net.h" +#include "mesh/dbus.h" #include "mesh/storage.h" static const struct option main_options[] = { @@ -56,12 +59,46 @@ static void usage(void) "\tmeshd [options]\n"); l_info("Options:\n" "\t--index <hcinum> Use specified controller\n" - "\t--config Configuration file\n" + "\t--config Configuration directory\n" "\t--nodetach Run in foreground\n" "\t--debug Enable debug output\n" "\t--help Show %s information\n", __func__); } +static void do_debug(const char *str, void *user_data) +{ + const char *prefix = user_data; + + l_info("%s%s", prefix, str); +} + +static void request_name_callback(struct l_dbus *dbus, bool success, + bool queued, void *user_data) +{ + l_info("Request name %s", + success ? "success": "failed"); + + if (success) + dbus_init(dbus); + else + l_main_quit(); +} + +static void ready_callback(void *user_data) +{ + struct l_dbus *dbus = user_data; + + l_info("D-Bus ready"); + l_dbus_name_acquire(dbus, BLUEZ_MESH_NAME, false, false, false, + request_name_callback, NULL); + +} + +static void disconnect_callback(void *user_data) +{ + l_main_quit(); +} + static void signal_handler(uint32_t signo, void *user_data) { static bool terminated; @@ -78,8 +115,9 @@ int main(int argc, char *argv[]) { int status; bool detached = true; - struct bt_mesh *mesh = NULL; - const char *config_file = NULL; + bool dbus_debug = false; + struct l_dbus *dbus = NULL; + const char *config_dir = NULL; int index = MGMT_INDEX_NONE; if (!l_main_init()) @@ -91,7 +129,7 @@ int main(int argc, char *argv[]) int opt; const char *str; - opt = getopt_long(argc, argv, "i:c:ndh", main_options, NULL); + opt = getopt_long(argc, argv, "i:c:ndbh", main_options, NULL); if (opt < 0) break; @@ -117,7 +155,10 @@ int main(int argc, char *argv[]) l_debug_enable("*"); break; case 'c': - config_file = optarg; + config_dir = optarg; + break; + case 'b': + dbus_debug = true; break; case 'h': usage(); @@ -130,7 +171,7 @@ int main(int argc, char *argv[]) } } - if (!mesh_new(index, config_file)) { + if (!mesh_init(index, config_dir)) { l_error("Failed to initialize mesh"); status = EXIT_FAILURE; goto done; @@ -138,6 +179,24 @@ int main(int argc, char *argv[]) umask(0077); + dbus = l_dbus_new_default(L_DBUS_SYSTEM_BUS); + if (!dbus) { + l_error("unable to connect to D-Bus"); + status = EXIT_FAILURE; + goto done; + } + + if (dbus_debug) + l_dbus_set_debug(dbus, do_debug, "[DBUS] ", NULL); + l_dbus_set_ready_handler(dbus, ready_callback, dbus, NULL); + l_dbus_set_disconnect_handler(dbus, disconnect_callback, NULL, NULL); + + if (!l_dbus_object_manager_enable(dbus)) { + l_error("Failed to enable Object Manager"); + status = EXIT_FAILURE; + goto done; + } + if (detached) { if (daemon(0, 0)) { perror("Failed to start meshd daemon"); @@ -149,8 +208,8 @@ int main(int argc, char *argv[]) status = l_main_run_with_signal(signal_handler, NULL); done: - mesh_unref(mesh); mesh_cleanup(); + l_dbus_destroy(dbus); l_main_exit(); return status; -- 2.14.5