kerneldevice: allow loading physdev subsystem
Used to filter out TTYs when not explicitly whitelisted.
This commit is contained in:
@@ -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;
|
||||
};
|
||||
@@ -299,6 +300,26 @@ preload_physdev_pid (MMKernelDeviceGeneric *self)
|
||||
mm_kernel_event_properties_get_name (self->priv->properties));
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -392,6 +413,7 @@ preload_contents (MMKernelDeviceGeneric *self)
|
||||
preload_driver (self);
|
||||
preload_physdev_vid (self);
|
||||
preload_physdev_pid (self);
|
||||
preload_physdev_subsystem (self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -475,6 +497,14 @@ kernel_device_get_physdev_pid (MMKernelDevice *self)
|
||||
return MM_KERNEL_DEVICE_GENERIC (self)->priv->physdev_pid;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -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;
|
||||
|
||||
@@ -383,6 +383,21 @@ kernel_device_get_physdev_pid (MMKernelDevice *_self)
|
||||
return self->priv->product;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -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;
|
||||
|
||||
@@ -89,6 +89,16 @@ mm_kernel_device_get_physdev_pid (MMKernelDevice *self)
|
||||
0);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user