示例#1
0
void
storage_daemon_publish (StorageDaemon *self,
                        const gchar *path,
                        gboolean uniquely,
                        gpointer thing)
{
  GDBusInterface *prev;
  GDBusInterfaceInfo *info;
  GDBusObjectSkeleton *object;
  GQuark detail;

  g_return_if_fail (STORAGE_IS_DAEMON (self));
  g_return_if_fail (path != NULL);

  if (G_IS_DBUS_INTERFACE (thing))
    {
      g_debug ("%spublishing iface: %s %s", uniquely ? "uniquely " : "", path,
               g_dbus_interface_get_info(thing)->name);

      object = G_DBUS_OBJECT_SKELETON (g_dbus_object_manager_get_object (G_DBUS_OBJECT_MANAGER (self->object_manager), path));
      if (object != NULL)
        {
          if (uniquely)
            {
              info = g_dbus_interface_get_info (thing);
              prev = g_dbus_object_get_interface (G_DBUS_OBJECT (object), info->name);
              if (prev)
                {
                  g_object_unref (prev);
                  g_object_unref (object);
                  object = NULL;
                }
            }
        }

      if (object == NULL)
          object = g_dbus_object_skeleton_new (path);

      g_dbus_object_skeleton_add_interface (object, thing);
    }
  else
    {
      g_critical ("Unsupported type to publish: %s", G_OBJECT_TYPE_NAME (thing));
      return;
    }

  if (uniquely)
    g_dbus_object_manager_server_export_uniquely (self->object_manager, object);
  else
    g_dbus_object_manager_server_export (self->object_manager, object);

  detail = g_quark_from_static_string (G_OBJECT_TYPE_NAME (thing));
  g_signal_emit (self, signals[PUBLISHED], detail, thing);

  g_object_unref (object);
}
示例#2
0
static gboolean
update_iface (StoragedObject                     *object,
              const gchar                        *uevent_action,
              StoragedObjectHasInterfaceFunc      has_func,
              StoragedObjectConnectInterfaceFunc  connect_func,
              StoragedObjectUpdateInterfaceFunc   update_func,
              GType                               skeleton_type,
              gpointer                            _interface_pointer)
{
  gboolean ret = FALSE;
  gboolean has;
  gboolean add;
  GDBusInterface **interface_pointer = _interface_pointer;

  g_return_val_if_fail (object != NULL, FALSE);
  g_return_val_if_fail (has_func != NULL, FALSE);
  g_return_val_if_fail (update_func != NULL, FALSE);
  g_return_val_if_fail (g_type_is_a (skeleton_type, G_TYPE_OBJECT), FALSE);
  g_return_val_if_fail (g_type_is_a (skeleton_type, G_TYPE_DBUS_INTERFACE), FALSE);
  g_return_val_if_fail (interface_pointer != NULL, FALSE);
  g_return_val_if_fail (*interface_pointer == NULL || G_IS_DBUS_INTERFACE (*interface_pointer), FALSE);

  add = FALSE;
  has = has_func (object);
  if (*interface_pointer == NULL)
    {
      if (has)
        {
          *interface_pointer = g_object_new (skeleton_type, NULL);
          if (connect_func != NULL)
            connect_func (object);
          add = TRUE;
        }
    }
  else
    {
      if (!has)
        {
          g_dbus_object_skeleton_remove_interface (G_DBUS_OBJECT_SKELETON (object),
                                                   G_DBUS_INTERFACE_SKELETON (*interface_pointer));
          g_object_unref (*interface_pointer);
          *interface_pointer = NULL;
        }
    }

  if (*interface_pointer != NULL)
    {
      if (update_func (object, uevent_action, G_DBUS_INTERFACE (*interface_pointer)))
        ret = TRUE;
      if (add)
        g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object),
                                              G_DBUS_INTERFACE_SKELETON (*interface_pointer));
    }

  return ret;
}
示例#3
0
void
get_iface (GObject *object, GType skeleton, gpointer _pointer_to_iface)
{
	GDBusInterface **pointer_to_iface = _pointer_to_iface;

	if (*pointer_to_iface == NULL) {
		*pointer_to_iface = g_object_new(skeleton, NULL);
	}

	g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON (object),
					G_DBUS_INTERFACE_SKELETON (*pointer_to_iface));
}
static void hev_dbus_interface_skeleton_constructed(GObject *obj)
{
	GDBusObject *dbus_obj = NULL;

	g_debug("%s:%d[%s]", __FILE__, __LINE__, __FUNCTION__);

	G_OBJECT_CLASS(hev_dbus_interface_skeleton_parent_class)->constructed(obj);

	g_object_get(obj, "object", &dbus_obj, NULL);
	g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(dbus_obj),
				G_DBUS_INTERFACE_SKELETON(obj));
	g_object_unref(dbus_obj);
}
static gboolean
register_display (GdmDisplay *display)
{
    GError *error = NULL;

    error = NULL;
    display->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
    if (display->priv->connection == NULL) {
        g_critical ("error getting system bus: %s", error->message);
        g_error_free (error);
        exit (1);
    }

    display->priv->object_skeleton = g_dbus_object_skeleton_new (display->priv->id);
    display->priv->display_skeleton = GDM_DBUS_DISPLAY (gdm_dbus_display_skeleton_new ());

    g_signal_connect (display->priv->display_skeleton, "handle-get-id",
                      G_CALLBACK (handle_get_id), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-remote-hostname",
                      G_CALLBACK (handle_get_remote_hostname), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-seat-id",
                      G_CALLBACK (handle_get_seat_id), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-timed-login-details",
                      G_CALLBACK (handle_get_timed_login_details), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-x11-authority-file",
                      G_CALLBACK (handle_get_x11_authority_file), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-x11-cookie",
                      G_CALLBACK (handle_get_x11_cookie), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-x11-display-name",
                      G_CALLBACK (handle_get_x11_display_name), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-x11-display-number",
                      G_CALLBACK (handle_get_x11_display_number), display);
    g_signal_connect (display->priv->display_skeleton, "handle-is-local",
                      G_CALLBACK (handle_is_local), display);
    g_signal_connect (display->priv->display_skeleton, "handle-is-initial",
                      G_CALLBACK (handle_is_initial), display);
    g_signal_connect (display->priv->display_skeleton, "handle-get-slave-bus-name",
                      G_CALLBACK (handle_get_slave_bus_name), display);
    g_signal_connect (display->priv->display_skeleton, "handle-set-slave-bus-name",
                      G_CALLBACK (handle_set_slave_bus_name), display);
    g_signal_connect (display->priv->display_skeleton, "handle-add-user-authorization",
                      G_CALLBACK (handle_add_user_authorization), display);
    g_signal_connect (display->priv->display_skeleton, "handle-remove-user-authorization",
                      G_CALLBACK (handle_remove_user_authorization), display);

    g_dbus_object_skeleton_add_interface (display->priv->object_skeleton,
                                          G_DBUS_INTERFACE_SKELETON (display->priv->display_skeleton));

    return TRUE;
}
示例#6
0
/**
 * storage_daemon_launch_threaded_job:
 * @daemon: A #StorageDaemon.
 * @object: (allow-none): An object to add to the job or %NULL.
 * @job_operation: The operation for the job.
 * @job_started_by_uid: The user who started the job.
 * @job_func: The function to run in another thread.
 * @user_data: User data to pass to @job_func.
 * @user_data_free_func: Function to free @user_data with or %NULL.
 * @cancellable: A #GCancellable or %NULL.
 *
 * Launches a new job by running @job_func in a new dedicated thread.
 *
 * The job is started immediately - connect to the
 * #StorageThreadedJob::threaded-job-completed or #StorageJob::completed
 * signals to get notified when the job is done.
 *
 * Long-running jobs should periodically check @cancellable to see if
 * they have been cancelled.
 *
 * The returned object will be exported on the bus until the
 * #StorageJob::completed signal is emitted on the object. It is not
 * valid to use the returned object after this signal fires.
 *
 * Returns: A #StorageThreadedJob object. Do not free, the object
 * belongs to @manager.
 */
