static DBusConnection* connect_to_service (void) { DBusError derr = DBUS_ERROR_INIT; DBusConnection *conn; const gchar *rule; /* * TODO: We currently really have no way to close this connection or do * cleanup, and it's unclear how and whether we need to. */ if (!dbus_connection) { if (!g_getenv ("DBUS_SESSION_BUS_ADDRESS")) return NULL; conn = dbus_bus_get_private (DBUS_BUS_SESSION, &derr); if (conn == NULL) { g_message ("couldn't connect to dbus session bus: %s", derr.message); dbus_error_free (&derr); return NULL; } dbus_connection_set_exit_on_disconnect (conn, FALSE); /* Listen for the completed signal */ rule = "type='signal',interface='org.mate.secrets.Prompt',member='Completed'"; dbus_bus_add_match (conn, rule, NULL); /* Listen for name owner changed signals */ rule = "type='signal',member='NameOwnerChanged',interface='org.freedesktop.DBus'"; dbus_bus_add_match (conn, rule, NULL); dbus_connection_add_filter (conn, on_name_changed_filter, NULL, NULL); G_LOCK (dbus_connection); { if (dbus_connection) { dbus_connection_unref (conn); } else { egg_dbus_connect_with_mainloop (conn, NULL); dbus_connection = conn; } } G_UNLOCK (dbus_connection); } return dbus_connection_ref (dbus_connection); }
static gboolean connect_to_session_bus (void) { DBusError derr = { 0 }; if (dbus_conn) return TRUE; dbus_error_init (&derr); /* Get the dbus bus and hook up */ dbus_conn = dbus_bus_get (DBUS_BUS_SESSION, &derr); if (!dbus_conn) { g_message ("couldn't connect to dbus session bus: %s", derr.message); dbus_error_free (&derr); return FALSE; } egg_dbus_connect_with_mainloop (dbus_conn, NULL, on_connection_close); dbus_connection_set_exit_on_disconnect (dbus_conn, FALSE); egg_cleanup_register (cleanup_session_bus, NULL); return TRUE; }