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);
}
Exemple #3
0
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);
}