GDBusConnection * _g_bus_get_priv (GBusType bus_type, GCancellable *cancellable, GError **error) { gchar *address; GDBusConnection *ret; ret = NULL; address = g_dbus_address_get_for_bus_sync (bus_type, cancellable, error); if (address == NULL) goto out; ret = g_dbus_connection_new_for_address_sync (address, G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, NULL, /* GDBusAuthObserver */ cancellable, error); g_free (address); out: return ret; }
static void print_address (void) { GError *error = NULL; gchar *addr; addr = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION, NULL, &error); g_assert_no_error (error); g_assert_nonnull (addr); g_print ("%s\n", addr); g_free (addr); }
/** * g_dbus_address_get_for_bus_sync: * @bus_type: a #GBusType * @cancellable: (allow-none): a #GCancellable or %NULL * @error: return location for error or %NULL * * Synchronously looks up the D-Bus address for the well-known message * bus instance specified by @bus_type. This may involve using various * platform specific mechanisms. * * Returns: a valid D-Bus address string for @bus_type or %NULL if * @error is set * * Since: 2.26 */ gchar * g_dbus_address_get_for_bus_sync (GBusType bus_type, GCancellable *cancellable, GError **error) { gchar *ret; const gchar *starter_bus; GError *local_error; g_return_val_if_fail (error == NULL || *error == NULL, NULL); ret = NULL; local_error = NULL; if (G_UNLIKELY (_g_dbus_debug_address ())) { guint n; _g_dbus_debug_print_lock (); g_print ("GDBus-debug:Address: In g_dbus_address_get_for_bus_sync() for bus type '%s'\n", _g_dbus_enum_to_string (G_TYPE_BUS_TYPE, bus_type)); for (n = 0; n < 3; n++) { const gchar *k; const gchar *v; switch (n) { case 0: k = "DBUS_SESSION_BUS_ADDRESS"; break; case 1: k = "DBUS_SYSTEM_BUS_ADDRESS"; break; case 2: k = "DBUS_STARTER_BUS_TYPE"; break; default: g_assert_not_reached (); } v = g_getenv (k); g_print ("GDBus-debug:Address: env var %s", k); if (v != NULL) g_print ("='%s'\n", v); else g_print (" is not set\n"); } _g_dbus_debug_print_unlock (); } switch (bus_type) { case G_BUS_TYPE_SYSTEM: ret = g_strdup (g_getenv ("DBUS_SYSTEM_BUS_ADDRESS")); if (ret == NULL) { ret = g_strdup ("unix:path=/var/run/dbus/system_bus_socket"); } break; case G_BUS_TYPE_SESSION: ret = g_strdup (g_getenv ("DBUS_SESSION_BUS_ADDRESS")); if (ret == NULL) { ret = get_session_address_platform_specific (&local_error); } break; case G_BUS_TYPE_STARTER: starter_bus = g_getenv ("DBUS_STARTER_BUS_TYPE"); if (g_strcmp0 (starter_bus, "session") == 0) { ret = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION, cancellable, &local_error); goto out; } else if (g_strcmp0 (starter_bus, "system") == 0) { ret = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SYSTEM, cancellable, &local_error); goto out; } else { if (starter_bus != NULL) { g_set_error (&local_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable" " - unknown value '%s'"), starter_bus); } else { g_set_error_literal (&local_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set")); } } break; default: g_set_error (&local_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Unknown bus type %d"), bus_type); break; } out: if (G_UNLIKELY (_g_dbus_debug_address ())) { _g_dbus_debug_print_lock (); if (ret != NULL) { g_print ("GDBus-debug:Address: Returning address '%s' for bus type '%s'\n", ret, _g_dbus_enum_to_string (G_TYPE_BUS_TYPE, bus_type)); } else { g_print ("GDBus-debug:Address: Cannot look-up address bus type '%s': %s\n", _g_dbus_enum_to_string (G_TYPE_BUS_TYPE, bus_type), local_error ? local_error->message : ""); } _g_dbus_debug_print_unlock (); } if (local_error != NULL) g_propagate_error (error, local_error); return ret; }
/** * g_dbus_address_get_for_bus_sync: * @bus_type: A #GBusType. * @cancellable: A #GCancellable or %NULL. * @error: Return location for error or %NULL. * * Synchronously looks up the D-Bus address for the well-known message * bus instance specified by @bus_type. This may involve using various * platform specific mechanisms. * * Returns: A valid D-Bus address string for @bus_type or %NULL if @error is set. * * Since: 2.26 */ gchar * g_dbus_address_get_for_bus_sync (GBusType bus_type, GCancellable *cancellable, GError **error) { gchar *ret; const gchar *starter_bus; g_return_val_if_fail (error == NULL || *error == NULL, NULL); ret = NULL; switch (bus_type) { case G_BUS_TYPE_SYSTEM: ret = g_strdup (g_getenv ("DBUS_SYSTEM_BUS_ADDRESS")); if (ret == NULL) { ret = g_strdup ("unix:path=/var/run/dbus/system_bus_socket"); } break; case G_BUS_TYPE_SESSION: ret = g_strdup (g_getenv ("DBUS_SESSION_BUS_ADDRESS")); if (ret == NULL) { ret = get_session_address_platform_specific (); if (ret == NULL) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot determine session bus address (TODO: run dbus-launch to find out)")); } } break; case G_BUS_TYPE_STARTER: starter_bus = g_getenv ("DBUS_STARTER_BUS_TYPE"); if (g_strcmp0 (starter_bus, "session") == 0) { ret = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION, cancellable, error); goto out; } else if (g_strcmp0 (starter_bus, "system") == 0) { ret = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SYSTEM, cancellable, error); goto out; } else { if (starter_bus != NULL) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable" " - unknown value `%s'"), starter_bus); } else { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set")); } } break; default: g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Unknown bus type %d"), bus_type); break; } out: return ret; }