summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2009-10-02 22:31:16 -0700
committerDan Williams <dcbw@redhat.com>2009-10-02 22:31:16 -0700
commite5441115a2dda5d81de2e9a336fc34e23d20b309 (patch)
treec3f479a63ff9b457749041c8b82e2304a2c8ddbc
parentf2a3825f9d10ecebc63ce3c8602473cbbb6ab72c (diff)
bluetooth: recognize rfcomm devices
Two hacks here: 1) rfcomm ports don't have an easily accessible driver name, so we just match the parent's subsystem to 'bluetooth' and use that 2) libgudev doesn't seem be be able to get the rfcomm device's device file, which would normally be /dev/rfcommX. Oh well, we don't use the device file yet anyway
-rw-r--r--plugins/mm-plugin-generic.c16
-rw-r--r--src/mm-plugin-base.c11
2 files changed, 22 insertions, 5 deletions
diff --git a/plugins/mm-plugin-generic.c b/plugins/mm-plugin-generic.c
index 802ab888..3b6cd198 100644
--- a/plugins/mm-plugin-generic.c
+++ b/plugins/mm-plugin-generic.c
@@ -108,16 +108,27 @@ grab_port (MMPluginBase *base,
{
GUdevDevice *port = NULL, *physdev = NULL;
MMModem *modem = NULL;
- const char *name, *subsys, *devfile, *sysfs_path;
+ const char *name, *subsys, *devfile, *sysfs_path, *driver;
guint32 caps;
port = mm_plugin_base_supports_task_get_port (task);
g_assert (port);
+ subsys = g_udev_device_get_subsystem (port);
+ name = g_udev_device_get_name (port);
+
devfile = g_udev_device_get_device_file (port);
if (!devfile) {
+ driver = mm_plugin_base_supports_task_get_driver (task);
+ if (!driver || strcmp (driver, "bluetooth")) {
g_set_error (error, 0, 0, "Could not get port's sysfs file.");
return NULL;
+ } else {
+ g_message ("%s: (%s/%s) WARNING: missing udev 'device' file",
+ mm_plugin_get_name (MM_PLUGIN (base)),
+ subsys,
+ name);
+ }
}
physdev = mm_plugin_base_supports_task_get_physdev (task);
@@ -128,9 +139,6 @@ grab_port (MMPluginBase *base,
return NULL;
}
- subsys = g_udev_device_get_subsystem (port);
- name = g_udev_device_get_name (port);
-
caps = mm_plugin_base_supports_task_get_probed_capabilities (task);
if (!existing) {
if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) {
diff --git a/src/mm-plugin-base.c b/src/mm-plugin-base.c
index 7adbe2a2..92694f50 100644
--- a/src/mm-plugin-base.c
+++ b/src/mm-plugin-base.c
@@ -664,7 +664,7 @@ static char *
get_driver_name (GUdevDevice *device)
{
GUdevDevice *parent = NULL;
- const char *driver;
+ const char *driver, *subsys;
char *ret = NULL;
driver = g_udev_device_get_driver (device);
@@ -672,6 +672,15 @@ get_driver_name (GUdevDevice *device)
parent = g_udev_device_get_parent (device);
if (parent)
driver = g_udev_device_get_driver (parent);
+
+ /* Check for bluetooth; it's driver is a bunch of levels up so we
+ * just check for the subsystem of the parent being bluetooth.
+ */
+ if (!driver && parent) {
+ subsys = g_udev_device_get_subsystem (parent);
+ if (subsys && !strcmp (subsys, "bluetooth"))
+ driver = "bluetooth";
+ }
}
if (driver)