From 3ccd267ad2917492ca70b763b62e7510786a5073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 21 Jan 2021 15:43:38 +0100 Subject: [PATCH] debian/patches: Use hwdb to store device autosuspend rules and drop debian specifics Upstream will use an hwdb to store the device autosuspend (that will be included in systemd also, so libfprint packagin may stop shipping it at later point), so use it earlier. Drop the debian specific rules to set the devices part of the `plugdev` group as such devices should not be ever readable by an user, but the access should be managed through a libfprint-based service (frpintd at the date). --- .../Drop-version-from-libfprint-hwdb.patch | 178 +++++ ...enerate-a-hwdb-instead-of-udev-rules.patch | 491 ++++++++++++++ ...build-Ensure-we-process-the-data-dir.patch | 21 + ...sing-versioned-libname-for-hwdb-file.patch | 22 + ...ed-but-hardcoded-autosuspend-hwdb-fi.patch | 437 ++++++++++++ ...-udev-rules-creator-for-Debian-usage.patch | 42 -- ...ed-but-hardcoded-autosuspend-rules-f.patch | 629 ------------------ .../meson-Always-build-hwdb-file.patch | 59 ++ debian/patches/series | 8 +- ...wline-to-busname-devname-sysfs-attri.patch | 2 - ...vent-devices-from-being-listed-twice.patch | 4 +- ...-Print-warning-if-an-ID-is-supported.patch | 4 +- ...s-Remove-supported-synaptics-devices.patch | 2 +- 13 files changed, 1219 insertions(+), 680 deletions(-) create mode 100644 debian/patches/Drop-version-from-libfprint-hwdb.patch create mode 100644 debian/patches/Generate-a-hwdb-instead-of-udev-rules.patch create mode 100644 debian/patches/build-Ensure-we-process-the-data-dir.patch create mode 100644 debian/patches/data-Keep-using-versioned-libname-for-hwdb-file.patch create mode 100644 debian/patches/data-Use-auto-generated-but-hardcoded-autosuspend-hwdb-fi.patch delete mode 100644 debian/patches/debian/Tweak-the-udev-rules-creator-for-Debian-usage.patch delete mode 100644 debian/patches/debian/data-Use-auto-generated-but-hardcoded-autosuspend-rules-f.patch create mode 100644 debian/patches/meson-Always-build-hwdb-file.patch diff --git a/debian/patches/Drop-version-from-libfprint-hwdb.patch b/debian/patches/Drop-version-from-libfprint-hwdb.patch new file mode 100644 index 00000000..e35f5303 --- /dev/null +++ b/debian/patches/Drop-version-from-libfprint-hwdb.patch @@ -0,0 +1,178 @@ +From: Benjamin Berg +Date: Tue, 19 Jan 2021 14:42:35 +0100 +Subject: Drop version from libfprint hwdb + +As we are shipping a hwdb file now, we cannot have a collision with the +old libfprint version. Also, we are going to pull these rules into +systemd and they will not be installed via libfprint in the future. As +such, collisions will not happen again and it makes more sense like this +for systemd. +--- + .gitlab-ci.yml | 144 -------------------------------------------------- + libfprint/meson.build | 2 +- + 2 files changed, 1 insertion(+), 145 deletions(-) + delete mode 100644 .gitlab-ci.yml + +diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml +deleted file mode 100644 +index 3f0925b..0000000 +--- a/.gitlab-ci.yml ++++ /dev/null +@@ -1,144 +0,0 @@ +-include: +- - local: '.gitlab-ci/libfprint-templates.yaml' +- - project: 'wayland/ci-templates' +- ref: master +- file: '/templates/fedora.yml' +- - remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml' +- +-variables: +- extends: .libfprint_common_variables +- FDO_DISTRIBUTION_TAG: latest +- FDO_DISTRIBUTION_VERSION: rawhide +- FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG" +- BUNDLE: "org.freedesktop.libfprint.Demo.flatpak" +- LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546" +- +-stages: +- - check-source +- - build +- - test +- - flatpak +- +-image: "$FEDORA_IMAGE" +- +-.build_one_driver_template: &build_one_driver +- script: +- # Build with a driver that doesn't need imaging, or nss +- - meson --werror -Ddrivers=$driver . _build +- - ninja -C _build +- - rm -rf _build/ +- +-.build_template: &build +- script: +- # And build with everything +- - meson --werror -Ddrivers=all . _build +- - ninja -C _build +- - ninja -C _build install +- +-.build_template: &check_abi +- script: +- - ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD) +- +-build: +- stage: build +- except: +- variables: +- - $CI_PIPELINE_SOURCE == "schedule" +- variables: +- driver: virtual_image +- <<: *build_one_driver +- <<: *build +-# <<: *check_abi +- artifacts: +- expose_as: "HTML Documentation" +- paths: +- - _build/doc/html/ +- expire_in: 1 week +- +-test: +- stage: test +- except: +- variables: +- - $CI_PIPELINE_SOURCE == "schedule" +- script: +- - meson --werror -Ddrivers=all -Db_coverage=true . _build +- - ninja -C _build +- - meson test -C _build --verbose --no-stdsplit --timeout-multiplier 3 +- - ninja -C _build coverage +- - cat _build/meson-logs/coverage.txt +- artifacts: +- paths: +- - _build/meson-logs +- expire_in: 1 week +- coverage: '/^TOTAL.*\s+(\d+\%)$/' +- +-test_valgrind: +- stage: test +- except: +- variables: +- - $CI_PIPELINE_SOURCE == "schedule" +- script: +- - meson -Ddrivers=all . _build +- - ninja -C _build +- - meson test -C _build --verbose --no-stdsplit --setup=valgrind +- +-test_scan_build: +- stage: test +- except: +- variables: +- - $CI_PIPELINE_SOURCE == "schedule" +- allow_failure: true +- script: +- - meson -Ddrivers=all . _build +- # This is ugly, the wrapper disables the malloc checker +- - SCANBUILD=$CI_PROJECT_DIR/.gitlab-ci/scan-build ninja -C _build scan-build +- # Check that the directory is empty +- - "! ls -A _build/meson-logs/scanbuild | grep -q ." +- artifacts: +- paths: +- - _build/meson-logs +- expire_in: 1 week +- +-test_indent: +- stage: check-source +- except: +- variables: +- - $CI_PIPELINE_SOURCE == "schedule" +- script: +- - scripts/uncrustify.sh +- - git diff +- - "! git status -s | grep -q ." +- +-flatpak: +- stage: flatpak +- extends: .flatpak +- image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:3.36 +- variables: +- MANIFEST_PATH: "demo/org.freedesktop.libfprint.Demo.json" +- FLATPAK_MODULE: "libfprint" +- APP_ID: "org.freedesktop.libfprint.Demo" +- rules: +- - if: '$CI_PROJECT_PATH != "libfprint/libfprint"' +- when: never +- - if: '$CI_PIPELINE_SOURCE == "schedule"' +- when: never +- - if: '$CI_COMMIT_BRANCH == "master"' +- when: always +- - if: '$CI_COMMIT_TAG' +- when: always +- # For any other (commit), allow manual run. +- # This excludes MRs which would create a duplicate pipeline +- - if: '$CI_COMMIT_BRANCH' +- when: manual +- allow_failure: true +- +-# CONTAINERS creation stage +-container_fedora_build: +- extends: .fdo.container-build@fedora +- only: +- variables: +- - $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES" +- variables: +- GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image +- # a list of packages to install +- FDO_DISTRIBUTION_PACKAGES: $LIBFPRINT_DEPENDENCIES +diff --git a/libfprint/meson.build b/libfprint/meson.build +index 3464bf3..abf2fb9 100644 +--- a/libfprint/meson.build ++++ b/libfprint/meson.build +@@ -304,7 +304,7 @@ udev_hwdb = executable('fprint-list-udev-hwdb', + # We always build this file; primarily so that systemd can pull it + # from the artefacts! + custom_target('udev-rules', +- output: '60-autosuspend-@0@.hwdb'.format(versioned_libname), ++ output: '60-autosuspend-@0@.hwdb'.format(meson.project_name()), + capture: true, + command: [ udev_hwdb ], + install: get_option('udev_rules'), diff --git a/debian/patches/Generate-a-hwdb-instead-of-udev-rules.patch b/debian/patches/Generate-a-hwdb-instead-of-udev-rules.patch new file mode 100644 index 00000000..cd8c50da --- /dev/null +++ b/debian/patches/Generate-a-hwdb-instead-of-udev-rules.patch @@ -0,0 +1,491 @@ +From: Benjamin Berg +Date: Tue, 19 Jan 2021 14:13:03 +0100 +Subject: Generate a hwdb instead of udev rules + +We only use the rules/hwdb to enable auto-suspend. So, instead of +shipping our own rules, we can just use the existing autosuspend rules +and ship a hwdb that sets the appropriate flag. + +Closes: #336 + +Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/55a2bb55 +--- + libfprint/fprint-list-udev-hwdb.c | 191 +++++++++++++++++++++++++++++++++++++ + libfprint/fprint-list-udev-rules.c | 188 ------------------------------------ + libfprint/meson.build | 10 +- + meson.build | 6 +- + meson_options.txt | 4 +- + tests/meson.build | 4 +- + 6 files changed, 203 insertions(+), 200 deletions(-) + create mode 100644 libfprint/fprint-list-udev-hwdb.c + delete mode 100644 libfprint/fprint-list-udev-rules.c + +diff --git a/libfprint/fprint-list-udev-hwdb.c b/libfprint/fprint-list-udev-hwdb.c +new file mode 100644 +index 0000000..b687085 +--- /dev/null ++++ b/libfprint/fprint-list-udev-hwdb.c +@@ -0,0 +1,191 @@ ++/* ++ * Copyright (C) 2009 Red Hat ++ * Copyright (C) 2008 Bastien Nocera ++ * Copyright (C) 2008 Timo Hoenig , ++ * Copyright (C) 2019 Benjamin Berg ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include ++ ++#include "fpi-context.h" ++#include "fpi-device.h" ++ ++static const FpIdEntry whitelist_id_table[] = { ++ /* Currently known and unsupported devices. ++ * You can generate this list from the wiki page using e.g.: ++ * gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p' ++ */ ++ { .vid = 0x04f3, .pid = 0x036b }, ++ { .vid = 0x04f3, .pid = 0x0c00 }, ++ { .vid = 0x04f3, .pid = 0x0c4b }, ++ { .vid = 0x04f3, .pid = 0x0c4c }, ++ { .vid = 0x04f3, .pid = 0x0c4f }, ++ { .vid = 0x04f3, .pid = 0x0c57 }, ++ { .vid = 0x04f3, .pid = 0x2706 }, ++ { .vid = 0x06cb, .pid = 0x0081 }, ++ { .vid = 0x06cb, .pid = 0x0088 }, ++ { .vid = 0x06cb, .pid = 0x008a }, ++ { .vid = 0x06cb, .pid = 0x009a }, ++ { .vid = 0x06cb, .pid = 0x009b }, ++ { .vid = 0x06cb, .pid = 0x00a2 }, ++ { .vid = 0x06cb, .pid = 0x00b7 }, ++ { .vid = 0x06cb, .pid = 0x00bb }, ++ { .vid = 0x06cb, .pid = 0x00be }, ++ { .vid = 0x06cb, .pid = 0x00cb }, ++ { .vid = 0x06cb, .pid = 0x00d8 }, ++ { .vid = 0x06cb, .pid = 0x00da }, ++ { .vid = 0x0a5c, .pid = 0x5801 }, ++ { .vid = 0x0a5c, .pid = 0x5805 }, ++ { .vid = 0x0a5c, .pid = 0x5834 }, ++ { .vid = 0x0a5c, .pid = 0x5843 }, ++ { .vid = 0x10a5, .pid = 0x0007 }, ++ { .vid = 0x1188, .pid = 0x9545 }, ++ { .vid = 0x138a, .pid = 0x0007 }, ++ { .vid = 0x138a, .pid = 0x003a }, ++ { .vid = 0x138a, .pid = 0x003c }, ++ { .vid = 0x138a, .pid = 0x003d }, ++ { .vid = 0x138a, .pid = 0x003f }, ++ { .vid = 0x138a, .pid = 0x0090 }, ++ { .vid = 0x138a, .pid = 0x0091 }, ++ { .vid = 0x138a, .pid = 0x0092 }, ++ { .vid = 0x138a, .pid = 0x0094 }, ++ { .vid = 0x138a, .pid = 0x0097 }, ++ { .vid = 0x138a, .pid = 0x009d }, ++ { .vid = 0x138a, .pid = 0x00ab }, ++ { .vid = 0x147e, .pid = 0x1002 }, ++ { .vid = 0x1491, .pid = 0x0088 }, ++ { .vid = 0x16d1, .pid = 0x1027 }, ++ { .vid = 0x1c7a, .pid = 0x0300 }, ++ { .vid = 0x1c7a, .pid = 0x0570 }, ++ { .vid = 0x1c7a, .pid = 0x0575 }, ++ { .vid = 0x27c6, .pid = 0x5042 }, ++ { .vid = 0x27c6, .pid = 0x5110 }, ++ { .vid = 0x27c6, .pid = 0x5117 }, ++ { .vid = 0x27c6, .pid = 0x5201 }, ++ { .vid = 0x27c6, .pid = 0x521d }, ++ { .vid = 0x27c6, .pid = 0x5301 }, ++ { .vid = 0x27c6, .pid = 0x530c }, ++ { .vid = 0x27c6, .pid = 0x532d }, ++ { .vid = 0x27c6, .pid = 0x533c }, ++ { .vid = 0x27c6, .pid = 0x5381 }, ++ { .vid = 0x27c6, .pid = 0x5385 }, ++ { .vid = 0x27c6, .pid = 0x538c }, ++ { .vid = 0x27c6, .pid = 0x538d }, ++ { .vid = 0x27c6, .pid = 0x5395 }, ++ { .vid = 0x27c6, .pid = 0x5584 }, ++ { .vid = 0x27c6, .pid = 0x55a2 }, ++ { .vid = 0x27c6, .pid = 0x55a4 }, ++ { .vid = 0x27c6, .pid = 0x55b4 }, ++ { .vid = 0x27c6, .pid = 0x5740 }, ++ { .vid = 0x2808, .pid = 0x9338 }, ++ { .vid = 0x298d, .pid = 0x2033 }, ++ { .vid = 0x3538, .pid = 0x0930 }, ++ { .vid = 0 }, ++}; ++ ++static const FpIdEntry blacklist_id_table[] = { ++ { .vid = 0x0483, .pid = 0x2016 }, ++ /* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */ ++ { .vid = 0x045e, .pid = 0x00bb }, ++ { .vid = 0 }, ++}; ++ ++static const FpDeviceClass whitelist = { ++ .type = FP_DEVICE_TYPE_USB, ++ .id_table = whitelist_id_table, ++ .id = "whitelist", ++ .full_name = "Hardcoded whitelist" ++}; ++ ++GHashTable *printed = NULL; ++ ++static void ++print_driver (const FpDeviceClass *cls) ++{ ++ const FpIdEntry *entry; ++ gint num_printed = 0; ++ ++ if (cls->type != FP_DEVICE_TYPE_USB) ++ return; ++ ++ for (entry = cls->id_table; entry->vid != 0; entry++) ++ { ++ const FpIdEntry *bl_entry; ++ char *key; ++ ++ for (bl_entry = blacklist_id_table; bl_entry->vid != 0; bl_entry++) ++ if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid) ++ break; ++ ++ if (bl_entry->vid != 0) ++ continue; ++ ++ key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); ++ ++ if (g_hash_table_lookup (printed, key) != NULL) ++ { ++ if (cls == &whitelist) ++ g_warning ("%s implemented by driver %s", ++ key, (const char *) g_hash_table_lookup (printed, key)); ++ g_free (key); ++ continue; ++ } ++ ++ g_hash_table_insert (printed, key, (void *) cls->id); ++ ++ if (num_printed == 0) ++ { ++ if (cls != &whitelist) ++ g_print ("\n# Supported by libfprint driver %s\n", cls->id); ++ else ++ g_print ("\n# Known unsupported devices\n"); ++ } ++ ++ g_print ("usb:v%04Xp%04X*\n", ++ entry->vid, entry->pid); ++ num_printed++; ++ } ++ ++ if (num_printed > 0) ++ g_print (" ID_AUTOSUSPEND=1\n"); ++} ++ ++int ++main (int argc, char **argv) ++{ ++ g_autoptr(GArray) drivers = fpi_get_driver_types (); ++ guint i; ++ ++ printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); ++ ++ for (i = 0; i < drivers->len; i++) ++ { ++ GType driver = g_array_index (drivers, GType, i); ++ g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver); ++ ++ if (cls->type != FP_DEVICE_TYPE_USB) ++ continue; ++ ++ print_driver (cls); ++ } ++ ++ print_driver (&whitelist); ++ ++ g_hash_table_destroy (printed); ++ ++ return 0; ++} +diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c +deleted file mode 100644 +index 050a450..0000000 +--- a/libfprint/fprint-list-udev-rules.c ++++ /dev/null +@@ -1,188 +0,0 @@ +-/* +- * Copyright (C) 2009 Red Hat +- * Copyright (C) 2008 Bastien Nocera +- * Copyright (C) 2008 Timo Hoenig , +- * Copyright (C) 2019 Benjamin Berg +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2.1 of the License, or (at your option) any later version. +- * +- * This library is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +- */ +- +-#include +- +-#include "fpi-context.h" +-#include "fpi-device.h" +- +-static const FpIdEntry whitelist_id_table[] = { +- /* Currently known and unsupported devices. +- * You can generate this list from the wiki page using e.g.: +- * gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p' +- */ +- { .vid = 0x04f3, .pid = 0x036b }, +- { .vid = 0x04f3, .pid = 0x0c00 }, +- { .vid = 0x04f3, .pid = 0x0c4b }, +- { .vid = 0x04f3, .pid = 0x0c4c }, +- { .vid = 0x04f3, .pid = 0x0c4f }, +- { .vid = 0x04f3, .pid = 0x0c57 }, +- { .vid = 0x04f3, .pid = 0x2706 }, +- { .vid = 0x06cb, .pid = 0x0081 }, +- { .vid = 0x06cb, .pid = 0x0088 }, +- { .vid = 0x06cb, .pid = 0x008a }, +- { .vid = 0x06cb, .pid = 0x009a }, +- { .vid = 0x06cb, .pid = 0x009b }, +- { .vid = 0x06cb, .pid = 0x00a2 }, +- { .vid = 0x06cb, .pid = 0x00b7 }, +- { .vid = 0x06cb, .pid = 0x00bb }, +- { .vid = 0x06cb, .pid = 0x00be }, +- { .vid = 0x06cb, .pid = 0x00cb }, +- { .vid = 0x06cb, .pid = 0x00d8 }, +- { .vid = 0x06cb, .pid = 0x00da }, +- { .vid = 0x0a5c, .pid = 0x5801 }, +- { .vid = 0x0a5c, .pid = 0x5805 }, +- { .vid = 0x0a5c, .pid = 0x5834 }, +- { .vid = 0x0a5c, .pid = 0x5843 }, +- { .vid = 0x10a5, .pid = 0x0007 }, +- { .vid = 0x1188, .pid = 0x9545 }, +- { .vid = 0x138a, .pid = 0x0007 }, +- { .vid = 0x138a, .pid = 0x003a }, +- { .vid = 0x138a, .pid = 0x003c }, +- { .vid = 0x138a, .pid = 0x003d }, +- { .vid = 0x138a, .pid = 0x003f }, +- { .vid = 0x138a, .pid = 0x0090 }, +- { .vid = 0x138a, .pid = 0x0091 }, +- { .vid = 0x138a, .pid = 0x0092 }, +- { .vid = 0x138a, .pid = 0x0094 }, +- { .vid = 0x138a, .pid = 0x0097 }, +- { .vid = 0x138a, .pid = 0x009d }, +- { .vid = 0x138a, .pid = 0x00ab }, +- { .vid = 0x147e, .pid = 0x1002 }, +- { .vid = 0x1491, .pid = 0x0088 }, +- { .vid = 0x16d1, .pid = 0x1027 }, +- { .vid = 0x1c7a, .pid = 0x0300 }, +- { .vid = 0x1c7a, .pid = 0x0570 }, +- { .vid = 0x1c7a, .pid = 0x0575 }, +- { .vid = 0x27c6, .pid = 0x5042 }, +- { .vid = 0x27c6, .pid = 0x5110 }, +- { .vid = 0x27c6, .pid = 0x5117 }, +- { .vid = 0x27c6, .pid = 0x5201 }, +- { .vid = 0x27c6, .pid = 0x521d }, +- { .vid = 0x27c6, .pid = 0x5301 }, +- { .vid = 0x27c6, .pid = 0x530c }, +- { .vid = 0x27c6, .pid = 0x532d }, +- { .vid = 0x27c6, .pid = 0x533c }, +- { .vid = 0x27c6, .pid = 0x5381 }, +- { .vid = 0x27c6, .pid = 0x5385 }, +- { .vid = 0x27c6, .pid = 0x538c }, +- { .vid = 0x27c6, .pid = 0x538d }, +- { .vid = 0x27c6, .pid = 0x5395 }, +- { .vid = 0x27c6, .pid = 0x5584 }, +- { .vid = 0x27c6, .pid = 0x55a2 }, +- { .vid = 0x27c6, .pid = 0x55a4 }, +- { .vid = 0x27c6, .pid = 0x55b4 }, +- { .vid = 0x27c6, .pid = 0x5740 }, +- { .vid = 0x2808, .pid = 0x9338 }, +- { .vid = 0x298d, .pid = 0x2033 }, +- { .vid = 0x3538, .pid = 0x0930 }, +- { .vid = 0 }, +-}; +- +-static const FpIdEntry blacklist_id_table[] = { +- { .vid = 0x0483, .pid = 0x2016 }, +- /* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */ +- { .vid = 0x045e, .pid = 0x00bb }, +- { .vid = 0 }, +-}; +- +-static const FpDeviceClass whitelist = { +- .type = FP_DEVICE_TYPE_USB, +- .id_table = whitelist_id_table, +- .id = "whitelist", +- .full_name = "Hardcoded whitelist" +-}; +- +-GHashTable *printed = NULL; +- +-static void +-print_driver (const FpDeviceClass *cls) +-{ +- const FpIdEntry *entry; +- gint num_printed = 0; +- +- if (cls->type != FP_DEVICE_TYPE_USB) +- return; +- +- for (entry = cls->id_table; entry->vid != 0; entry++) +- { +- const FpIdEntry *bl_entry; +- char *key; +- +- for (bl_entry = blacklist_id_table; bl_entry->vid != 0; bl_entry++) +- if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid) +- break; +- +- if (bl_entry->vid != 0) +- continue; +- +- key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); +- +- if (g_hash_table_lookup (printed, key) != NULL) +- { +- if (cls == &whitelist) +- g_warning ("%s implemented by driver %s", +- key, (const char *) g_hash_table_lookup (printed, key)); +- g_free (key); +- continue; +- } +- +- g_hash_table_insert (printed, key, (void *) cls->id); +- +- if (num_printed == 0) +- g_print ("# %s\n", cls->full_name); +- +- g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n", +- entry->vid, entry->pid); +- g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ENV{LIBFPRINT_DRIVER}=\"%s\"\n", +- entry->vid, entry->pid, cls->full_name); +- num_printed++; +- } +- +- if (num_printed > 0) +- g_print ("\n"); +-} +- +-int +-main (int argc, char **argv) +-{ +- g_autoptr(GArray) drivers = fpi_get_driver_types (); +- guint i; +- +- printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); +- +- for (i = 0; i < drivers->len; i++) +- { +- GType driver = g_array_index (drivers, GType, i); +- g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver); +- +- if (cls->type != FP_DEVICE_TYPE_USB) +- continue; +- +- print_driver (cls); +- } +- +- print_driver (&whitelist); +- +- g_hash_table_destroy (printed); +- +- return 0; +-} +diff --git a/libfprint/meson.build b/libfprint/meson.build +index 4d1d30c..e385ce8 100644 +--- a/libfprint/meson.build ++++ b/libfprint/meson.build +@@ -295,19 +295,19 @@ libfprint_private_dep = declare_dependency( + ] + ) + +-udev_rules = executable('fprint-list-udev-rules', +- 'fprint-list-udev-rules.c', ++udev_hwdb = executable('fprint-list-udev-hwdb', ++ 'fprint-list-udev-hwdb.c', + dependencies: libfprint_private_dep, + link_with: libfprint_drivers, + install: false) + + if get_option('udev_rules') + custom_target('udev-rules', +- output: '60-@0@-autosuspend.rules'.format(versioned_libname), ++ output: '60-autosuspend-@0@.hwdb'.format(versioned_libname), + capture: true, +- command: [ udev_rules ], ++ command: [ udev_hwdb ], + install: true, +- install_dir: udev_rules_dir) ++ install_dir: udev_hwdb_dir) + endif + + supported_devices = executable('fprint-list-supported-devices', +diff --git a/meson.build b/meson.build +index 483f1ec..ab4ac72 100644 +--- a/meson.build ++++ b/meson.build +@@ -194,11 +194,11 @@ drivers_type_func += '}' + root_inc = include_directories('.') + + if get_option('udev_rules') +- udev_rules_dir = get_option('udev_rules_dir') ++ udev_hwdb_dir = get_option('udev_hwdb_dir') + +- if udev_rules_dir == 'auto' ++ if udev_hwdb_dir == 'auto' + udev_dep = dependency('udev') +- udev_rules_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/rules.d' ++ udev_hwdb_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/hwdb.d' + endif + endif + +diff --git a/meson_options.txt b/meson_options.txt +index 746efdc..414695f 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -10,8 +10,8 @@ option('udev_rules', + description: 'Whether to create a udev rules file', + type: 'boolean', + value: true) +-option('udev_rules_dir', +- description: 'Installation path for udev rules', ++option('udev_hwdb_dir', ++ description: 'Installation path for udev hwdb', + type: 'string', + value: 'auto') + option('gtk-examples', +diff --git a/tests/meson.build b/tests/meson.build +index 27bdd9f..4ebf3b7 100644 +--- a/tests/meson.build ++++ b/tests/meson.build +@@ -170,8 +170,8 @@ foreach test_name: unit_tests + endforeach + + # Run udev rule generator with fatal warnings +-test('udev-rules', +- udev_rules, ++test('udev-hwdb', ++ udev_hwdb, + env: envs) + + gdb = find_program('gdb', required: false) diff --git a/debian/patches/build-Ensure-we-process-the-data-dir.patch b/debian/patches/build-Ensure-we-process-the-data-dir.patch new file mode 100644 index 00000000..49881b58 --- /dev/null +++ b/debian/patches/build-Ensure-we-process-the-data-dir.patch @@ -0,0 +1,21 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Thu, 21 Jan 2021 00:57:43 +0100 +Subject: build: Ensure we process the data dir + +Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/018641ad +--- + meson.build | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/meson.build b/meson.build +index 415f27e..9494ebb 100644 +--- a/meson.build ++++ b/meson.build +@@ -237,6 +237,7 @@ if get_option('gtk-examples') + subdir('demo') + endif + ++subdir('data') + subdir('tests') + + pkgconfig = import('pkgconfig') diff --git a/debian/patches/data-Keep-using-versioned-libname-for-hwdb-file.patch b/debian/patches/data-Keep-using-versioned-libname-for-hwdb-file.patch new file mode 100644 index 00000000..1130add3 --- /dev/null +++ b/debian/patches/data-Keep-using-versioned-libname-for-hwdb-file.patch @@ -0,0 +1,22 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Thu, 21 Jan 2021 01:17:02 +0100 +Subject: data: Keep using versioned libname for hwdb file + +Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/2f6adce2 +--- + data/meson.build | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/data/meson.build b/data/meson.build +index 975c1c3..99adf5d 100644 +--- a/data/meson.build ++++ b/data/meson.build +@@ -3,7 +3,7 @@ if get_option('udev_rules') + # ninja -C libfprint/sync-udev-hwdb + + install_data('autosuspend.hwdb', +- rename: '60-autosuspend-@0@.hwdb'.format(meson.project_name()), ++ rename: '60-autosuspend-@0@.hwdb'.format(versioned_libname), + install_dir: udev_hwdb_dir, + ) + endif diff --git a/debian/patches/data-Use-auto-generated-but-hardcoded-autosuspend-hwdb-fi.patch b/debian/patches/data-Use-auto-generated-but-hardcoded-autosuspend-hwdb-fi.patch new file mode 100644 index 00000000..843eb36a --- /dev/null +++ b/debian/patches/data-Use-auto-generated-but-hardcoded-autosuspend-hwdb-fi.patch @@ -0,0 +1,437 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Wed, 20 Jan 2021 20:02:05 +0100 +Subject: data: Use auto-generated but hardcoded autosuspend hwdb file + +This solves various problems: + 1. It stays the same also if some drivers have been disabled + 2. It uses a stable path for being imported by systemd + 3. It is still checked for its validity by tests + 4. It can be auto-generated using a simple command +--- + data/autosuspend.hwdb | 262 ++++++++++++++++++++++++++++++++++++++ + data/meson.build | 9 ++ + libfprint/fprint-list-udev-hwdb.c | 5 + + libfprint/meson.build | 24 ++-- + meson.build | 12 ++ + tests/meson.build | 5 +- + tests/test-generated-hwdb.sh | 24 ++++ + 7 files changed, 332 insertions(+), 9 deletions(-) + create mode 100644 data/autosuspend.hwdb + create mode 100644 data/meson.build + create mode 100755 tests/test-generated-hwdb.sh + +diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb +new file mode 100644 +index 0000000..f22d16a +--- /dev/null ++++ b/data/autosuspend.hwdb +@@ -0,0 +1,262 @@ ++# This file has been generated using fprint-list-udev-hwdb with all drivers enabled ++ ++# Supported by libfprint driver upektc_img ++usb:v147Ep2016* ++usb:v147Ep2020* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver vfs5011 ++usb:v138Ap0010* ++usb:v138Ap0011* ++usb:v138Ap0015* ++usb:v138Ap0017* ++usb:v138Ap0018* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver aes3500 ++usb:v08FFp5731* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver aes4000 ++usb:v5501p08FF* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver aes1610 ++usb:v08FFp1600* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver aes1660 ++usb:v08FFp1660* ++usb:v08FFp1680* ++usb:v08FFp1681* ++usb:v08FFp1682* ++usb:v08FFp1683* ++usb:v08FFp1684* ++usb:v08FFp1685* ++usb:v08FFp1686* ++usb:v08FFp1687* ++usb:v08FFp1688* ++usb:v08FFp1689* ++usb:v08FFp168A* ++usb:v08FFp168B* ++usb:v08FFp168C* ++usb:v08FFp168D* ++usb:v08FFp168E* ++usb:v08FFp168F* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver aes2660 ++usb:v08FFp2660* ++usb:v08FFp2680* ++usb:v08FFp2681* ++usb:v08FFp2682* ++usb:v08FFp2683* ++usb:v08FFp2684* ++usb:v08FFp2685* ++usb:v08FFp2686* ++usb:v08FFp2687* ++usb:v08FFp2688* ++usb:v08FFp2689* ++usb:v08FFp268A* ++usb:v08FFp268B* ++usb:v08FFp268C* ++usb:v08FFp268D* ++usb:v08FFp268E* ++usb:v08FFp268F* ++usb:v08FFp2691* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver aes2501 ++usb:v08FFp2500* ++usb:v08FFp2580* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver aes2550 ++usb:v08FFp2550* ++usb:v08FFp2810* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver vfs101 ++usb:v138Ap0001* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver vfs301 ++usb:v138Ap0005* ++usb:v138Ap0008* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver vfs0050 ++usb:v138Ap0050* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver etes603 ++usb:v1C7Ap0603* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver vcom5s ++usb:v061Ap0110* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver synaptics ++usb:v06CBp00BD* ++usb:v06CBp00E9* ++usb:v06CBp00DF* ++usb:v06CBp00F9* ++usb:v06CBp00FC* ++usb:v06CBp00C2* ++usb:v06CBp00C9* ++usb:v06CBp00E7* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver elan ++usb:v04F3p0903* ++usb:v04F3p0907* ++usb:v04F3p0C01* ++usb:v04F3p0C02* ++usb:v04F3p0C03* ++usb:v04F3p0C04* ++usb:v04F3p0C05* ++usb:v04F3p0C06* ++usb:v04F3p0C07* ++usb:v04F3p0C08* ++usb:v04F3p0C09* ++usb:v04F3p0C0A* ++usb:v04F3p0C0B* ++usb:v04F3p0C0C* ++usb:v04F3p0C0D* ++usb:v04F3p0C0E* ++usb:v04F3p0C0F* ++usb:v04F3p0C10* ++usb:v04F3p0C11* ++usb:v04F3p0C12* ++usb:v04F3p0C13* ++usb:v04F3p0C14* ++usb:v04F3p0C15* ++usb:v04F3p0C16* ++usb:v04F3p0C17* ++usb:v04F3p0C18* ++usb:v04F3p0C19* ++usb:v04F3p0C1A* ++usb:v04F3p0C1B* ++usb:v04F3p0C1C* ++usb:v04F3p0C1D* ++usb:v04F3p0C1E* ++usb:v04F3p0C1F* ++usb:v04F3p0C20* ++usb:v04F3p0C21* ++usb:v04F3p0C22* ++usb:v04F3p0C23* ++usb:v04F3p0C24* ++usb:v04F3p0C25* ++usb:v04F3p0C26* ++usb:v04F3p0C27* ++usb:v04F3p0C28* ++usb:v04F3p0C29* ++usb:v04F3p0C2A* ++usb:v04F3p0C2B* ++usb:v04F3p0C2C* ++usb:v04F3p0C2D* ++usb:v04F3p0C2E* ++usb:v04F3p0C2F* ++usb:v04F3p0C30* ++usb:v04F3p0C31* ++usb:v04F3p0C32* ++usb:v04F3p0C33* ++usb:v04F3p0C42* ++usb:v04F3p0C4D* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver uru4000 ++usb:v045Ep00BC* ++usb:v045Ep00BD* ++usb:v045Ep00CA* ++usb:v05BAp0007* ++usb:v05BAp0008* ++usb:v05BAp000A* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver upektc ++usb:v0483p2015* ++usb:v147Ep3001* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver upeksonly ++usb:v147Ep1000* ++usb:v147Ep1001* ++ ID_AUTOSUSPEND=1 ++ ++# Supported by libfprint driver goodixmoc ++usb:v27C6p5840* ++usb:v27C6p6496* ++usb:v27C6p60A2* ++usb:v27C6p63AC* ++usb:v27C6p639C* ++ ID_AUTOSUSPEND=1 ++ ++# Known unsupported devices ++usb:v04F3p036B* ++usb:v04F3p0C00* ++usb:v04F3p0C4B* ++usb:v04F3p0C4C* ++usb:v04F3p0C4F* ++usb:v04F3p0C57* ++usb:v04F3p2706* ++usb:v06CBp0081* ++usb:v06CBp0088* ++usb:v06CBp008A* ++usb:v06CBp009A* ++usb:v06CBp009B* ++usb:v06CBp00A2* ++usb:v06CBp00B7* ++usb:v06CBp00BB* ++usb:v06CBp00BE* ++usb:v06CBp00CB* ++usb:v06CBp00D8* ++usb:v06CBp00DA* ++usb:v0A5Cp5801* ++usb:v0A5Cp5805* ++usb:v0A5Cp5834* ++usb:v0A5Cp5843* ++usb:v10A5p0007* ++usb:v1188p9545* ++usb:v138Ap0007* ++usb:v138Ap003A* ++usb:v138Ap003C* ++usb:v138Ap003D* ++usb:v138Ap003F* ++usb:v138Ap0090* ++usb:v138Ap0091* ++usb:v138Ap0092* ++usb:v138Ap0094* ++usb:v138Ap0097* ++usb:v138Ap009D* ++usb:v138Ap00AB* ++usb:v147Ep1002* ++usb:v1491p0088* ++usb:v16D1p1027* ++usb:v1C7Ap0300* ++usb:v1C7Ap0570* ++usb:v1C7Ap0575* ++usb:v27C6p5042* ++usb:v27C6p5110* ++usb:v27C6p5117* ++usb:v27C6p5201* ++usb:v27C6p521D* ++usb:v27C6p5301* ++usb:v27C6p530C* ++usb:v27C6p532D* ++usb:v27C6p533C* ++usb:v27C6p5381* ++usb:v27C6p5385* ++usb:v27C6p538C* ++usb:v27C6p538D* ++usb:v27C6p5395* ++usb:v27C6p5584* ++usb:v27C6p55A2* ++usb:v27C6p55A4* ++usb:v27C6p55B4* ++usb:v27C6p5740* ++usb:v2808p9338* ++usb:v298Dp2033* ++usb:v3538p0930* ++ ID_AUTOSUSPEND=1 +diff --git a/data/meson.build b/data/meson.build +new file mode 100644 +index 0000000..975c1c3 +--- /dev/null ++++ b/data/meson.build +@@ -0,0 +1,9 @@ ++if get_option('udev_rules') ++ # This file has to be updated using ++ # ninja -C libfprint/sync-udev-hwdb ++ ++ install_data('autosuspend.hwdb', ++ rename: '60-autosuspend-@0@.hwdb'.format(meson.project_name()), ++ install_dir: udev_hwdb_dir, ++ ) ++endif +diff --git a/libfprint/fprint-list-udev-hwdb.c b/libfprint/fprint-list-udev-hwdb.c +index b687085..630be0f 100644 +--- a/libfprint/fprint-list-udev-hwdb.c ++++ b/libfprint/fprint-list-udev-hwdb.c +@@ -168,8 +168,13 @@ int + main (int argc, char **argv) + { + g_autoptr(GArray) drivers = fpi_get_driver_types (); ++ g_autofree char *program_name = NULL; + guint i; + ++ program_name = g_path_get_basename (argv[0]); ++ g_print ("# This file has been generated using %s with all drivers enabled\n", ++ program_name); ++ + printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + for (i = 0; i < drivers->len; i++) +diff --git a/libfprint/meson.build b/libfprint/meson.build +index abf2fb9..110c458 100644 +--- a/libfprint/meson.build ++++ b/libfprint/meson.build +@@ -301,16 +301,24 @@ udev_hwdb = executable('fprint-list-udev-hwdb', + link_with: libfprint_drivers, + install: false) + +-# We always build this file; primarily so that systemd can pull it +-# from the artefacts! +-custom_target('udev-rules', +- output: '60-autosuspend-@0@.hwdb'.format(meson.project_name()), ++udev_hwdb_generator = custom_target('udev-hwdb', ++ output: 'autosuspend.hwdb', ++ depend_files: drivers_sources, + capture: true, + command: [ udev_hwdb ], +- install: get_option('udev_rules'), +- install_dir: udev_hwdb_dir, +- build_by_default: true +- ) ++ install: false, ++) ++ ++custom_target('sync-udev-hwdb', ++ depends: udev_hwdb_generator, ++ output: 'sync-udev-hwdb', ++ install: false, ++ command: [ ++ 'cp', '-v', ++ udev_hwdb_generator.full_path(), ++ meson.source_root() / 'data' ++ ] ++) + + supported_devices = executable('fprint-list-supported-devices', + 'fprint-list-supported-devices.c', +diff --git a/meson.build b/meson.build +index db619d7..415f27e 100644 +--- a/meson.build ++++ b/meson.build +@@ -136,6 +136,18 @@ if drivers.length() == 0 or drivers[0] == '' + error('Cannot build libfprint without drivers, please specify a valid value for the drivers option') + endif + ++if drivers == all_drivers or drivers == default_drivers ++ default_drivers_are_enabled = true ++else ++ default_drivers_are_enabled = true ++ foreach driver: default_drivers ++ if driver not in drivers ++ default_drivers_are_enabled = false ++ break ++ endif ++ endforeach ++endif ++ + nss_dep = dependency('', required: false) + imaging_dep = dependency('', required: false) + libfprint_conf.set10('HAVE_PIXMAN', false) +diff --git a/tests/meson.build b/tests/meson.build +index 4ebf3b7..8e24980 100644 +--- a/tests/meson.build ++++ b/tests/meson.build +@@ -5,6 +5,7 @@ envs.set('G_MESSAGES_DEBUG', 'all') + + # Setup paths + envs.set('MESON_SOURCE_ROOT', meson.source_root()) ++envs.set('MESON_BUILD_ROOT', meson.build_root()) + envs.prepend('LD_LIBRARY_PATH', join_paths(meson.build_root(), 'libfprint')) + + # Set FP_DEVICE_EMULATION so that drivers can adapt (e.g. to use fixed +@@ -170,8 +171,10 @@ foreach test_name: unit_tests + endforeach + + # Run udev rule generator with fatal warnings ++envs.set('UDEV_HWDB', udev_hwdb.full_path()) ++envs.set('UDEV_HWDB_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0') + test('udev-hwdb', +- udev_hwdb, ++ find_program('test-generated-hwdb.sh'), + env: envs) + + gdb = find_program('gdb', required: false) +diff --git a/tests/test-generated-hwdb.sh b/tests/test-generated-hwdb.sh +new file mode 100755 +index 0000000..34209cb +--- /dev/null ++++ b/tests/test-generated-hwdb.sh +@@ -0,0 +1,24 @@ ++#!/usr/bin/env bash ++set -e ++ ++[ -x "$UDEV_HWDB" ] || exit 1 ++ ++if [ "$UDEV_HWDB_CHECK_CONTENTS" == 1 ]; then ++ generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint-XXXXXX.hwdb") ++else ++ generated_rules=/dev/null ++fi ++ ++$UDEV_HWDB > "$generated_rules" ++ ++if [ "$UDEV_HWDB_CHECK_CONTENTS" != 1 ]; then ++ exit 77 ++fi ++ ++if ! cmp "$MESON_SOURCE_ROOT/data/autosuspend.hwdb" "$generated_rules"; then ++ echo "E: Autosuspend file needs to be re-generated!" ++ echo " ninja -C $MESON_BUILD_ROOT libfprint/sync-udev-hwdb" ++ exit 1 ++fi ++ ++rm "$generated_rules" diff --git a/debian/patches/debian/Tweak-the-udev-rules-creator-for-Debian-usage.patch b/debian/patches/debian/Tweak-the-udev-rules-creator-for-Debian-usage.patch deleted file mode 100644 index 2bad0bd2..00000000 --- a/debian/patches/debian/Tweak-the-udev-rules-creator-for-Debian-usage.patch +++ /dev/null @@ -1,42 +0,0 @@ -From: Didier Raboud -Date: Wed, 2 Dec 2020 04:57:32 +0100 -Subject: Tweak the udev rules creator for Debian usage - -List all devices; automatic power/control only for the non-blacklisted -ones; mode and group to all. - -Author: Didier Raboud -Author: Sebastien Bacher -Origin: vendor -Last-Update: 2020-01-10 ---- - libfprint/fprint-list-udev-rules.c | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c -index d6c884c..3b6f572 100644 ---- a/libfprint/fprint-list-udev-rules.c -+++ b/libfprint/fprint-list-udev-rules.c -@@ -133,9 +133,6 @@ print_driver (const FpDeviceClass *cls) - if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid) - break; - -- if (bl_entry->vid != 0) -- continue; -- - key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); - - if (g_hash_table_lookup (printed, key) != NULL) -@@ -149,8 +146,10 @@ print_driver (const FpDeviceClass *cls) - if (num_printed == 0) - g_print ("# %s\n", cls->full_name); - -- g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n", -- entry->vid, entry->pid); -+ g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", ", entry->vid, entry->pid); -+ if (bl_entry->vid == 0) -+ g_print ("TEST==\"power/control\", ATTR{power/control}=\"auto\", "); -+ g_print ("MODE=\"0660\", GROUP=\"plugdev\"\n"); - g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ENV{LIBFPRINT_DRIVER}=\"%s\"\n", - entry->vid, entry->pid, cls->full_name); - num_printed++; diff --git a/debian/patches/debian/data-Use-auto-generated-but-hardcoded-autosuspend-rules-f.patch b/debian/patches/debian/data-Use-auto-generated-but-hardcoded-autosuspend-rules-f.patch deleted file mode 100644 index f2253220..00000000 --- a/debian/patches/debian/data-Use-auto-generated-but-hardcoded-autosuspend-rules-f.patch +++ /dev/null @@ -1,629 +0,0 @@ -From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Wed, 20 Jan 2021 20:02:05 +0100 -Subject: data: Use auto-generated but hardcoded autosuspend rules file - -This solves various problems: - 1. It stays the same also if some drivers have been disabled - 2. It is still checked for its validity by tests - 3. It can be auto-generated using a simple command - -Based on: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/533180a2 ---- - data/autosuspend.rules | 445 +++++++++++++++++++++++++++++++++++++ - data/meson.build | 9 + - libfprint/fprint-list-udev-rules.c | 5 + - libfprint/meson.build | 26 ++- - meson.build | 13 ++ - tests/meson.build | 5 +- - tests/test-generated-rules.sh | 24 ++ - 7 files changed, 518 insertions(+), 9 deletions(-) - create mode 100644 data/autosuspend.rules - create mode 100644 data/meson.build - create mode 100755 tests/test-generated-rules.sh - -diff --git a/data/autosuspend.rules b/data/autosuspend.rules -new file mode 100644 -index 0000000..c87d3d1 ---- /dev/null -+++ b/data/autosuspend.rules -@@ -0,0 +1,445 @@ -+# This file has been generated using fprint-list-udev-rules with all drivers enabled -+# Upek TouchChip Fingerprint Coprocessor -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2016", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2016", ENV{LIBFPRINT_DRIVER}="Upek TouchChip Fingerprint Coprocessor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2020", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2020", ENV{LIBFPRINT_DRIVER}="Upek TouchChip Fingerprint Coprocessor" -+ -+# Validity VFS5011 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0010", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0010", ENV{LIBFPRINT_DRIVER}="Validity VFS5011" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0011", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0011", ENV{LIBFPRINT_DRIVER}="Validity VFS5011" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0015", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0015", ENV{LIBFPRINT_DRIVER}="Validity VFS5011" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0017", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0017", ENV{LIBFPRINT_DRIVER}="Validity VFS5011" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0018", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0018", ENV{LIBFPRINT_DRIVER}="Validity VFS5011" -+ -+# AuthenTec AES3500 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="5731", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="5731", ENV{LIBFPRINT_DRIVER}="AuthenTec AES3500" -+ -+# AuthenTec AES4000 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="5501", ATTRS{idProduct}=="08ff", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="5501", ATTRS{idProduct}=="08ff", ENV{LIBFPRINT_DRIVER}="AuthenTec AES4000" -+ -+# AuthenTec AES1610 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1600", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1600", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1610" -+ -+# AuthenTec AES1660 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1660", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1660", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1680", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1680", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1681", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1681", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1682", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1682", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1683", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1683", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1684", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1684", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1685", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1685", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1686", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1686", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1687", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1687", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1688", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1688", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1689", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1689", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168a", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168b", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168c", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168d", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168e", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168f", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660" -+ -+# AuthenTec AES2660 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2660", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2660", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2680", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2680", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2681", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2681", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2682", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2682", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2683", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2683", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2684", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2684", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2685", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2685", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2686", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2686", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2687", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2687", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2688", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2688", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2689", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2689", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268a", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268b", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268c", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268d", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268e", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268f", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2691", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2691", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660" -+ -+# AuthenTec AES2501 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2500", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2500", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2501" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2580", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2580", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2501" -+ -+# AuthenTec AES2550/AES2810 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2550", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2550", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2550/AES2810" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2810", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2810", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2550/AES2810" -+ -+# Validity VFS101 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0001", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0001", ENV{LIBFPRINT_DRIVER}="Validity VFS101" -+ -+# Validity VFS301 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0005", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0005", ENV{LIBFPRINT_DRIVER}="Validity VFS301" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0008", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0008", ENV{LIBFPRINT_DRIVER}="Validity VFS301" -+ -+# Validity VFS0050 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0050", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0050", ENV{LIBFPRINT_DRIVER}="Validity VFS0050" -+ -+# EgisTec ES603 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0603", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0603", ENV{LIBFPRINT_DRIVER}="EgisTec ES603" -+ -+# Veridicom 5thSense -+SUBSYSTEM=="usb", ATTRS{idVendor}=="061a", ATTRS{idProduct}=="0110", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="061a", ATTRS{idProduct}=="0110", ENV{LIBFPRINT_DRIVER}="Veridicom 5thSense" -+ -+# Synaptics Sensors -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bd", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bd", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e9", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e9", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00df", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00df", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00f9", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00f9", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00fc", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00fc", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c2", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c9", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c9", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e7", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e7", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors" -+ -+# ElanTech Fingerprint Sensor -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0903", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0903", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0907", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0907", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c01", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c01", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c02", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c02", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c03", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c03", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c04", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c04", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c05", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c05", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c06", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c06", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c07", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c07", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c08", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c08", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c09", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c09", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0a", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0b", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0c", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0e", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0f", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c10", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c10", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c11", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c11", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c12", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c12", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c13", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c13", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c14", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c14", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c15", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c15", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c16", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c16", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c17", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c17", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c18", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c18", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c19", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c19", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1a", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1b", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1c", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1e", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1f", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c20", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c20", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c21", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c21", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c22", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c22", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c23", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c23", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c24", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c24", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c25", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c25", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c26", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c26", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c27", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c27", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c28", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c28", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c29", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c29", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2a", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2b", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2c", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2e", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2f", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c30", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c30", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c31", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c31", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c32", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c32", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c33", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c33", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c42", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c42", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor" -+ -+# Digital Persona U.are.U 4000/4000B/4500 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bb", ATTRS{dev}=="*", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bb", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bc", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bc", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bd", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bd", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00ca", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00ca", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0007", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0007", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0008", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0008", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="000a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="000a", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500" -+ -+# UPEK TouchChip/Eikon Touch 300 -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2015", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2015", ENV{LIBFPRINT_DRIVER}="UPEK TouchChip/Eikon Touch 300" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="3001", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="3001", ENV{LIBFPRINT_DRIVER}="UPEK TouchChip/Eikon Touch 300" -+ -+# UPEK TouchStrip Sensor-Only -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1000", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1000", ENV{LIBFPRINT_DRIVER}="UPEK TouchStrip Sensor-Only" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1001", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1001", ENV{LIBFPRINT_DRIVER}="UPEK TouchStrip Sensor-Only" -+ -+# UPEK TouchStrip -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2016", ATTRS{dev}=="*", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2016", ENV{LIBFPRINT_DRIVER}="UPEK TouchStrip" -+ -+# Goodix MOC Fingerprint Sensor -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5840", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5840", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="6496", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="6496", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="60a2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="60a2", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="63ac", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="63ac", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="639c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="639c", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor" -+ -+# Hardcoded whitelist -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="036b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="036b", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c00", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c00", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4b", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4f", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c57", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c57", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2706", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2706", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0081", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0081", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0088", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0088", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="008a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="008a", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009a", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009b", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00a2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00a2", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00b7", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00b7", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bb", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bb", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00be", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00be", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00cb", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00cb", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00d8", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00d8", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00da", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00da", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5801", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5801", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5805", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5805", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5834", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5834", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5843", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5843", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="10a5", ATTRS{idProduct}=="0007", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="10a5", ATTRS{idProduct}=="0007", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1188", ATTRS{idProduct}=="9545", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1188", ATTRS{idProduct}=="9545", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0007", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0007", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003a", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003f", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0090", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0090", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0091", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0091", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0092", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0092", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0094", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0094", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0097", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0097", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="009d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="009d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="00ab", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="00ab", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1002", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1002", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1491", ATTRS{idProduct}=="0088", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1491", ATTRS{idProduct}=="0088", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="16d1", ATTRS{idProduct}=="1027", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="16d1", ATTRS{idProduct}=="1027", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0300", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0300", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0570", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0570", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0575", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0575", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5042", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5042", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5110", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5110", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5117", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5117", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5201", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5201", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="521d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="521d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5301", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5301", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="530c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="530c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="532d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="532d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="533c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="533c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5381", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5381", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5385", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5385", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5395", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5395", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5584", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5584", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a2", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a4", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a4", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55b4", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55b4", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5740", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5740", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="2808", ATTRS{idProduct}=="9338", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="2808", ATTRS{idProduct}=="9338", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="298d", ATTRS{idProduct}=="2033", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="298d", ATTRS{idProduct}=="2033", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="3538", ATTRS{idProduct}=="0930", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev" -+SUBSYSTEM=="usb", ATTRS{idVendor}=="3538", ATTRS{idProduct}=="0930", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist" -+ -diff --git a/data/meson.build b/data/meson.build -new file mode 100644 -index 0000000..8f79716 ---- /dev/null -+++ b/data/meson.build -@@ -0,0 +1,9 @@ -+if get_option('udev_rules') -+ # This file has to be updated using -+ # ninja -C libfprint/sync-udev-rules -+ -+ install_data('autosuspend.rules', -+ rename: '60-@0@-autosuspend.rules'.format(versioned_libname), -+ install_dir: udev_rules_dir, -+ ) -+endif -diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c -index cba2b2f..3cda912 100644 ---- a/libfprint/fprint-list-udev-rules.c -+++ b/libfprint/fprint-list-udev-rules.c -@@ -164,8 +164,13 @@ int - main (int argc, char **argv) - { - g_autoptr(GArray) drivers = fpi_get_driver_types (); -+ g_autofree char *program_name = NULL; - guint i; - -+ program_name = g_path_get_basename (argv[0]); -+ g_print ("# This file has been generated using %s with all drivers enabled\n", -+ program_name); -+ - printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - - for (i = 0; i < drivers->len; i++) -diff --git a/libfprint/meson.build b/libfprint/meson.build -index 4d1d30c..671a1e5 100644 ---- a/libfprint/meson.build -+++ b/libfprint/meson.build -@@ -301,14 +301,24 @@ udev_rules = executable('fprint-list-udev-rules', - link_with: libfprint_drivers, - install: false) - --if get_option('udev_rules') -- custom_target('udev-rules', -- output: '60-@0@-autosuspend.rules'.format(versioned_libname), -- capture: true, -- command: [ udev_rules ], -- install: true, -- install_dir: udev_rules_dir) --endif -+udev_rules_generator = custom_target('udev-rules', -+ output: 'autosuspend.rules', -+ depend_files: drivers_sources, -+ capture: true, -+ command: [ udev_rules ], -+ install: false, -+) -+ -+custom_target('sync-udev-rules', -+ depends: udev_rules_generator, -+ output: 'sync-udev-rules', -+ install: false, -+ command: [ -+ 'cp', '-v', -+ udev_rules_generator.full_path(), -+ meson.source_root() / 'data' -+ ] -+) - - supported_devices = executable('fprint-list-supported-devices', - 'fprint-list-supported-devices.c', -diff --git a/meson.build b/meson.build -index 483f1ec..4c73c00 100644 ---- a/meson.build -+++ b/meson.build -@@ -136,6 +136,18 @@ if drivers.length() == 0 or drivers[0] == '' - error('Cannot build libfprint without drivers, please specify a valid value for the drivers option') - endif - -+if drivers == all_drivers or drivers == default_drivers -+ default_drivers_are_enabled = true -+else -+ default_drivers_are_enabled = true -+ foreach driver: default_drivers -+ if driver not in drivers -+ default_drivers_are_enabled = false -+ break -+ endif -+ endforeach -+endif -+ - nss_dep = dependency('', required: false) - imaging_dep = dependency('', required: false) - libfprint_conf.set10('HAVE_PIXMAN', false) -@@ -223,6 +235,7 @@ if get_option('gtk-examples') - subdir('demo') - endif - -+subdir('data') - subdir('tests') - - pkgconfig = import('pkgconfig') -diff --git a/tests/meson.build b/tests/meson.build -index 27bdd9f..efcb1cb 100644 ---- a/tests/meson.build -+++ b/tests/meson.build -@@ -5,6 +5,7 @@ envs.set('G_MESSAGES_DEBUG', 'all') - - # Setup paths - envs.set('MESON_SOURCE_ROOT', meson.source_root()) -+envs.set('MESON_BUILD_ROOT', meson.build_root()) - envs.prepend('LD_LIBRARY_PATH', join_paths(meson.build_root(), 'libfprint')) - - # Set FP_DEVICE_EMULATION so that drivers can adapt (e.g. to use fixed -@@ -170,8 +171,10 @@ foreach test_name: unit_tests - endforeach - - # Run udev rule generator with fatal warnings -+envs.set('UDEV_RULES', udev_rules.full_path()) -+envs.set('UDEV_RULES_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0') - test('udev-rules', -- udev_rules, -+ find_program('test-generated-rules.sh'), - env: envs) - - gdb = find_program('gdb', required: false) -diff --git a/tests/test-generated-rules.sh b/tests/test-generated-rules.sh -new file mode 100755 -index 0000000..5ba913b ---- /dev/null -+++ b/tests/test-generated-rules.sh -@@ -0,0 +1,24 @@ -+#!/usr/bin/env bash -+set -e -+ -+[ -x "$UDEV_RULES" ] || exit 1 -+ -+if [ "$UDEV_RULES_CHECK_CONTENTS" == 1 ]; then -+ generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint-XXXXXX.rules") -+else -+ generated_rules=/dev/null -+fi -+ -+$UDEV_RULES > "$generated_rules" -+ -+if [ "$UDEV_RULES_CHECK_CONTENTS" != 1 ]; then -+ exit 77 -+fi -+ -+if ! cmp "$MESON_SOURCE_ROOT/data/autosuspend.rules" "$generated_rules"; then -+ echo "E: Autosuspend file needs to be re-generated!" -+ echo " ninja -C $MESON_BUILD_ROOT libfprint/sync-udev-rules" -+ exit 1 -+fi -+ -+rm "$generated_rules" diff --git a/debian/patches/meson-Always-build-hwdb-file.patch b/debian/patches/meson-Always-build-hwdb-file.patch new file mode 100644 index 00000000..5ec534be --- /dev/null +++ b/debian/patches/meson-Always-build-hwdb-file.patch @@ -0,0 +1,59 @@ +From: Benjamin Berg +Date: Tue, 19 Jan 2021 14:19:10 +0100 +Subject: meson: Always build hwdb file + +We want systemd to pull our hwdb. In order to ease this, always build +the hwdb file, even if it is disabled. + +Once systemd has merged the rules, downstream should turn off the rules +in libfprint. The default in libfprint will also be changed to not build +the hwdb (udev_rules option) eventually. + +Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/cbce56c1 +--- + libfprint/meson.build | 18 ++++++++++-------- + meson.build | 2 ++ + 2 files changed, 12 insertions(+), 8 deletions(-) + +diff --git a/libfprint/meson.build b/libfprint/meson.build +index e385ce8..3464bf3 100644 +--- a/libfprint/meson.build ++++ b/libfprint/meson.build +@@ -301,14 +301,16 @@ udev_hwdb = executable('fprint-list-udev-hwdb', + link_with: libfprint_drivers, + install: false) + +-if get_option('udev_rules') +- custom_target('udev-rules', +- output: '60-autosuspend-@0@.hwdb'.format(versioned_libname), +- capture: true, +- command: [ udev_hwdb ], +- install: true, +- install_dir: udev_hwdb_dir) +-endif ++# We always build this file; primarily so that systemd can pull it ++# from the artefacts! ++custom_target('udev-rules', ++ output: '60-autosuspend-@0@.hwdb'.format(versioned_libname), ++ capture: true, ++ command: [ udev_hwdb ], ++ install: get_option('udev_rules'), ++ install_dir: udev_hwdb_dir, ++ build_by_default: true ++ ) + + supported_devices = executable('fprint-list-supported-devices', + 'fprint-list-supported-devices.c', +diff --git a/meson.build b/meson.build +index ab4ac72..db619d7 100644 +--- a/meson.build ++++ b/meson.build +@@ -200,6 +200,8 @@ if get_option('udev_rules') + udev_dep = dependency('udev') + udev_hwdb_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/hwdb.d' + endif ++else ++ udev_hwdb_dir = false + endif + + if get_option('gtk-examples') diff --git a/debian/patches/series b/debian/patches/series index 405d84bf..669af8c3 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,9 +1,13 @@ -debian/Tweak-the-udev-rules-creator-for-Debian-usage.patch meson-Do-not-support-drivers-known-to-fail-in-Big-Endian-.patch udev-rules-Print-warning-if-an-ID-is-supported.patch udev-rules-Remove-supported-synaptics-devices.patch tests-Add-check-that-no-supported-device-is-whitelisted.patch udev-hwdb-Prevent-devices-from-being-listed-twice.patch +Generate-a-hwdb-instead-of-udev-rules.patch +meson-Always-build-hwdb-file.patch +Drop-version-from-libfprint-hwdb.patch +data-Use-auto-generated-but-hardcoded-autosuspend-hwdb-fi.patch +build-Ensure-we-process-the-data-dir.patch +data-Keep-using-versioned-libname-for-hwdb-file.patch tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch build-Skip-the-hwdb-test-if-not-all-drivers-are-really-en.patch -debian/data-Use-auto-generated-but-hardcoded-autosuspend-rules-f.patch diff --git a/debian/patches/tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch b/debian/patches/tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch index d377f0f7..7ca6f408 100644 --- a/debian/patches/tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch +++ b/debian/patches/tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch @@ -6,8 +6,6 @@ libusb 1.0.24 now expects busnum/devnum to be \n terminated. Update the device descriptions accordingly. https://github.com/martinpitt/umockdev/issues/115 - -Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/merge_requests/240 --- tests/aes3500/device | 16 ++++++++-------- tests/elan/device | 12 ++++++------ diff --git a/debian/patches/udev-hwdb-Prevent-devices-from-being-listed-twice.patch b/debian/patches/udev-hwdb-Prevent-devices-from-being-listed-twice.patch index 2e6730d1..f6385d02 100644 --- a/debian/patches/udev-hwdb-Prevent-devices-from-being-listed-twice.patch +++ b/debian/patches/udev-hwdb-Prevent-devices-from-being-listed-twice.patch @@ -11,10 +11,10 @@ is listed by two independent drivers. 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c -index af289da..cba2b2f 100644 +index e574cac..050a450 100644 --- a/libfprint/fprint-list-udev-rules.c +++ b/libfprint/fprint-list-udev-rules.c -@@ -133,10 +133,11 @@ print_driver (const FpDeviceClass *cls) +@@ -136,10 +136,11 @@ print_driver (const FpDeviceClass *cls) key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); diff --git a/debian/patches/udev-rules-Print-warning-if-an-ID-is-supported.patch b/debian/patches/udev-rules-Print-warning-if-an-ID-is-supported.patch index 7e5c2133..c810b309 100644 --- a/debian/patches/udev-rules-Print-warning-if-an-ID-is-supported.patch +++ b/debian/patches/udev-rules-Print-warning-if-an-ID-is-supported.patch @@ -7,7 +7,7 @@ Subject: udev-rules: Print warning if an ID is supported 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c -index 3b6f572..57aa5e6 100644 +index d6c884c..5f80fe1 100644 --- a/libfprint/fprint-list-udev-rules.c +++ b/libfprint/fprint-list-udev-rules.c @@ -110,6 +110,7 @@ static const FpIdEntry blacklist_id_table[] = { @@ -18,7 +18,7 @@ index 3b6f572..57aa5e6 100644 .full_name = "Hardcoded whitelist" }; -@@ -135,13 +136,15 @@ print_driver (const FpDeviceClass *cls) +@@ -138,13 +139,15 @@ print_driver (const FpDeviceClass *cls) key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); diff --git a/debian/patches/udev-rules-Remove-supported-synaptics-devices.patch b/debian/patches/udev-rules-Remove-supported-synaptics-devices.patch index f602aee1..d1b6d13d 100644 --- a/debian/patches/udev-rules-Remove-supported-synaptics-devices.patch +++ b/debian/patches/udev-rules-Remove-supported-synaptics-devices.patch @@ -7,7 +7,7 @@ Subject: udev-rules: Remove supported synaptics devices 1 file changed, 3 deletions(-) diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c -index 57aa5e6..af289da 100644 +index 5f80fe1..e574cac 100644 --- a/libfprint/fprint-list-udev-rules.c +++ b/libfprint/fprint-list-udev-rules.c @@ -45,12 +45,9 @@ static const FpIdEntry whitelist_id_table[] = {