diff options
Diffstat (limited to 'src/mm-manager.c')
-rw-r--r-- | src/mm-manager.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/src/mm-manager.c b/src/mm-manager.c index edb6f294..dca384ec 100644 --- a/src/mm-manager.c +++ b/src/mm-manager.c @@ -217,7 +217,8 @@ find_physical_device (GUdevDevice *child) static void device_added (MMManager *manager, GUdevDevice *port, - gboolean hotplugged) + gboolean hotplugged, + gboolean manual_scan) { MMDevice *device; const char *subsys, *name, *physdev_path, *physdev_subsys; @@ -272,6 +273,13 @@ device_added (MMManager *manager, goto out; } + /* Is the device in the manual-only greylist? If so, return if this is an + * automatic scan. */ + if (!manual_scan && g_udev_device_get_property_as_boolean (physdev, "ID_MM_DEVICE_MANUAL_SCAN_ONLY")) { + mm_dbg ("(%s/%s): port probed only in manual scan", subsys, name); + goto out; + } + /* If the physdev is a 'platform' device that's not whitelisted, ignore it */ physdev_subsys = g_udev_device_get_subsystem (physdev); if ( physdev_subsys @@ -395,7 +403,7 @@ handle_uevent (GUdevClient *client, name = g_udev_device_get_name (device); if ( (g_str_equal (action, "add") || g_str_equal (action, "move") || g_str_equal (action, "change")) && (!g_str_has_prefix (subsys, "usb") || (name && g_str_has_prefix (name, "cdc-wdm")))) - device_added (self, device, TRUE); + device_added (self, device, TRUE, FALSE); else if (g_str_equal (action, "remove")) device_removed (self, device); } @@ -403,12 +411,13 @@ handle_uevent (GUdevClient *client, typedef struct { MMManager *self; GUdevDevice *device; + gboolean manual_scan; } StartDeviceAdded; static gboolean start_device_added_idle (StartDeviceAdded *ctx) { - device_added (ctx->self, ctx->device, FALSE); + device_added (ctx->self, ctx->device, FALSE, ctx->manual_scan); g_object_unref (ctx->self); g_object_unref (ctx->device); g_slice_free (StartDeviceAdded, ctx); @@ -417,36 +426,39 @@ start_device_added_idle (StartDeviceAdded *ctx) static void start_device_added (MMManager *self, - GUdevDevice *device) + GUdevDevice *device, + gboolean manual_scan) { StartDeviceAdded *ctx; ctx = g_slice_new (StartDeviceAdded); ctx->self = g_object_ref (self); ctx->device = g_object_ref (device); + ctx->manual_scan = manual_scan; g_idle_add ((GSourceFunc)start_device_added_idle, ctx); } void -mm_manager_start (MMManager *manager) +mm_manager_start (MMManager *manager, + gboolean manual_scan) { GList *devices, *iter; g_return_if_fail (manager != NULL); g_return_if_fail (MM_IS_MANAGER (manager)); - mm_dbg ("Starting device scan..."); + mm_dbg ("Starting %s device scan...", manual_scan ? "manual" : "automatic"); devices = g_udev_client_query_by_subsystem (manager->priv->udev, "tty"); for (iter = devices; iter; iter = g_list_next (iter)) { - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); devices = g_udev_client_query_by_subsystem (manager->priv->udev, "net"); for (iter = devices; iter; iter = g_list_next (iter)) { - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -457,7 +469,7 @@ mm_manager_start (MMManager *manager) name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data)); if (name && g_str_has_prefix (name, "cdc-wdm")) - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -469,7 +481,7 @@ mm_manager_start (MMManager *manager) name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data)); if (name && g_str_has_prefix (name, "cdc-wdm")) - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -629,7 +641,7 @@ scan_devices_auth_ready (MMAuthProvider *authp, g_dbus_method_invocation_take_error (ctx->invocation, error); else { /* Otherwise relaunch device scan */ - mm_manager_start (MM_MANAGER (ctx->self)); + mm_manager_start (MM_MANAGER (ctx->self), TRUE); mm_gdbus_org_freedesktop_modem_manager1_complete_scan_devices ( MM_GDBUS_ORG_FREEDESKTOP_MODEM_MANAGER1 (ctx->self), ctx->invocation); |