aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-09-28 08:41:44 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-09-28 08:42:13 +0200
commit65c3976cad2ed5ee14b979270b73d5c2a93ed215 (patch)
treef75b7e6660898d4542bb37eaa648bc92a567e982
parent0b059ea9c9b894c470da0a3dc795ba7bc2b46cfd (diff)
core: acquire DBus name only after having created the `MMManager'
The `MMManager' is itself also a `GDBusObjectManagerServer'. If we create this object after having fully acquired the bus name, the client application in the other side of the bus could be trying to use the ObjectManager interface before we actually exported it, which is wrong. Therefore, we need to make sure that the Manager interfaces are all exported before the name is acquired.
-rw-r--r--src/main.c51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/main.c b/src/main.c
index bf5f27b5..431f54e1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -66,13 +66,13 @@ setup_signals (void)
}
static void
-name_acquired_cb (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
+bus_acquired_cb (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
{
GError *error = NULL;
- mm_dbg ("Service name '%s' was acquired", name);
+ mm_dbg ("Bus acquired, creating manager...");
/* Create Manager object */
g_assert (!manager);
@@ -83,8 +83,17 @@ name_acquired_cb (GDBusConnection *connection,
g_main_loop_quit (loop);
return;
}
+}
+
+static void
+name_acquired_cb (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ mm_dbg ("Service name '%s' was acquired", name);
/* Launch scan for devices */
+ g_assert (manager);
mm_manager_start (manager);
}
@@ -95,14 +104,18 @@ name_lost_cb (GDBusConnection *connection,
{
/* Note that we're not allowing replacement, so once the name acquired, the
* process won't lose it. */
- mm_warn ("Could not acquire the '%s' service name", name);
+ if (!name)
+ mm_warn ("Could not get the system bus. Make sure "
+ "the message bus daemon is running!");
+ else
+ mm_warn ("Could not acquire the '%s' service name", name);
+
g_main_loop_quit (loop);
}
int
main (int argc, char *argv[])
{
- GDBusConnection *bus;
GError *err = NULL;
guint name_id;
@@ -126,24 +139,15 @@ main (int argc, char *argv[])
mm_info ("ModemManager (version " MM_DIST_VERSION ") starting...");
- /* Get system bus */
- bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &err);
- if (!bus) {
- g_warning ("Could not get the system bus. Make sure "
- "the message bus daemon is running! Message: %s",
- err->message);
- g_error_free (err);
- return -1;
- }
-
/* Acquire name, don't allow replacement */
- name_id = g_bus_own_name_on_connection (bus,
- MM_DBUS_SERVICE,
- G_BUS_NAME_OWNER_FLAGS_NONE,
- name_acquired_cb,
- name_lost_cb,
- NULL,
- NULL);
+ name_id = g_bus_own_name (G_BUS_TYPE_SYSTEM,
+ MM_DBUS_SERVICE,
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ bus_acquired_cb,
+ name_acquired_cb,
+ name_lost_cb,
+ NULL,
+ NULL);
/* Go into the main loop */
loop = g_main_loop_new (NULL, FALSE);
@@ -164,7 +168,6 @@ main (int argc, char *argv[])
}
g_bus_unown_name (name_id);
- g_object_unref (bus);
mm_log_shutdown ();