diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2017-10-12 20:47:17 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-12-05 10:58:28 +0100 |
commit | 0e4e4a6b138cccc49a8f7a4d8bacc9273f8b4cb3 (patch) | |
tree | 71ebe9dd6b84668344088ac215af55bce75d73cb /src/kerneldevice | |
parent | a4271d8433f1b629ac80a0bdd0876413c48712d3 (diff) |
kerneldevice: allow loading physdev subsystem
Used to filter out TTYs when not explicitly whitelisted.
Diffstat (limited to 'src/kerneldevice')
-rw-r--r-- | src/kerneldevice/mm-kernel-device-generic.c | 31 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device-udev.c | 18 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.c | 10 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.h | 3 |
4 files changed, 61 insertions, 1 deletions
diff --git a/src/kerneldevice/mm-kernel-device-generic.c b/src/kerneldevice/mm-kernel-device-generic.c index fb4c7fac..d1d2400c 100644 --- a/src/kerneldevice/mm-kernel-device-generic.c +++ b/src/kerneldevice/mm-kernel-device-generic.c @@ -60,6 +60,7 @@ struct _MMKernelDeviceGenericPrivate { gchar *physdev_sysfs_path; guint16 physdev_vid; guint16 physdev_pid; + gchar *physdev_subsystem; gchar *physdev_manufacturer; gchar *physdev_product; }; @@ -300,6 +301,26 @@ preload_physdev_pid (MMKernelDeviceGeneric *self) } static void +preload_physdev_subsystem (MMKernelDeviceGeneric *self) +{ + if (!self->priv->physdev_subsystem && self->priv->physdev_sysfs_path) { + gchar *aux; + gchar *subsyspath; + + aux = g_strdup_printf ("%s/subsystem", self->priv->physdev_sysfs_path); + subsyspath = canonicalize_file_name (aux); + self->priv->physdev_subsystem = g_path_get_dirname (subsyspath); + g_free (subsyspath); + g_free (aux); + } + + mm_dbg ("(%s/%s) subsystem: %s", + mm_kernel_event_properties_get_subsystem (self->priv->properties), + mm_kernel_event_properties_get_name (self->priv->properties), + self->priv->physdev_subsystem ? self->priv->physdev_subsystem : "unknown"); +} + +static void preload_manufacturer (MMKernelDeviceGeneric *self) { if (!self->priv->physdev_manufacturer) @@ -392,6 +413,7 @@ preload_contents (MMKernelDeviceGeneric *self) preload_driver (self); preload_physdev_vid (self); preload_physdev_pid (self); + preload_physdev_subsystem (self); } /*****************************************************************************/ @@ -476,6 +498,14 @@ kernel_device_get_physdev_pid (MMKernelDevice *self) } static const gchar * +kernel_device_get_physdev_subsystem (MMKernelDevice *self) +{ + g_return_val_if_fail (MM_IS_KERNEL_DEVICE_GENERIC (self), NULL); + + return MM_KERNEL_DEVICE_GENERIC (self)->priv->physdev_subsystem; +} + +static const gchar * kernel_device_get_physdev_manufacturer (MMKernelDevice *self) { g_return_val_if_fail (MM_IS_KERNEL_DEVICE_GENERIC (self), 0); @@ -1069,6 +1099,7 @@ mm_kernel_device_generic_class_init (MMKernelDeviceGenericClass *klass) kernel_device_class->get_physdev_uid = kernel_device_get_physdev_uid; kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid; kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid; + kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem; kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer; kernel_device_class->get_parent_sysfs_path = kernel_device_get_parent_sysfs_path; kernel_device_class->is_candidate = kernel_device_is_candidate; diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c index c07d7b44..1248d5ba 100644 --- a/src/kerneldevice/mm-kernel-device-udev.c +++ b/src/kerneldevice/mm-kernel-device-udev.c @@ -384,6 +384,21 @@ kernel_device_get_physdev_pid (MMKernelDevice *_self) } static const gchar * +kernel_device_get_physdev_subsystem (MMKernelDevice *_self) +{ + MMKernelDeviceUdev *self; + + g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), NULL); + + self = MM_KERNEL_DEVICE_UDEV (_self); + ensure_physdev (self); + if (!self->priv->physdev) + return NULL; + + return g_udev_device_get_subsystem (self->priv->physdev); +} + +static const gchar * kernel_device_get_physdev_manufacturer (MMKernelDevice *_self) { MMKernelDeviceUdev *self; @@ -477,7 +492,7 @@ kernel_device_is_candidate (MMKernelDevice *_self, } /* If the physdev is a 'platform' or 'pnp' device that's not whitelisted, ignore it */ - physdev_subsys = g_udev_device_get_subsystem (self->priv->physdev); + physdev_subsys = mm_kernel_device_get_physdev_subsystem (MM_KERNEL_DEVICE (self)); if ((!g_strcmp0 (physdev_subsys, "platform") || !g_strcmp0 (physdev_subsys, "pnp")) && (!mm_kernel_device_get_global_property_as_boolean (MM_KERNEL_DEVICE (self), "ID_MM_PLATFORM_DRIVER_PROBE"))) { mm_dbg ("(%s/%s): port's parent platform driver is not whitelisted", subsys, name); @@ -879,6 +894,7 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass) kernel_device_class->get_physdev_uid = kernel_device_get_physdev_uid; kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid; kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid; + kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem; kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer; kernel_device_class->get_parent_sysfs_path = kernel_device_get_parent_sysfs_path; kernel_device_class->is_candidate = kernel_device_is_candidate; diff --git a/src/kerneldevice/mm-kernel-device.c b/src/kerneldevice/mm-kernel-device.c index 26b414e2..ce4f7793 100644 --- a/src/kerneldevice/mm-kernel-device.c +++ b/src/kerneldevice/mm-kernel-device.c @@ -90,6 +90,16 @@ mm_kernel_device_get_physdev_pid (MMKernelDevice *self) } const gchar * +mm_kernel_device_get_physdev_subsystem (MMKernelDevice *self) +{ + g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), NULL); + + return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_physdev_subsystem ? + MM_KERNEL_DEVICE_GET_CLASS (self)->get_physdev_subsystem (self) : + NULL); +} + +const gchar * mm_kernel_device_get_physdev_manufacturer (MMKernelDevice *self) { g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), NULL); diff --git a/src/kerneldevice/mm-kernel-device.h b/src/kerneldevice/mm-kernel-device.h index cfec269d..480e1ed5 100644 --- a/src/kerneldevice/mm-kernel-device.h +++ b/src/kerneldevice/mm-kernel-device.h @@ -55,6 +55,8 @@ struct _MMKernelDeviceClass { guint16 (* get_physdev_pid) (MMKernelDevice *self); + const gchar * (* get_physdev_subsystem) (MMKernelDevice *self); + const gchar * (* get_physdev_manufacturer) (MMKernelDevice *self); gboolean (* cmp) (MMKernelDevice *a, MMKernelDevice *b); @@ -87,6 +89,7 @@ const gchar *mm_kernel_device_get_parent_sysfs_path (MMKernelDevice *self); const gchar *mm_kernel_device_get_physdev_uid (MMKernelDevice *self); guint16 mm_kernel_device_get_physdev_vid (MMKernelDevice *self); guint16 mm_kernel_device_get_physdev_pid (MMKernelDevice *self); +const gchar *mm_kernel_device_get_physdev_subsystem (MMKernelDevice *self); const gchar *mm_kernel_device_get_physdev_manufacturer (MMKernelDevice *self); gboolean mm_kernel_device_cmp (MMKernelDevice *a, MMKernelDevice *b); |