mesh: Update init for D-Bus and multi-node support
authorInga Stotland <inga.stotland@intel.com>
Fri, 14 Dec 2018 22:08:23 +0000 (14:08 -0800)
committerAnupam Roy <anupam.r@samsung.com>
Tue, 17 Dec 2019 13:58:02 +0000 (19:28 +0530)
This adds D-Bus initialization, modifications for mulitple nodes and
optional control of storage directory location.

Change-Id: I4f1a637a2e27e23ffb797f14bb60552f130ac531
Signed-off-by: Anupam Roy <anupam.r@samsung.com>
mesh/main.c

index db6bee5..412963e 100644 (file)
@@ -15,7 +15,6 @@
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  *  Lesser General Public License for more details.
  *
- *
  */
 
 #ifdef HAVE_CONFIG_H
 #include <sys/stat.h>
 #include <ell/ell.h>
 
+#include <dbus/dbus.h>
+#include <json-c/json.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[] = {
@@ -55,12 +58,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;
@@ -77,8 +114,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())
@@ -90,7 +128,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;
 
@@ -116,7 +154,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();
@@ -129,7 +170,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;
@@ -137,6 +178,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");
@@ -148,8 +207,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;