aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-10-12 20:47:17 +0200
committerAleksander Morgado <aleksander@aleksander.es>2017-12-05 10:58:28 +0100
commit0e4e4a6b138cccc49a8f7a4d8bacc9273f8b4cb3 (patch)
tree71ebe9dd6b84668344088ac215af55bce75d73cb /src
parenta4271d8433f1b629ac80a0bdd0876413c48712d3 (diff)
kerneldevice: allow loading physdev subsystem
Used to filter out TTYs when not explicitly whitelisted.
Diffstat (limited to 'src')
-rw-r--r--src/kerneldevice/mm-kernel-device-generic.c31
-rw-r--r--src/kerneldevice/mm-kernel-device-udev.c18
-rw-r--r--src/kerneldevice/mm-kernel-device.c10
-rw-r--r--src/kerneldevice/mm-kernel-device.h3
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);