gboolean gkd_dbus_secrets_startup (void) { DBusError error = DBUS_ERROR_INIT; dbus_uint32_t result = 0; const gchar *service = NULL; unsigned int flags = 0; GckSlot *slot; g_return_val_if_fail (dbus_conn, FALSE); #ifdef WITH_TESTS service = g_getenv ("MATE_KEYRING_TEST_SERVICE"); if (service && service[0]) flags = DBUS_NAME_FLAG_ALLOW_REPLACEMENT | DBUS_NAME_FLAG_REPLACE_EXISTING; else #endif service = SECRET_SERVICE; /* Figure out which slot to use */ slot = calculate_secrets_slot (); g_return_val_if_fail (slot, FALSE); /* Try and grab our name */ result = dbus_bus_request_name (dbus_conn, service, flags, &error); if (dbus_error_is_set (&error)) { g_message ("couldn't request name '%s' on session bus: %s", service, error.message); dbus_error_free (&error); } else { switch (result) { /* We acquired the service name */ case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER: break; /* We already acquired the service name. */ case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER: break; /* Another daemon is running */ case DBUS_REQUEST_NAME_REPLY_IN_QUEUE: case DBUS_REQUEST_NAME_REPLY_EXISTS: g_message ("another secret service is running"); break; default: g_return_val_if_reached (FALSE); break; }; } g_return_val_if_fail (!secrets_service, FALSE); secrets_service = g_object_new (GKD_SECRET_TYPE_SERVICE, "connection", dbus_conn, "pkcs11-slot", slot, NULL); g_object_unref (slot); return TRUE; }
gboolean gkd_dbus_secrets_startup (void) { const gchar *service = NULL; unsigned int flags = 0; GckSlot *slot; GError *error = NULL; GVariant *request_variant; guint res; g_return_val_if_fail (dbus_conn, FALSE); g_return_val_if_fail (!secrets_service, FALSE); #ifdef WITH_DEBUG service = g_getenv ("GNOME_KEYRING_TEST_SERVICE"); if (service && service[0]) flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | G_BUS_NAME_OWNER_FLAGS_REPLACE; else #endif service = SECRET_SERVICE; /* Figure out which slot to use */ slot = calculate_secrets_slot (); g_return_val_if_fail (slot, FALSE); secrets_service = g_object_new (GKD_SECRET_TYPE_SERVICE, "connection", dbus_conn, "pkcs11-slot", slot, NULL); g_object_unref (slot); /* Try and grab our name */ request_variant = g_dbus_connection_call_sync (dbus_conn, "org.freedesktop.DBus", /* bus name */ "/org/freedesktop/DBus", /* object path */ "org.freedesktop.DBus", /* interface name */ "RequestName", /* method name */ g_variant_new ("(su)", service, flags), G_VARIANT_TYPE ("(u)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error != NULL) { g_message ("couldn't request name '%s' on session bus: %s", service, error->message); g_error_free (error); } else { g_variant_get (request_variant, "(u)", &res); g_variant_unref (request_variant); switch (res) { /* We acquired the service name */ case 1: /* DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER */ /* We already acquired the service name. */ case 4: /* DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER */ break; /* Another daemon is running */ case 2: /* DBUS_REQUEST_NAME_REPLY_IN_QUEUE */ case 3: /* DBUS_REQUEST_NAME_REPLY_EXISTS */ g_message ("another secret service is running"); break; default: g_clear_object (&secrets_service); g_return_val_if_reached (FALSE); break; }; } return TRUE; }