static void storaged_linux_block_object_constructed (GObject *_object) { StoragedLinuxBlockObject *object = STORAGED_LINUX_BLOCK_OBJECT (_object); GString *str; object->mount_monitor = storaged_daemon_get_mount_monitor (object->daemon); g_signal_connect (object->mount_monitor, "mount-added", G_CALLBACK (on_mount_monitor_mount_added), object); g_signal_connect (object->mount_monitor, "mount-removed", G_CALLBACK (on_mount_monitor_mount_removed), object); /* initial coldplug */ storaged_linux_block_object_uevent (object, "add", NULL); /* compute the object path */ str = g_string_new ("/org/storaged/Storaged/block_devices/"); storaged_safe_append_to_object_path (str, g_udev_device_get_name (object->device->udev_device)); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), str->str); g_string_free (str, TRUE); if (G_OBJECT_CLASS (storaged_linux_block_object_parent_class)->constructed != NULL) G_OBJECT_CLASS (storaged_linux_block_object_parent_class)->constructed (_object); }
static void storaged_linux_drive_object_constructed (GObject *_object) { StoragedLinuxDriveObject *object = STORAGED_LINUX_DRIVE_OBJECT (_object); gchar *vendor; gchar *model; gchar *serial; GString *str; /* initial coldplug */ storaged_linux_drive_object_uevent (object, "add", object->devices->data); /* compute the object path */ vendor = g_strdup (storaged_drive_get_vendor (object->iface_drive)); model = g_strdup (storaged_drive_get_model (object->iface_drive)); serial = g_strdup (storaged_drive_get_serial (object->iface_drive)); strip_and_replace_with_uscore (vendor); strip_and_replace_with_uscore (model); strip_and_replace_with_uscore (serial); str = g_string_new ("/org/storaged/Storaged/drives/"); if (vendor == NULL && model == NULL && serial == NULL) { g_string_append (str, "drive"); } else { /* <VENDOR>_<MODEL>_<SERIAL> */ if (vendor != NULL && strlen (vendor) > 0) { storaged_safe_append_to_object_path (str, vendor); } if (model != NULL && strlen (model) > 0) { if (str->str[str->len - 1] != '/') g_string_append_c (str, '_'); storaged_safe_append_to_object_path (str, model); } if (serial != NULL && strlen (serial) > 0) { if (str->str[str->len - 1] != '/') g_string_append_c (str, '_'); storaged_safe_append_to_object_path (str, serial); } } g_free (vendor); g_free (model); g_free (serial); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), str->str); g_string_free (str, TRUE); if (G_OBJECT_CLASS (storaged_linux_drive_object_parent_class)->constructed != NULL) G_OBJECT_CLASS (storaged_linux_drive_object_parent_class)->constructed (_object); }
static void dummy_loop_object_constructed (GObject *_object) { DummyLoopObject *object = DUMMY_LOOP_OBJECT (_object); /* initial coldplug */ dummy_loop_object_process_uevent (STORAGED_MODULE_OBJECT (_object), "add", object->devices->data); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), "/org/storaged/Storaged/dummy/loops"); if (G_OBJECT_CLASS (dummy_loop_object_parent_class)->constructed != NULL) G_OBJECT_CLASS (dummy_loop_object_parent_class)->constructed (_object); }
static void udisks_linux_mdraid_object_constructed (GObject *_object) { UDisksLinuxMDRaidObject *object = UDISKS_LINUX_MDRAID_OBJECT (_object); gchar *uuid; gchar *s; /* compute the object path */ uuid = g_strdup (object->uuid); strip_and_replace_with_uscore (uuid); s = g_strdup_printf ("/org/freedesktop/UDisks2/mdraid/%s", uuid); g_free (uuid); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), s); g_free (s); if (G_OBJECT_CLASS (udisks_linux_mdraid_object_parent_class)->constructed != NULL) G_OBJECT_CLASS (udisks_linux_mdraid_object_parent_class)->constructed (_object); }
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 g_dbus_object_skeleton_set_property (GObject *_object, guint prop_id, const GValue *value, GParamSpec *pspec) { GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); switch (prop_id) { case PROP_OBJECT_PATH: g_dbus_object_skeleton_set_object_path (object, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (_object, prop_id, pspec); break; } }
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)); }
/** * g_dbus_object_manager_server_export_uniquely: * @manager: A #GDBusObjectManagerServer. * @object: An object. * * Like g_dbus_object_manager_server_export() but appends a string of * the form <literal>_N</literal> (with N being a natural number) to * @object<!-- -->'s object path if an object with the given path * already exists. As such, the #GDBusObjectProxy:object-path property * of @object may be modified. * * Since: 2.30 */ void g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager, GDBusObjectSkeleton *object) { gchar *orig_object_path; gchar *object_path; guint count; gboolean modified; orig_object_path = g_strdup (g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); g_return_if_fail (G_IS_DBUS_OBJECT (object)); g_return_if_fail (g_str_has_prefix (orig_object_path, manager->priv->object_path_ending_in_slash)); object_path = g_strdup (orig_object_path); count = 1; modified = FALSE; while (TRUE) { RegistrationData *data; data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); if (data == NULL) { break; } g_free (object_path); object_path = g_strdup_printf ("%s_%d", orig_object_path, count++); modified = TRUE; } if (modified) g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), object_path); g_dbus_object_manager_server_export (manager, object); g_free (object_path); g_free (orig_object_path); }
static void provider_update_objects (StorageProvider *provider) { GDBusObjectManagerServer *object_manager; GList *udisks_objects; GList *lvm_objects; GList *wanted; GList *added, *removed; GList *l; object_manager = G_DBUS_OBJECT_MANAGER_SERVER (daemon_get_object_manager (provider->daemon)); udisks_objects = g_dbus_object_manager_get_objects (udisks_client_get_object_manager (provider->udisks_client)); lvm_objects = g_dbus_object_manager_get_objects (provider->lvm_objman); wanted = NULL; for (l = udisks_objects; l != NULL; l = l->next) { GDBusInterface *iface = get_udisk_iface (UDISKS_OBJECT (l->data)); if (iface == NULL) continue; wanted = g_list_prepend (wanted, g_object_ref (iface)); } for (l = lvm_objects; l != NULL; l = l->next) { if (!LVM_IS_OBJECT (l->data)) continue; GDBusInterface *iface = get_lvm_iface (LVM_OBJECT (l->data)); if (iface == NULL) continue; wanted = g_list_prepend (wanted, g_object_ref (iface)); } wanted = g_list_sort (wanted, (GCompareFunc)udisks_iface_compare_func); provider->ifaces = g_list_sort (provider->ifaces, (GCompareFunc)udisks_iface_compare_func); diff_sorted_lists (provider->ifaces, wanted, (GCompareFunc)udisks_iface_compare_func, &added, &removed, NULL); for (l = removed; l != NULL; l = l->next) { GDBusInterface *iface = G_DBUS_INTERFACE (l->data); StorageObject *object; object = g_hash_table_lookup (provider->hash_interface_to_storage_object, iface); g_warn_if_fail (object != NULL); if (object) { g_warn_if_fail (g_dbus_object_manager_server_unexport (object_manager, g_dbus_object_get_object_path (G_DBUS_OBJECT (object)))); } g_hash_table_remove (provider->hash_interface_to_storage_object, iface); provider->ifaces = g_list_remove (provider->ifaces, iface); g_object_unref (iface); } for (l = added; l != NULL; l = l->next) { GDBusInterface *iface = G_DBUS_INTERFACE (l->data); StorageObject *object = make_storage_object (provider, iface); g_warn_if_fail (g_hash_table_lookup (provider->hash_interface_to_storage_object, iface) == NULL); g_hash_table_insert (provider->hash_interface_to_storage_object, g_object_ref (iface), object); gs_free gchar *object_path = storage_object_make_object_path (object); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), object_path); g_dbus_object_manager_server_export_uniquely (object_manager, G_DBUS_OBJECT_SKELETON (object)); provider->ifaces = g_list_prepend (provider->ifaces, g_object_ref (iface)); } g_list_free (added); g_list_free (removed); g_list_free_full (udisks_objects, g_object_unref); g_list_free_full (lvm_objects, g_object_unref); g_list_free_full (wanted, g_object_unref); }