StorageJob *
storage_daemon_launch_threaded_job  (StorageDaemon *daemon,
                                     gpointer object_or_interface,
                                     const gchar *job_operation,
                                     uid_t job_started_by_uid,
                                     StorageJobFunc job_func,
                                     gpointer user_data,
                                     GDestroyNotify user_data_free_func,
                                     GCancellable *cancellable)
{
  StorageThreadedJob *job;
  GDBusObjectSkeleton *job_object;
  gchar *job_object_path;

  g_return_val_if_fail (STORAGE_IS_DAEMON (daemon), NULL);
  g_return_val_if_fail (job_func != NULL, NULL);

  job = storage_threaded_job_new (job_func,
                             user_data,
                             user_data_free_func,
                             cancellable);
  if (object_or_interface != NULL)
    storage_job_add_thing (STORAGE_JOB (job), object_or_interface);

  /* TODO: protect job_id by a mutex */
  job_object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
  job_object = g_dbus_object_skeleton_new (job_object_path);
  g_dbus_object_skeleton_add_interface (job_object, G_DBUS_INTERFACE_SKELETON (job));
  g_free (job_object_path);

  udisks_job_set_cancelable (UDISKS_JOB (job), TRUE);
  udisks_job_set_operation (UDISKS_JOB (job), job_operation);
  udisks_job_set_started_by_uid (UDISKS_JOB (job), job_started_by_uid);

  g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (job_object));

  daemon->num_jobs++;
  g_signal_connect_after (job,
                          "completed",
                          G_CALLBACK (on_job_completed),
                          g_object_ref (daemon));

  g_object_unref (job_object);
  return STORAGE_JOB (job);
}
示例#7
0
StorageJob *
storage_daemon_launch_spawned_jobv (StorageDaemon *self,
                                    gpointer object_or_interface,
                                    const gchar *job_operation,
                                    uid_t job_started_by_uid,
                                    GCancellable *cancellable,
                                    uid_t run_as_uid,
                                    uid_t run_as_euid,
                                    const gchar *input_string,
                                    const gchar **argv)
{
  StorageSpawnedJob *job;
  GDBusObjectSkeleton *job_object;
  gchar *job_object_path;

  g_return_val_if_fail (STORAGE_IS_DAEMON (self), NULL);
  g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);

  job = storage_spawned_job_new (argv, input_string,
                                 run_as_uid, run_as_euid, cancellable);

  if (object_or_interface != NULL)
    storage_job_add_thing (STORAGE_JOB (job), object_or_interface);

  /* TODO: protect job_id by a mutex */
  job_object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
  job_object = g_dbus_object_skeleton_new (job_object_path);
  g_dbus_object_skeleton_add_interface (job_object, G_DBUS_INTERFACE_SKELETON (job));
  g_free (job_object_path);

  udisks_job_set_cancelable (UDISKS_JOB (job), TRUE);
  udisks_job_set_operation (UDISKS_JOB (job), job_operation);
  udisks_job_set_started_by_uid (UDISKS_JOB (job), job_started_by_uid);

  g_dbus_object_manager_server_export (self->object_manager, G_DBUS_OBJECT_SKELETON (job_object));

  self->num_jobs++;
  g_signal_connect_after (job,
                          "completed",
                          G_CALLBACK (on_job_completed),
                          g_object_ref (self));

  g_object_unref (job_object);
  return STORAGE_JOB (job);
}
static void
storaged_linux_volume_group_object_constructed (GObject *_object)
{
    StoragedLinuxVolumeGroupObject *object = STORAGED_LINUX_VOLUME_GROUP_OBJECT (_object);
    GString *s;

    if (G_OBJECT_CLASS (storaged_linux_volume_group_object_parent_class)->constructed != NULL)
        G_OBJECT_CLASS (storaged_linux_volume_group_object_parent_class)->constructed (_object);

    object->logical_volumes = g_hash_table_new_full (g_str_hash,
                              g_str_equal,
                              g_free,
                              (GDestroyNotify) g_object_unref);

    /* compute the object path */
    s = g_string_new ("/org/storaged/Storaged/lvm/");
    storaged_safe_append_to_object_path (s, object->name);
    g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), s->str);
    g_string_free (s, TRUE);

    /* create the DBus interface */
    object->iface_volume_group = storaged_linux_volume_group_new ();
    g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object),
                                          G_DBUS_INTERFACE_SKELETON (object->iface_volume_group));

    /* Watch fstab and crypttab for changes.
     */
    g_signal_connect (storaged_daemon_get_fstab_monitor (object->daemon),
                      "entry-added",
                      G_CALLBACK (etctabs_changed),
                      object);
    g_signal_connect (storaged_daemon_get_fstab_monitor (object->daemon),
                      "entry-removed",
                      G_CALLBACK (etctabs_changed),
                      object);
    g_signal_connect (storaged_daemon_get_crypttab_monitor (object->daemon),
                      "entry-added",
                      G_CALLBACK (etctabs_changed),
                      object);
    g_signal_connect (storaged_daemon_get_crypttab_monitor (object->daemon),
                      "entry-removed",
                      G_CALLBACK (etctabs_changed),
                      object);
}
static void
block_object_update_lvm_iface (StoragedLinuxBlockObject *object,
                               const gchar *lv_obj_path)
{
    StoragedBlockLVM2 *iface_block_lvm2;

    iface_block_lvm2 = storaged_object_peek_block_lvm2 (STORAGED_OBJECT (object));

    if (iface_block_lvm2 == NULL)
    {
        iface_block_lvm2 = storaged_linux_block_lvm2_new ();
        g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object),
                                              G_DBUS_INTERFACE_SKELETON (iface_block_lvm2));
        g_object_unref (iface_block_lvm2);
    }

    storaged_linux_block_lvm2_update (STORAGED_LINUX_BLOCK_LVM2 (iface_block_lvm2), object);
    storaged_block_lvm2_set_logical_volume (iface_block_lvm2, lv_obj_path);
}
static void
udisks_linux_logical_volume_object_constructed (GObject *_object)
{
  UDisksLinuxLogicalVolumeObject *object = UDISKS_LINUX_LOGICAL_VOLUME_OBJECT (_object);
  GString *s;

  if (G_OBJECT_CLASS (udisks_linux_logical_volume_object_parent_class)->constructed != NULL)
    G_OBJECT_CLASS (udisks_linux_logical_volume_object_parent_class)->constructed (_object);

  /* compute the object path */

  s = g_string_new (g_dbus_object_get_object_path (G_DBUS_OBJECT (object->volume_group)));
  g_string_append_c (s, '/');
  udisks_safe_append_to_object_path (s, object->name);
  g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), s->str);
  g_string_free (s, TRUE);

  /* create the DBus interface */
  object->iface_logical_volume = udisks_linux_logical_volume_new ();
  g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object),
                                        G_DBUS_INTERFACE_SKELETON (object->iface_logical_volume));
}