aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qmi-firmware-update/qfu-device-selection.c8
-rw-r--r--src/qmi-firmware-update/qfu-udev-helpers.c47
-rw-r--r--src/qmi-firmware-update/qfu-udev-helpers.h4
3 files changed, 56 insertions, 3 deletions
diff --git a/src/qmi-firmware-update/qfu-device-selection.c b/src/qmi-firmware-update/qfu-device-selection.c
index bc2d920..136840b 100644
--- a/src/qmi-firmware-update/qfu-device-selection.c
+++ b/src/qmi-firmware-update/qfu-device-selection.c
@@ -41,6 +41,8 @@ struct _QfuDeviceSelectionPrivate {
guint preferred_devnum;
/* sysfs path */
gchar *sysfs_path;
+ /* generic udev monitor */
+ QfuUdevHelperGenericMonitor *monitor;
};
/******************************************************************************/
@@ -270,6 +272,9 @@ qfu_device_selection_new (const gchar *preferred_cdc_wdm,
return NULL;
}
+ /* Initialize right away the generic udev monitor for this sysfs path */
+ self->priv->monitor = qfu_udev_helper_generic_monitor_new (self->priv->sysfs_path);
+
return self;
}
@@ -285,6 +290,9 @@ finalize (GObject *object)
QfuDeviceSelection *self = QFU_DEVICE_SELECTION (object);
guint i;
+ if (self->priv->monitor)
+ qfu_udev_helper_generic_monitor_free (self->priv->monitor);
+
for (i = 0; i < QFU_UDEV_HELPER_DEVICE_TYPE_LAST; i++)
g_free (self->priv->preferred_devices[i]);
g_free (self->priv->sysfs_path);
diff --git a/src/qmi-firmware-update/qfu-udev-helpers.c b/src/qmi-firmware-update/qfu-udev-helpers.c
index 33c4b15..c789703 100644
--- a/src/qmi-firmware-update/qfu-udev-helpers.c
+++ b/src/qmi-firmware-update/qfu-udev-helpers.c
@@ -495,8 +495,6 @@ handle_uevent (GUdevClient *client,
ctx = (WaitForDeviceContext *) g_task_get_task_data (task);
- g_debug ("[qfu-udev] event: %s %s", action, g_udev_device_get_name (device));
-
if (!g_str_equal (action, "add") && !g_str_equal (action, "move") && !g_str_equal (action, "change"))
return;
@@ -504,7 +502,9 @@ handle_uevent (GUdevClient *client,
if (!file)
return;
- g_debug ("[qfu-udev] waiting device matched");
+ g_debug ("[qfu-udev] waiting device (%s) matched: %s",
+ qfu_udev_helper_device_type_to_string (ctx->device_type),
+ g_udev_device_get_name (device));
/* Disconnect this handler */
g_signal_handler_disconnect (ctx->udev, ctx->uevent_id);
@@ -609,3 +609,44 @@ qfu_udev_helper_wait_for_device (QfuUdevHelperDeviceType device_type,
/* Note: task ownership is shared between the signals and the timeout */
}
+
+/******************************************************************************/
+
+struct _QfuUdevHelperGenericMonitor {
+ GUdevClient *udev;
+};
+
+void
+qfu_udev_helper_generic_monitor_free (QfuUdevHelperGenericMonitor *self)
+{
+ g_object_unref (self->udev);
+ g_slice_free (QfuUdevHelperGenericMonitor, self);
+}
+
+static void
+handle_uevent_generic (GUdevClient *client,
+ const char *action,
+ GUdevDevice *device,
+ GTask *task)
+{
+ g_debug ("[qfu-udev] event: %s %s", action, g_udev_device_get_name (device));
+}
+
+QfuUdevHelperGenericMonitor *
+qfu_udev_helper_generic_monitor_new (const gchar *sysfs_path)
+{
+ static const gchar *all_list[] = {
+ "usbmisc", "usb",
+ "tty",
+ "net",
+ NULL };
+
+ QfuUdevHelperGenericMonitor *self;
+
+ self = g_slice_new0 (QfuUdevHelperGenericMonitor);
+ self->udev = g_udev_client_new (all_list);
+
+ /* Monitor for device events. */
+ g_signal_connect (self->udev, "uevent", G_CALLBACK (handle_uevent_generic), NULL);
+ return self;
+}
diff --git a/src/qmi-firmware-update/qfu-udev-helpers.h b/src/qmi-firmware-update/qfu-udev-helpers.h
index 1d3672e..dad818e 100644
--- a/src/qmi-firmware-update/qfu-udev-helpers.h
+++ b/src/qmi-firmware-update/qfu-udev-helpers.h
@@ -56,6 +56,10 @@ void qfu_udev_helper_wait_for_device (QfuUdevHelperDeviceType device_
GFile *qfu_udev_helper_wait_for_device_finish (GAsyncResult *res,
GError **error);
+typedef struct _QfuUdevHelperGenericMonitor QfuUdevHelperGenericMonitor;
+QfuUdevHelperGenericMonitor *qfu_udev_helper_generic_monitor_new (const gchar *sysfs_path);
+void qfu_udev_helper_generic_monitor_free (QfuUdevHelperGenericMonitor *self);
+
G_END_DECLS
#endif /* QFU_UDEV_HELPERS_H */