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[] = {