static void on_udisks_client_changed (UDisksClient *client, gpointer user_data) { StorageProvider *provider = STORAGE_PROVIDER (user_data); provider_update (provider); }
static void lvm_object_changed (StorageProvider *provider, GDBusObject *object) { const gchar *path = g_dbus_object_get_object_path (object); if (g_str_has_prefix (path, "/org/freedesktop/UDisks2/block_devices/")) provider_update_block (provider, path); else if (g_str_has_prefix (path, "/org/freedesktop/UDisks2/jobs/")) provider_update_jobs (provider); else provider_update (provider); }
int32_t server_prepare_service_change_response(server_p srv, int32_t fd) { uint8_t const *req = srv->req + sizeof(sdp_pdu_t); uint8_t const *req_end = req + ((sdp_pdu_p)(srv->req))->len; uint8_t *rsp = srv->fdidx[fd].rsp; provider_t *provider = NULL; uint32_t handle; /* * Minimal Service Change Request * * value32 - handle 4 bytes */ if (!srv->fdidx[fd].control || !srv->fdidx[fd].priv || req_end - req < 4) return (SDP_ERROR_CODE_INVALID_REQUEST_SYNTAX); /* Get handle */ SDP_GET32(handle, req); /* Lookup provider */ provider = provider_by_handle(handle); if (provider == NULL || provider->fd != fd) return (SDP_ERROR_CODE_INVALID_SERVICE_RECORD_HANDLE); /* Validate user data */ if (req_end - req < provider->profile->dsize || provider->profile->valid == NULL || (provider->profile->valid)(req, req_end - req) == 0) return (SDP_ERROR_CODE_INVALID_REQUEST_SYNTAX); /* Update provider */ if (provider_update(provider, req, req_end - req) < 0) return (SDP_ERROR_CODE_INSUFFICIENT_RESOURCES); SDP_PUT16(0, rsp); /* Set reply size */ srv->fdidx[fd].rsp_limit = srv->fdidx[fd].omtu - sizeof(sdp_pdu_t); srv->fdidx[fd].rsp_size = rsp - srv->fdidx[fd].rsp; srv->fdidx[fd].rsp_cs = 0; return (0); }
static void storage_provider_constructed (GObject *_object) { StorageProvider *provider = STORAGE_PROVIDER (_object); GError *error = NULL; /* TODO: use GInitable/GAsyncInitable or start() pattern here */ provider->udisks_client = udisks_client_new_sync (NULL, &error); if (provider->udisks_client == NULL) { g_warning ("Error connecting to udisks: %s (%s, %d)", error->message, g_quark_to_string (error->domain), error->code); g_clear_error (&error); goto out; } provider->lvm_objman = g_dbus_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 0, "com.redhat.storaged", "/org/freedesktop/UDisks2", lvm_get_proxy_type, NULL, NULL, NULL, &error); if (provider->lvm_objman == NULL) { g_warning ("Error connecting to storaged: %s (%s, %d)", error->message, g_quark_to_string (error->domain), error->code); g_clear_error (&error); goto out; } g_signal_connect (provider->lvm_objman, "object-added", G_CALLBACK (on_lvm_object_added), provider); g_signal_connect (provider->lvm_objman, "object-removed", G_CALLBACK (on_lvm_object_removed), provider); g_signal_connect (provider->lvm_objman, "interface-added", G_CALLBACK (on_lvm_interface_added), provider); g_signal_connect (provider->lvm_objman, "interface-removed", G_CALLBACK (on_lvm_interface_removed), provider); GDBusConnection *connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); if (connection) { g_dbus_connection_signal_subscribe (connection, "com.redhat.storaged", "org.freedesktop.DBus.Properties", "PropertiesChanged", NULL, NULL, G_DBUS_SIGNAL_FLAGS_NONE, on_lvm_properties_changed, provider, NULL); } /* init */ provider_update (provider); provider_update_jobs (provider); g_signal_connect (provider->udisks_client, "changed", G_CALLBACK (on_udisks_client_changed), provider); /* We don't use the "changed" signal to watch jobs since we might miss some that only exist for a very short period, but we still want to report their failures. */ GDBusObjectManager *object_manager; object_manager = udisks_client_get_object_manager (provider->udisks_client); g_signal_connect (object_manager, "object-added", G_CALLBACK (on_object_added), provider); g_signal_connect (object_manager, "object-removed", G_CALLBACK (on_object_removed), provider); out: if (G_OBJECT_CLASS (storage_provider_parent_class)->constructed != NULL) G_OBJECT_CLASS (storage_provider_parent_class)->constructed (_object); }