mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-07 17:45:23 +00:00
Add fu_usb_device_new_with_context() helpers
This means the context is set at construction time, which is much less fragile than setting the context manually.
This commit is contained in:
parent
ccc0f9b0c6
commit
bd43647554
@ -1746,8 +1746,10 @@ fu_udev_device_get_siblings_with_subsystem(FuUdevDevice *self, const gchar *cons
|
|||||||
/* if the sysfs path of self's parent is the same as that of the
|
/* if the sysfs path of self's parent is the same as that of the
|
||||||
* located device's parent, they are siblings */
|
* located device's parent, they are siblings */
|
||||||
if (g_strcmp0(udev_parent_path, enumerated_parent_path) == 0) {
|
if (g_strcmp0(udev_parent_path, enumerated_parent_path) == 0) {
|
||||||
g_ptr_array_add(out,
|
FuUdevDevice *dev =
|
||||||
fu_udev_device_new(g_steal_pointer(&enumerated_device)));
|
fu_udev_device_new_with_context(fu_device_get_context(FU_DEVICE(self)),
|
||||||
|
g_steal_pointer(&enumerated_device));
|
||||||
|
g_ptr_array_add(out, dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1787,8 +1789,10 @@ fu_udev_device_get_children_with_subsystem(FuUdevDevice *self, const gchar *cons
|
|||||||
/* enumerated device is a child of self if its parent is the
|
/* enumerated device is a child of self if its parent is the
|
||||||
* same as self */
|
* same as self */
|
||||||
if (g_strcmp0(self_path, enumerated_parent_path) == 0) {
|
if (g_strcmp0(self_path, enumerated_parent_path) == 0) {
|
||||||
g_ptr_array_add(out,
|
FuUdevDevice *dev =
|
||||||
fu_udev_device_new(g_steal_pointer(&enumerated_device)));
|
fu_udev_device_new_with_context(fu_device_get_context(FU_DEVICE(self)),
|
||||||
|
g_steal_pointer(&enumerated_device));
|
||||||
|
g_ptr_array_add(out, dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1925,6 +1929,34 @@ fu_udev_device_class_init(FuUdevDeviceClass *klass)
|
|||||||
g_object_class_install_property(object_class, PROP_DEVICE_FILE, pspec);
|
g_object_class_install_property(object_class, PROP_DEVICE_FILE, pspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_udev_device_new_with_context:
|
||||||
|
* @ctx: (nullable): a #FuContext
|
||||||
|
* @udev_device: a #GUdevDevice
|
||||||
|
*
|
||||||
|
* Creates a new #FuUdevDevice.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): a #FuUdevDevice
|
||||||
|
*
|
||||||
|
* Since: 1.7.1
|
||||||
|
**/
|
||||||
|
FuUdevDevice *
|
||||||
|
fu_udev_device_new_with_context(FuContext *ctx, GUdevDevice *udev_device)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_GUDEV
|
||||||
|
/* create the correct object depending on the subsystem */
|
||||||
|
if (g_strcmp0(g_udev_device_get_subsystem(udev_device), "i2c-dev") == 0) {
|
||||||
|
return g_object_new(FU_TYPE_I2C_DEVICE,
|
||||||
|
"context",
|
||||||
|
ctx,
|
||||||
|
"udev-device",
|
||||||
|
udev_device,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return g_object_new(FU_TYPE_UDEV_DEVICE, "context", ctx, "udev-device", udev_device, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_udev_device_new:
|
* fu_udev_device_new:
|
||||||
* @udev_device: a #GUdevDevice
|
* @udev_device: a #GUdevDevice
|
||||||
@ -1938,12 +1970,5 @@ fu_udev_device_class_init(FuUdevDeviceClass *klass)
|
|||||||
FuUdevDevice *
|
FuUdevDevice *
|
||||||
fu_udev_device_new(GUdevDevice *udev_device)
|
fu_udev_device_new(GUdevDevice *udev_device)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_GUDEV
|
return fu_udev_device_new_with_context(NULL, udev_device);
|
||||||
/* create the correct object depending on the subsystem */
|
|
||||||
if (g_strcmp0(g_udev_device_get_subsystem(udev_device), "i2c-dev") == 0) {
|
|
||||||
return FU_UDEV_DEVICE(
|
|
||||||
g_object_new(FU_TYPE_I2C_DEVICE, "udev-device", udev_device, NULL));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return FU_UDEV_DEVICE(g_object_new(FU_TYPE_UDEV_DEVICE, "udev-device", udev_device, NULL));
|
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,9 @@ typedef enum {
|
|||||||
} FuUdevDeviceFlags;
|
} FuUdevDeviceFlags;
|
||||||
|
|
||||||
FuUdevDevice *
|
FuUdevDevice *
|
||||||
fu_udev_device_new(GUdevDevice *udev_device);
|
fu_udev_device_new(GUdevDevice *udev_device) G_DEPRECATED_FOR(fu_udev_device_new_with_context);
|
||||||
|
FuUdevDevice *
|
||||||
|
fu_udev_device_new_with_context(FuContext *ctx, GUdevDevice *udev_device);
|
||||||
GUdevDevice *
|
GUdevDevice *
|
||||||
fu_udev_device_get_dev(FuUdevDevice *self);
|
fu_udev_device_get_dev(FuUdevDevice *self);
|
||||||
void
|
void
|
||||||
|
@ -585,7 +585,7 @@ fu_udev_device_bind_driver(FuDevice *device,
|
|||||||
dev = fu_usb_device_find_udev_device(self, error);
|
dev = fu_usb_device_find_udev_device(self, error);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
udev_device = fu_udev_device_new(dev);
|
udev_device = fu_udev_device_new_with_context(fu_device_get_context(device), dev);
|
||||||
return fu_device_bind_driver(FU_DEVICE(udev_device), subsystem, driver, error);
|
return fu_device_bind_driver(FU_DEVICE(udev_device), subsystem, driver, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -600,10 +600,27 @@ fu_udev_device_unbind_driver(FuDevice *device, GError **error)
|
|||||||
dev = fu_usb_device_find_udev_device(self, error);
|
dev = fu_usb_device_find_udev_device(self, error);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
udev_device = fu_udev_device_new(dev);
|
udev_device = fu_udev_device_new_with_context(fu_device_get_context(device), dev);
|
||||||
return fu_device_unbind_driver(FU_DEVICE(udev_device), error);
|
return fu_device_unbind_driver(FU_DEVICE(udev_device), error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_usb_device_new_with_context:
|
||||||
|
* @ctx: (nullable): a #FuContext
|
||||||
|
* @usb_device: a USB device
|
||||||
|
*
|
||||||
|
* Creates a new #FuUsbDevice.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): a #FuUsbDevice
|
||||||
|
*
|
||||||
|
* Since: 1.7.1
|
||||||
|
**/
|
||||||
|
FuUsbDevice *
|
||||||
|
fu_usb_device_new_with_context(FuContext *ctx, GUsbDevice *usb_device)
|
||||||
|
{
|
||||||
|
return g_object_new(FU_TYPE_USB_DEVICE, "context", ctx, "usb-device", usb_device, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_usb_device_new:
|
* fu_usb_device_new:
|
||||||
* @usb_device: a USB device
|
* @usb_device: a USB device
|
||||||
@ -617,9 +634,7 @@ fu_udev_device_unbind_driver(FuDevice *device, GError **error)
|
|||||||
FuUsbDevice *
|
FuUsbDevice *
|
||||||
fu_usb_device_new(GUsbDevice *usb_device)
|
fu_usb_device_new(GUsbDevice *usb_device)
|
||||||
{
|
{
|
||||||
FuUsbDevice *device = g_object_new(FU_TYPE_USB_DEVICE, NULL);
|
return fu_usb_device_new_with_context(NULL, usb_device);
|
||||||
fu_usb_device_set_dev(device, usb_device);
|
|
||||||
return FU_USB_DEVICE(device);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_GUSB
|
#ifdef HAVE_GUSB
|
||||||
|
@ -29,7 +29,9 @@ struct _FuUsbDeviceClass {
|
|||||||
};
|
};
|
||||||
|
|
||||||
FuUsbDevice *
|
FuUsbDevice *
|
||||||
fu_usb_device_new(GUsbDevice *usb_device);
|
fu_usb_device_new(GUsbDevice *usb_device) G_DEPRECATED_FOR(fu_usb_device_new_with_context);
|
||||||
|
FuUsbDevice *
|
||||||
|
fu_usb_device_new_with_context(FuContext *ctx, GUsbDevice *usb_device);
|
||||||
guint16
|
guint16
|
||||||
fu_usb_device_get_vid(FuUsbDevice *self);
|
fu_usb_device_get_vid(FuUsbDevice *self);
|
||||||
guint16
|
guint16
|
||||||
|
@ -930,5 +930,7 @@ LIBFWUPDPLUGIN_1.7.1 {
|
|||||||
fu_common_check_full_disk_encryption;
|
fu_common_check_full_disk_encryption;
|
||||||
fu_common_mkdir;
|
fu_common_mkdir;
|
||||||
fu_device_add_string;
|
fu_device_add_string;
|
||||||
|
fu_udev_device_new_with_context;
|
||||||
|
fu_usb_device_new_with_context;
|
||||||
local: *;
|
local: *;
|
||||||
} LIBFWUPDPLUGIN_1.7.0;
|
} LIBFWUPDPLUGIN_1.7.0;
|
||||||
|
@ -267,11 +267,12 @@ fu_plugin_dell_dock_func(gconstpointer user_data)
|
|||||||
DOCK_INFO *dock_info;
|
DOCK_INFO *dock_info;
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
g_autoptr(GPtrArray) devices = NULL;
|
g_autoptr(GPtrArray) devices = NULL;
|
||||||
g_autoptr(FuUsbDevice) fake_usb_device = fu_usb_device_new(NULL);
|
g_autoptr(FuUsbDevice) fake_usb_device = NULL;
|
||||||
gulong added_id;
|
gulong added_id;
|
||||||
gulong register_id;
|
gulong register_id;
|
||||||
|
|
||||||
fu_device_set_context(FU_DEVICE(fake_usb_device), fu_plugin_get_context(self->plugin_dell));
|
fake_usb_device =
|
||||||
|
fu_usb_device_new_with_context(fu_plugin_get_context(self->plugin_dell), NULL);
|
||||||
devices = g_ptr_array_new_with_free_func((GDestroyNotify)g_object_unref);
|
devices = g_ptr_array_new_with_free_func((GDestroyNotify)g_object_unref);
|
||||||
added_id = g_signal_connect(self->plugin_uefi_capsule,
|
added_id = g_signal_connect(self->plugin_uefi_capsule,
|
||||||
"device-added",
|
"device-added",
|
||||||
|
@ -591,13 +591,13 @@ fu_parade_lspcon_device_reload(FuDevice *device, GError **error)
|
|||||||
self->aux_device_name);
|
self->aux_device_name);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
aux_device = fu_udev_device_new(g_steal_pointer(&aux_devices->data));
|
aux_device = fu_udev_device_new_with_context(fu_device_get_context(device),
|
||||||
|
g_steal_pointer(&aux_devices->data));
|
||||||
g_debug("using aux dev %s", fu_udev_device_get_sysfs_path(aux_device));
|
g_debug("using aux dev %s", fu_udev_device_get_sysfs_path(aux_device));
|
||||||
|
|
||||||
/* the following open() requires the device have IDs set */
|
/* the following open() requires the device have IDs set */
|
||||||
if (!fu_udev_device_set_physical_id(aux_device, "drm_dp_aux_dev", error))
|
if (!fu_udev_device_set_physical_id(aux_device, "drm_dp_aux_dev", error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
fu_device_set_context(FU_DEVICE(aux_device), fu_device_get_context(device));
|
|
||||||
|
|
||||||
/* open device to read version from DPCD */
|
/* open device to read version from DPCD */
|
||||||
if ((aux_device_locker = fu_device_locker_new(aux_device, error)) == NULL)
|
if ((aux_device_locker = fu_device_locker_new(aux_device, error)) == NULL)
|
||||||
|
@ -181,9 +181,11 @@ fu_realtek_mst_device_use_aux_dev(FuRealtekMstDevice *self, GError **error)
|
|||||||
* I2C bus that runs over DPDDC on the port represented by the
|
* I2C bus that runs over DPDDC on the port represented by the
|
||||||
* drm_dp_aux_dev */
|
* drm_dp_aux_dev */
|
||||||
for (GList *element = matches; element != NULL; element = element->next) {
|
for (GList *element = matches; element != NULL; element = element->next) {
|
||||||
g_autoptr(FuUdevDevice) device = fu_udev_device_new(element->data);
|
g_autoptr(FuUdevDevice) device = NULL;
|
||||||
g_autoptr(GPtrArray) i2c_devices = NULL;
|
g_autoptr(GPtrArray) i2c_devices = NULL;
|
||||||
|
|
||||||
|
device = fu_udev_device_new_with_context(fu_device_get_context(FU_DEVICE(self)),
|
||||||
|
element->data);
|
||||||
if (bus_device != NULL) {
|
if (bus_device != NULL) {
|
||||||
g_debug("Ignoring additional aux device %s",
|
g_debug("Ignoring additional aux device %s",
|
||||||
fu_udev_device_get_sysfs_path(device));
|
fu_udev_device_get_sysfs_path(device));
|
||||||
@ -221,9 +223,11 @@ fu_realtek_mst_device_use_drm_card(FuRealtekMstDevice *self, GError **error)
|
|||||||
g_udev_enumerator_add_match_name(enumerator, self->dp_card_kernel_name);
|
g_udev_enumerator_add_match_name(enumerator, self->dp_card_kernel_name);
|
||||||
drm_devices = g_udev_enumerator_execute(enumerator);
|
drm_devices = g_udev_enumerator_execute(enumerator);
|
||||||
for (GList *element = drm_devices; element != NULL; element = element->next) {
|
for (GList *element = drm_devices; element != NULL; element = element->next) {
|
||||||
g_autoptr(FuUdevDevice) drm_device = fu_udev_device_new(element->data);
|
g_autoptr(FuUdevDevice) drm_device = NULL;
|
||||||
g_autoptr(GPtrArray) i2c_devices = NULL;
|
g_autoptr(GPtrArray) i2c_devices = NULL;
|
||||||
|
|
||||||
|
drm_device = fu_udev_device_new_with_context(fu_device_get_context(FU_DEVICE(self)),
|
||||||
|
element->data);
|
||||||
if (bus_device != NULL) {
|
if (bus_device != NULL) {
|
||||||
g_debug("Ignoring additional drm device %s",
|
g_debug("Ignoring additional drm device %s",
|
||||||
fu_udev_device_get_sysfs_path(drm_device));
|
fu_udev_device_get_sysfs_path(drm_device));
|
||||||
|
@ -841,6 +841,7 @@ typedef enum TestFlags {
|
|||||||
typedef struct ThunderboltTest {
|
typedef struct ThunderboltTest {
|
||||||
UMockdevTestbed *bed;
|
UMockdevTestbed *bed;
|
||||||
FuPlugin *plugin;
|
FuPlugin *plugin;
|
||||||
|
FuContext *ctx;
|
||||||
GUdevClient *udev_client;
|
GUdevClient *udev_client;
|
||||||
|
|
||||||
/* if TestParam::initialize_tree */
|
/* if TestParam::initialize_tree */
|
||||||
@ -859,8 +860,10 @@ fu_thunderbolt_gudev_uevent_cb(GUdevClient *gudev_client,
|
|||||||
ThunderboltTest *tt)
|
ThunderboltTest *tt)
|
||||||
{
|
{
|
||||||
if (g_strcmp0(action, "add") == 0) {
|
if (g_strcmp0(action, "add") == 0) {
|
||||||
g_autoptr(FuUdevDevice) device = fu_udev_device_new(udev_device);
|
g_autoptr(FuUdevDevice) device = NULL;
|
||||||
g_autoptr(GError) error_local = NULL;
|
g_autoptr(GError) error_local = NULL;
|
||||||
|
|
||||||
|
device = fu_udev_device_new_with_context(tt->ctx, udev_device);
|
||||||
if (!fu_plugin_runner_backend_device_added(tt->plugin,
|
if (!fu_plugin_runner_backend_device_added(tt->plugin,
|
||||||
FU_DEVICE(device),
|
FU_DEVICE(device),
|
||||||
&error_local))
|
&error_local))
|
||||||
@ -888,10 +891,10 @@ test_set_up(ThunderboltTest *tt, gconstpointer params)
|
|||||||
g_autofree gchar *pluginfn = NULL;
|
g_autofree gchar *pluginfn = NULL;
|
||||||
g_autofree gchar *sysfs = NULL;
|
g_autofree gchar *sysfs = NULL;
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
g_autoptr(FuContext) ctx = fu_context_new();
|
|
||||||
const gchar *udev_subsystems[] = {"thunderbolt", NULL};
|
const gchar *udev_subsystems[] = {"thunderbolt", NULL};
|
||||||
|
|
||||||
ret = fu_context_load_quirks(ctx,
|
tt->ctx = fu_context_new();
|
||||||
|
ret = fu_context_load_quirks(tt->ctx,
|
||||||
FU_QUIRKS_LOAD_FLAG_NO_CACHE | FU_QUIRKS_LOAD_FLAG_NO_VERIFY,
|
FU_QUIRKS_LOAD_FLAG_NO_CACHE | FU_QUIRKS_LOAD_FLAG_NO_VERIFY,
|
||||||
&error);
|
&error);
|
||||||
g_assert_no_error(error);
|
g_assert_no_error(error);
|
||||||
@ -903,7 +906,7 @@ test_set_up(ThunderboltTest *tt, gconstpointer params)
|
|||||||
sysfs = umockdev_testbed_get_sys_dir(tt->bed);
|
sysfs = umockdev_testbed_get_sys_dir(tt->bed);
|
||||||
g_debug("mock sysfs at %s", sysfs);
|
g_debug("mock sysfs at %s", sysfs);
|
||||||
|
|
||||||
tt->plugin = fu_plugin_new(ctx);
|
tt->plugin = fu_plugin_new(tt->ctx);
|
||||||
g_assert_nonnull(tt->plugin);
|
g_assert_nonnull(tt->plugin);
|
||||||
|
|
||||||
pluginfn =
|
pluginfn =
|
||||||
@ -955,6 +958,7 @@ static void
|
|||||||
test_tear_down(ThunderboltTest *tt, gconstpointer user_data)
|
test_tear_down(ThunderboltTest *tt, gconstpointer user_data)
|
||||||
{
|
{
|
||||||
g_object_unref(tt->plugin);
|
g_object_unref(tt->plugin);
|
||||||
|
g_object_unref(tt->ctx);
|
||||||
g_object_unref(tt->bed);
|
g_object_unref(tt->bed);
|
||||||
g_object_unref(tt->udev_client);
|
g_object_unref(tt->udev_client);
|
||||||
|
|
||||||
|
@ -25,9 +25,11 @@ G_DEFINE_TYPE(FuUdevBackend, fu_udev_backend, FU_TYPE_BACKEND)
|
|||||||
static void
|
static void
|
||||||
fu_udev_backend_device_add(FuUdevBackend *self, GUdevDevice *udev_device)
|
fu_udev_backend_device_add(FuUdevBackend *self, GUdevDevice *udev_device)
|
||||||
{
|
{
|
||||||
g_autoptr(FuUdevDevice) device = fu_udev_device_new(udev_device);
|
g_autoptr(FuUdevDevice) device = NULL;
|
||||||
|
|
||||||
/* success */
|
/* success */
|
||||||
|
device =
|
||||||
|
fu_udev_device_new_with_context(fu_backend_get_context(FU_BACKEND(self)), udev_device);
|
||||||
fu_backend_device_added(FU_BACKEND(self), FU_DEVICE(device));
|
fu_backend_device_added(FU_BACKEND(self), FU_DEVICE(device));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,9 +23,10 @@ G_DEFINE_TYPE(FuUsbBackend, fu_usb_backend, FU_TYPE_BACKEND)
|
|||||||
static void
|
static void
|
||||||
fu_usb_backend_device_added_cb(GUsbContext *ctx, GUsbDevice *usb_device, FuBackend *backend)
|
fu_usb_backend_device_added_cb(GUsbContext *ctx, GUsbDevice *usb_device, FuBackend *backend)
|
||||||
{
|
{
|
||||||
g_autoptr(FuUsbDevice) device = fu_usb_device_new(usb_device);
|
g_autoptr(FuUsbDevice) device = NULL;
|
||||||
|
|
||||||
/* success */
|
/* success */
|
||||||
|
device = fu_usb_device_new_with_context(fu_backend_get_context(backend), usb_device);
|
||||||
fu_backend_device_added(backend, FU_DEVICE(device));
|
fu_backend_device_added(backend, FU_DEVICE(device));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user