From 4f76dbc18fbd6d19ddd3c03124385f8625e98498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Mon, 22 Feb 2021 20:23:58 +0100 Subject: [PATCH] Merge tag 'debian/1%1.90.7-3' into ubuntu libfprint Debian release 1:1.90.7-3 --- NEWS | 10 + debian/README.source | 23 +- debian/changelog | 157 ++++++ debian/gbp-post-import-hook.sh | 8 + debian/gbp.conf | 3 +- debian/libfprint-2-2.install | 2 +- debian/libfprint-2-2.postinst | 81 ++- debian/libfprint-2-2.postinst.in | 17 + .../Drop-version-from-libfprint-hwdb.patch | 178 +++++++ ...enerate-a-hwdb-instead-of-udev-rules.patch | 491 ++++++++++++++++++ ...build-Ensure-we-process-the-data-dir.patch | 21 + ...y-mark-libfprint-as-a-shared-library.patch | 27 + ...est-if-not-all-drivers-are-really-en.patch | 24 + ...sing-versioned-libname-for-hwdb-file.patch | 22 + ...ed-but-hardcoded-autosuspend-hwdb-fi.patch | 437 ++++++++++++++++ .../meson-Always-build-hwdb-file.patch | 59 +++ debian/patches/series | 14 +- ...t-no-supported-device-is-whitelisted.patch | 24 + ...wline-to-busname-devname-sysfs-attri.patch | 256 +++++++++ ...vent-devices-from-being-listed-twice.patch | 31 ++ ...-Print-warning-if-an-ID-is-supported.patch | 38 ++ ...s-Remove-supported-synaptics-devices.patch | 25 + debian/rules | 13 +- debian/update-udev-triggers.sh | 32 ++ libfprint/drivers/goodixmoc/goodix.c | 34 +- libfprint/drivers/goodixmoc/goodix_proto.c | 8 +- libfprint/drivers/goodixmoc/goodix_proto.h | 8 +- libfprint/drivers/synaptics/synaptics.c | 281 ++++++---- libfprint/drivers/synaptics/synaptics.h | 1 + libfprint/drivers/vfs5011.c | 4 +- libfprint/fp-device.c | 2 +- libfprint/fpi-device.c | 2 +- libfprint/fpi-ssm.c | 2 +- meson.build | 2 +- tests/README.md | 7 +- tests/goodixmoc/custom.py | 5 + tests/synaptics/custom.ioctl | 72 +-- tests/test-fp-context.c | 2 +- 38 files changed, 2241 insertions(+), 182 deletions(-) create mode 100755 debian/gbp-post-import-hook.sh create mode 100644 debian/libfprint-2-2.postinst.in create mode 100644 debian/patches/Drop-version-from-libfprint-hwdb.patch create mode 100644 debian/patches/Generate-a-hwdb-instead-of-udev-rules.patch create mode 100644 debian/patches/build-Ensure-we-process-the-data-dir.patch create mode 100644 debian/patches/build-Explicitly-mark-libfprint-as-a-shared-library.patch create mode 100644 debian/patches/build-Skip-the-hwdb-test-if-not-all-drivers-are-really-en.patch create mode 100644 debian/patches/data-Keep-using-versioned-libname-for-hwdb-file.patch create mode 100644 debian/patches/data-Use-auto-generated-but-hardcoded-autosuspend-hwdb-fi.patch create mode 100644 debian/patches/meson-Always-build-hwdb-file.patch create mode 100644 debian/patches/tests-Add-check-that-no-supported-device-is-whitelisted.patch create mode 100644 debian/patches/tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch create mode 100644 debian/patches/udev-hwdb-Prevent-devices-from-being-listed-twice.patch create mode 100644 debian/patches/udev-rules-Print-warning-if-an-ID-is-supported.patch create mode 100644 debian/patches/udev-rules-Remove-supported-synaptics-devices.patch create mode 100755 debian/update-udev-triggers.sh diff --git a/NEWS b/NEWS index 335986ed..c7a9c70b 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,16 @@ This file lists notable changes in each release. For the full history of all changes, see ChangeLog. +2020-12-01: v1.90.7 release + +Highlights: + * vfs5011: Fix possible use-after-free + * goodixmoc: Add two new PIDs (0x63AC, 0x639C) + * goodixmoc: Support finger status API + * synaptics: Only identify within provided prints + * synaptics: Reject devices with old firmware during probe (#239) + + 2020-12-01: v1.90.6 release This release is primarily a bugfix release for some older issues. diff --git a/debian/README.source b/debian/README.source index 4f4c2670..1a73d019 100644 --- a/debian/README.source +++ b/debian/README.source @@ -1,19 +1,10 @@ -The libfprint0 postinst script calls udevadmin trigger for all the supported -USB readers. The list of readers used in that file is generated by calling the -following awk script: +The libfprint-2-2 postinst script calls udevadmin trigger for all the supported +USB readers. The list of readers used in that file is generated using the gbp +import hook when `gbp import-orig` (via --uscan or with a tarball) is used. - /plugdev/ { - printf ("\tudevadm trigger --action=add " ) - for (i=1;i<=NF; i++){ - if (match($i,/idVendor/)>0) { - match($i, /"[^"]*"/); printf ("--attr-match=idVendor=%s ",substr($i,RSTART+1,RLENGTH-2)) - } - if (match($i,/idProduct/)>0) { - match($i, /"[^"]*"/); printf ("--attr-match=idProduct=%s",substr($i,RSTART+1,RLENGTH-2)) - } - }; - printf("\n") - } +Alternatively it can be called manually by using: + + GBP_SOURCES_DIR=. debian/update-udev-triggers.sh When preparing a new upstream release, this script should be called against the -udev .rules file generated during the build of the package +upstream provided .hwdb file. diff --git a/debian/changelog b/debian/changelog index 30922590..589e80e2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,55 @@ +libfprint (1:1.90.7-3) experimental; urgency=medium + + * gbp.conf: Prepare for experimental branching + * debian/patches: + - Use hwdb to store device autosuspend rules and drop debian specifics. + Upstream will use an hwdb to store the device autosuspend (that will be + included in systemd also, so libfprint packagin may stop shipping it at + later point), so use it earlier. + Drop the debian specific rules to set the devices part of the `plugdev` + group as such devices should not be ever readable by an user, but the + access should be managed through a libfprint-based service (frpintd at + the date). + - Explicitly mark libfprint as a shared library + * libfprint-2-2.install: Install hwdb file + * debian/rules: + - Do not autorename upstream rules file anymore. + It's not there, while there's no point to rename the hwdb one. + - Manually set udev hwdb directory (was rules dir before) + - Don't remove the meson generated private values from pc file. + This is now generated correctly by upstream, so no need to drop anything + from it. + * debian: Generate postinst devices list automatically at gbp import phase. + Alternatively provide a script to keep the post-inst script updated + * debian/libfprint-2-2.postinst: Upgrade as per upstream hwdb. + Blacklisted devices can be now removed from the trigger list as we don't + add them to plugdev anymore. + + -- Marco Trevisan (Treviño) Thu, 21 Jan 2021 19:53:12 +0100 + +libfprint (1:1.90.7-2) unstable; urgency=medium + + * debian/patches: Skip udev rules tests when not all drivers are compiled + * debian/libfprint-2-2.postinst: Regenerate the udev list based on new IDs + + -- Marco Trevisan (Treviño) Thu, 21 Jan 2021 17:10:57 +0100 + +libfprint (1:1.90.7-1) unstable; urgency=medium + + * New upstream release: + - vfs5011: Fix possible use-after-free + - goodixmoc: Add two new PIDs (0x63AC, 0x639C) + - goodixmoc: Support finger status API + - synaptics: Only identify within provided prints + - synaptics: Reject devices with old firmware during probe (#239) + * debian/patches: + - Refresh, dropping merged + - Include upstream udev fixes and use hardcoded rules + - Ensure that umockdev tests will pass with libusb 1.0.24 + (Closes: #977848, #978256) + + -- Marco Trevisan (Treviño) Thu, 21 Jan 2021 13:38:59 +0100 + libfprint (1:1.90.6+tod1-0ubuntu2) hirsute; urgency=medium * d/p/meson-Do-not-support-drivers-known-to-fail-in-Big-Endian-.patch: @@ -22,6 +74,43 @@ libfprint (1:1.90.6+tod1-0ubuntu1) hirsute; urgency=medium -- Marco Trevisan (Treviño) Thu, 10 Dec 2020 17:26:27 +0100 +libfprint (1:1.90.6-2) unstable; urgency=medium + + * d/p/meson-Do-not-support-drivers-known-to-fail-in-Big-Endian-.patch: + - Do not enable drivers that are not supported by big endian archs + Upstream patch to only build drivers everywhere but not include them + in the supported list or test them + + -- Marco Trevisan (Treviño) Thu, 10 Dec 2020 21:32:49 +0100 + +libfprint (1:1.90.6-1) unstable; urgency=medium + + * New upstream release: + - fp_print_deserialize will now correctly return a sunken reference + - Object reference management fixes for FpPrint and identify + - Fixed issues that caused problem on non-x86 machines (#236) + - Fix building with older GLib versions + - synaptics: Support PID 00e7 + - goodix: Fix issue with long USB packages + * debian/control: + - Remove Didier Raboud from uploaders (as he requested via bigon). + - Mark libfprint-2-doc as Multi-Arch: foreign + * debian/rules: + - Ignore tests failures in s390x as it now builds and tests correctly + - Increase testing timeout. + * debian/{control,rules,*.install}: + - Switch to debhelper 13 and use its features. + As per this restrict more the .install files wilcards + * debian/gbp.conf: Include suggested settings by GNOME team. + - Even if libfprint is not part of GNOME I think these settings are good + practice anyways. + * debian/patches: + - Refresh + - Add upstream patch to avoid nbis library warnings. + These have been checked to be harmless upstream + + -- Marco Trevisan (Treviño) Thu, 10 Dec 2020 15:58:37 +0100 + libfprint (1:1.90.5+tod1-0ubuntu1) hirsute; urgency=medium * New upstream release: @@ -56,6 +145,54 @@ libfprint (1:1.90.5+tod1-0ubuntu1) hirsute; urgency=medium -- Marco Trevisan (Treviño) Fri, 04 Dec 2020 03:57:04 +0100 +libfprint (1:1.90.5-2) unstable; urgency=medium + + * d/p/fpi-device-Return-proper-type-on-identification-success.patch, + d/p/test-fpi-device-Always-check-the-return-values-for-the-AP.patch: + - Properly handle identify return value and add tests. + This fixes fprintd test failures in s390x + * d/p/fp-print-Don-t-byte-swap-two-times-the-NBIS-array-content.patch: + - Fixes virtual-image test in libfprint for s390x + * debian/control: Add myself to Uploaders + + -- Marco Trevisan (Treviño) Wed, 02 Dec 2020 17:53:32 +0100 + +libfprint (1:1.90.5-1) unstable; urgency=medium + + * New upstream release: + - Remove USB hub from udev autosupend rules + - synaptics: Add PID 0x00c9 which is used in some HP laptops + * debian/patches: Use gbp pq topics for debian-specific patches + + -- Marco Trevisan (Treviño) Wed, 02 Dec 2020 05:11:33 +0100 + +libfprint (1:1.90.4-1) unstable; urgency=medium + + * Team upload. + [ Marco Trevisan (Treviño) ] + * New upstream release: + - Work around GUsb cancellation issue + - Redefine internal image device state machine for more robustness + - Add public finger-status reporting to FpDevice + - Rework device removal API to be convenient + - Enable powersave for unsupported USB devices (LP: #1905603) + - Improvements to examples + - synaptics: Support identify operation (LP: #1905600) + - synaptics: Fix possible crash when the interrupt transfer is resubmitted + - synaptics: Add support for PIDs 0x00f9, 0x00fc and 0x00c2 + - elan: Add PID 0x0c4d to supported device list + - aes3k: Fix driver and add CI test (LP: #1897613) + - uru4000: Fix reference counting of image transfer + - vfs301: Fix driver and add CI test (LP: #1905597, Closes: #951648) + * debian/libfprint-2-2.symbols: Add new symbols + * debian/rules: Also build the virtual drivers, as they're useful for + testing libfprint and fprintd + + [ Laurent Bigonville ] + * debian/control: Bump Standards-Version to 4.5.1 (no further changes) + + -- Laurent Bigonville Tue, 01 Dec 2020 11:36:08 +0100 + libfprint (1:1.90.3+tod1-0ubuntu3) hirsute; urgency=medium * debian/patches: @@ -92,6 +229,25 @@ libfprint (1:1.90.3+tod1-0ubuntu1) groovy; urgency=medium -- Marco Trevisan (Treviño) Thu, 24 Sep 2020 06:14:30 +0200 +libfprint (1:1.90.3-1) unstable; urgency=medium + + * Team upload. + [ Marco Trevisan (Treviño) ] + * New upstream release + - Fixed crash in VFS0050 (LP: #1876502) + - Enrollment fails with UPEK reader (LP: #1881380) + - Lots of various drivers fixes + - As per a patch for nbis required for some sensors that was accidentally + dropped in an earlier release. Users of sensors/drivers aes1610, aes2501, + aes2550, aes1660, aes2660, elan, upektc_img) need to re-enroll + * d/p/git_reading_pointer.patch: + - Dopped (applied upstream) + + [ Laurent Bigonville ] + * New upstream release + + -- Laurent Bigonville Sun, 15 Nov 2020 16:05:30 +0100 + libfprint (1:1.90.2+tod1-0ubuntu1) groovy; urgency=medium * New upstream release @@ -149,6 +305,7 @@ libfprint (1:1.90.1+tod1-0ubuntu1) focal; urgency=medium libfprint (1:1.90.1-2) experimental; urgency=medium + * Team upload. [ Laurent Bigonville ] * debian/control: Add libcairo-dev and python3 to build-dependencies as they are explicitly required for some tests diff --git a/debian/gbp-post-import-hook.sh b/debian/gbp-post-import-hook.sh new file mode 100755 index 00000000..3d6d1dcb --- /dev/null +++ b/debian/gbp-post-import-hook.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -e + +dch -v"$GBP_DEBIAN_VERSION" "New upstream release" +git add debian/changelog +debcommit + +debian/update-udev-triggers.sh diff --git a/debian/gbp.conf b/debian/gbp.conf index 70f12358..d029456a 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -12,7 +12,8 @@ sign-tags = True multimaint-merge = True [import-orig] -postimport = dch -v%(version)s New upstream release; git add debian/changelog; debcommit +postimport = debian/gbp-post-import-hook.sh [pq] patch-numbers = False + diff --git a/debian/libfprint-2-2.install b/debian/libfprint-2-2.install index ff020efe..963fa898 100644 --- a/debian/libfprint-2-2.install +++ b/debian/libfprint-2-2.install @@ -1,2 +1,2 @@ -lib/udev/rules.d/ +lib/udev/hwdb.d/ usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9].so.* diff --git a/debian/libfprint-2-2.postinst b/debian/libfprint-2-2.postinst index ec1bf4b4..7ec3d5aa 100644 --- a/debian/libfprint-2-2.postinst +++ b/debian/libfprint-2-2.postinst @@ -5,10 +5,12 @@ set -e #DEBHELPER# if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2>&1; then - # apply udev rules at package installation, see + # apply hwdb rules at package installation, see # # NOTA BENE: after the DEBHELPER section since dh_installudev # adds stuff there + # The devices ID list is auto-generated using the gbp postimport hook + # see debian/README.sources for more details. udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=2016 udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=2020 udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0010 @@ -65,6 +67,13 @@ if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2 udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0603 udevadm trigger --action=add --attr-match=idVendor=061a --attr-match=idProduct=0110 udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00bd + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e9 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00df + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00f9 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00fc + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c2 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c9 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e7 udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0903 udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0907 udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c01 @@ -119,7 +128,7 @@ if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2 udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c32 udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c33 udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c42 - udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00bb + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4d udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00bc udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00bd udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00ca @@ -130,11 +139,77 @@ if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2 udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=3001 udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1000 udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1001 - udevadm trigger --action=add --attr-match=idVendor=0483 --attr-match=idProduct=2016 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5840 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6496 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=60a2 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=63ac + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=639c + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=036b + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c00 + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4b + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4c + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4f + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c57 + udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=2706 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0081 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0088 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=008a + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=009a + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=009b + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00a2 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00b7 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00bb + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00be + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00cb + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00d8 + udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00da + udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5801 + udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5805 + udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5834 + udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5843 + udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=0007 + udevadm trigger --action=add --attr-match=idVendor=1188 --attr-match=idProduct=9545 + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0007 + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003a + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003c + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003d + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003f udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0090 udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0091 + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0092 udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0094 udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0097 + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=009d + udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=00ab + udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1002 + udevadm trigger --action=add --attr-match=idVendor=1491 --attr-match=idProduct=0088 + udevadm trigger --action=add --attr-match=idVendor=16d1 --attr-match=idProduct=1027 + udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0300 + udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0570 + udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0575 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5042 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5110 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5117 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5201 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=521d + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5301 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=530c + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=532d + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=533c + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5381 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5385 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=538c + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=538d + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5395 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5584 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55a2 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55a4 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55b4 + udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5740 + udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=9338 + udevadm trigger --action=add --attr-match=idVendor=298d --attr-match=idProduct=2033 + udevadm trigger --action=add --attr-match=idVendor=3538 --attr-match=idProduct=0930 + fi exit 0 diff --git a/debian/libfprint-2-2.postinst.in b/debian/libfprint-2-2.postinst.in new file mode 100644 index 00000000..83398aa8 --- /dev/null +++ b/debian/libfprint-2-2.postinst.in @@ -0,0 +1,17 @@ +#!/bin/sh + +set -e + +#DEBHELPER# + +if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2>&1; then + # apply hwdb rules at package installation, see + # + # NOTA BENE: after the DEBHELPER section since dh_installudev + # adds stuff there + # The devices ID list is auto-generated using the gbp postimport hook + # see debian/README.sources for more details. +@UDEVADM_TRIGGERS@ +fi + +exit 0 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/build-Explicitly-mark-libfprint-as-a-shared-library.patch b/debian/patches/build-Explicitly-mark-libfprint-as-a-shared-library.patch new file mode 100644 index 00000000..b96c472c --- /dev/null +++ b/debian/patches/build-Explicitly-mark-libfprint-as-a-shared-library.patch @@ -0,0 +1,27 @@ +From: Benjamin Berg +Date: Thu, 21 Jan 2021 17:36:41 +0100 +Subject: build: Explicitly mark libfprint as a shared library + +While meson suggests to always use 'library' this leads to some unwanted +behaviors when it comes to generate pkg-config files for it, as they +will include `Libs.Private` / `Required.private` fields that should not +be really part of a shared library as libfprint is meant to be used. + +Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/89890dbd +--- + libfprint/meson.build | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libfprint/meson.build b/libfprint/meson.build +index 110c458..9425e09 100644 +--- a/libfprint/meson.build ++++ b/libfprint/meson.build +@@ -258,7 +258,7 @@ libfprint_drivers = static_library('fprint-drivers', + mapfile = files('libfprint.ver') + vflag = '-Wl,--version-script,@0@/@1@'.format(meson.source_root(), mapfile[0]) + +-libfprint = library(versioned_libname.split('lib')[1], ++libfprint = shared_library(versioned_libname.split('lib')[1], + sources: [ + fp_enums, + libfprint_sources, diff --git a/debian/patches/build-Skip-the-hwdb-test-if-not-all-drivers-are-really-en.patch b/debian/patches/build-Skip-the-hwdb-test-if-not-all-drivers-are-really-en.patch new file mode 100644 index 00000000..ff455177 --- /dev/null +++ b/debian/patches/build-Skip-the-hwdb-test-if-not-all-drivers-are-really-en.patch @@ -0,0 +1,24 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Thu, 21 Jan 2021 15:34:36 +0100 +Subject: build: Skip the hwdb test if not all drivers are really enabled + +Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/3b83157e9 +--- + meson.build | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/meson.build b/meson.build +index 4c73c00..d5081c9 100644 +--- a/meson.build ++++ b/meson.build +@@ -181,6 +181,10 @@ foreach driver: drivers + endif + endforeach + ++if default_drivers_are_enabled and supported_drivers != drivers ++ default_drivers_are_enabled = false ++endif ++ + # Export the drivers' types to the core code + drivers_type_list = [] + drivers_type_func = [] 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/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 6a371149..1d5516ed 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,14 @@ meson-Do-not-support-drivers-known-to-fail-in-Big-Endian-.patch -debian/Tweak-the-udev-rules-creator-for-Debian-usage.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 +build-Explicitly-mark-libfprint-as-a-shared-library.patch diff --git a/debian/patches/tests-Add-check-that-no-supported-device-is-whitelisted.patch b/debian/patches/tests-Add-check-that-no-supported-device-is-whitelisted.patch new file mode 100644 index 00000000..b4979302 --- /dev/null +++ b/debian/patches/tests-Add-check-that-no-supported-device-is-whitelisted.patch @@ -0,0 +1,24 @@ +From: Benjamin Berg +Date: Tue, 19 Jan 2021 13:38:08 +0100 +Subject: tests: Add check that no supported device is whitelisted + +--- + tests/meson.build | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/tests/meson.build b/tests/meson.build +index 8fcae69..27bdd9f 100644 +--- a/tests/meson.build ++++ b/tests/meson.build +@@ -169,6 +169,11 @@ foreach test_name: unit_tests + ) + endforeach + ++# Run udev rule generator with fatal warnings ++test('udev-rules', ++ udev_rules, ++ env: envs) ++ + gdb = find_program('gdb', required: false) + if gdb.found() + add_test_setup('gdb', 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 new file mode 100644 index 00000000..7ca6f408 --- /dev/null +++ b/debian/patches/tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch @@ -0,0 +1,256 @@ +From: Benjamin Berg +Date: Thu, 21 Jan 2021 12:22:08 +0100 +Subject: tests: Add trailing newline to busname/devname sysfs attributes + +libusb 1.0.24 now expects busnum/devnum to be \n terminated. Update the +device descriptions accordingly. + +https://github.com/martinpitt/umockdev/issues/115 +--- + tests/aes3500/device | 16 ++++++++-------- + tests/elan/device | 12 ++++++------ + tests/goodixmoc/device | 8 ++++---- + tests/synaptics/device | 4 ++-- + tests/vfs0050/device | 4 ++-- + tests/vfs301/device | 12 ++++++------ + tests/vfs5011/device | 4 ++-- + 7 files changed, 30 insertions(+), 30 deletions(-) + +diff --git a/tests/aes3500/device b/tests/aes3500/device +index 4a2a903..c662cc8 100644 +--- a/tests/aes3500/device ++++ b/tests/aes3500/device +@@ -35,11 +35,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0000 + A: bmAttributes=80 +-A: busnum=3 ++A: busnum=3\n + A: configuration= + H: descriptors=12011001FFFFFF08FF0831570000000100010902200001010080320904000002FFFFFF000705810240000007050202080000 + A: dev=189:259 +-A: devnum=4 ++A: devnum=4\n + A: devpath=1.1.3 + L: driver=../../../../../../../../../../bus/usb/drivers/usb + A: idProduct=5731 +@@ -106,11 +106,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=9100 + A: bmAttributes=e0 +-A: busnum=3 ++A: busnum=3\n + A: configuration= + H: descriptors=12011002090001403022060000910102000109021900010100E0000904000001090000000705810301000C + A: dev=189:258 +-A: devnum=3 ++A: devnum=3\n + A: devpath=1.1 + L: driver=../../../../../../../../../bus/usb/drivers/usb + A: idProduct=0006 +@@ -186,11 +186,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=9100 + A: bmAttributes=e0 +-A: busnum=3 ++A: busnum=3\n + A: configuration= + H: descriptors=12011002090001403022060000910102000109021900010100E0000904000001090000000705810301000C + A: dev=189:257 +-A: devnum=2 ++A: devnum=2\n + A: devpath=1 + L: driver=../../../../../../../../bus/usb/drivers/usb + A: idProduct=0006 +@@ -270,11 +270,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0415 + A: bmAttributes=e0 +-A: busnum=3 ++A: busnum=3\n + A: configuration= + H: descriptors=12010002090001406B1D020015040302010109021900010100E0000904000001090000000705810304000C + A: dev=189:256 +-A: devnum=1 ++A: devnum=1\n + A: devpath=0 + L: driver=../../../../../../../bus/usb/drivers/usb + A: idProduct=0002 +diff --git a/tests/elan/device b/tests/elan/device +index 7374dc2..6e1e421 100644 +--- a/tests/elan/device ++++ b/tests/elan/device +@@ -36,11 +36,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0140 + A: bmAttributes=80 +-A: busnum=1 ++A: busnum=1\n + A: configuration= + H: descriptors=1201000200000008F304260C40010102000109023E0001010080320904000005FF0000000921100100012215000705810240000107050102400001070582024000010705830240000107050302400001 + A: dev=189:93 +-A: devnum=94 ++A: devnum=94\n + A: devpath=4.4 + L: driver=../../../../../../bus/usb/drivers/usb + A: idProduct=0c26 +@@ -107,11 +107,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=5284 + A: bmAttributes=e0 +-A: busnum=1 ++A: busnum=1\n + A: configuration= + H: descriptors=1201100209000140EF17181084520102000109021900010100E0000904000001090000000705810301000C + A: dev=189:82 +-A: devnum=83 ++A: devnum=83\n + A: devpath=4 + L: driver=../../../../../bus/usb/drivers/usb + A: idProduct=1018 +@@ -189,11 +189,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0503 + A: bmAttributes=e0 +-A: busnum=1 ++A: busnum=1\n + A: configuration= + H: descriptors=12010002090001406B1D020003050302010109021900010100E0000904000001090000000705810304000C + A: dev=189:0 +-A: devnum=1 ++A: devnum=1\n + A: devpath=0 + L: driver=../../../../bus/usb/drivers/usb + A: idProduct=0002 +diff --git a/tests/goodixmoc/device b/tests/goodixmoc/device +index 627c9dc..b008eb2 100644 +--- a/tests/goodixmoc/device ++++ b/tests/goodixmoc/device +@@ -37,11 +37,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0100 + A: bmAttributes=a0 +-A: busnum=1 ++A: busnum=1\n + A: configuration=UIDCBEE4D7B_XXXX_MOC_B0 + H: descriptors=12010002EF000040C627A26000010102030109022000010103A0320904000002FF0000040705830240000007050102400000 + A: dev=189:2 +-A: devnum=3 ++A: devnum=3\n + A: devpath=8 + L: driver=../../../../../bus/usb/drivers/usb + A: idProduct=60a2 +@@ -125,11 +125,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0504 + A: bmAttributes=e0 +-A: busnum=1 ++A: busnum=1\n + A: configuration= + H: descriptors=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C + A: dev=189:0 +-A: devnum=1 ++A: devnum=1\n + A: devpath=0 + L: driver=../../../../bus/usb/drivers/usb + A: idProduct=0002 +diff --git a/tests/synaptics/device b/tests/synaptics/device +index 6da3eea..87c4bed 100644 +--- a/tests/synaptics/device ++++ b/tests/synaptics/device +@@ -34,11 +34,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0000 + A: bmAttributes=a0 +-A: busnum=1 ++A: busnum=1\n + A: configuration= + H: descriptors=12010002FF10FF08CB06BD0000000000010109022700010100A0320904000003FF000000070501024000000705810240000007058303080004 + A: dev=189:69 +-A: devnum=70 ++A: devnum=70\n + A: devpath=1 + L: driver=../../../../../bus/usb/drivers/usb + A: idProduct=00bd +diff --git a/tests/vfs0050/device b/tests/vfs0050/device +index 1bea50a..b66be4b 100644 +--- a/tests/vfs0050/device ++++ b/tests/vfs0050/device +@@ -38,11 +38,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0060 + A: bmAttributes=a0 +-A: busnum=1 ++A: busnum=1\n + A: configuration= + H: descriptors=12011001FF10FF088A13500060000000010109022E00010100A0320904000004FF00000007050102400000070581024000000705820240000007058303080004 + A: dev=189:3 +-A: devnum=4 ++A: devnum=4\n + A: devpath=9 + L: driver=../../../../../bus/usb/drivers/usb + A: idProduct=0050 +diff --git a/tests/vfs301/device b/tests/vfs301/device +index 635f795..26d3b57 100644 +--- a/tests/vfs301/device ++++ b/tests/vfs301/device +@@ -37,11 +37,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0c90 + A: bmAttributes=a0 +-A: busnum=2 ++A: busnum=2\n + A: configuration= + H: descriptors=12011001FF10FF088A130500900C0000000109022700010100A0320904000003FF000000070501024000000705810240000007058202400000 + A: dev=189:132 +-A: devnum=5 ++A: devnum=5\n + A: devpath=1.3 + L: driver=../../../../../../bus/usb/drivers/usb + A: idProduct=0005 +@@ -120,11 +120,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0000 + A: bmAttributes=e0 +-A: busnum=2 ++A: busnum=2\n + A: configuration= + H: descriptors=12010002090001408780200000000000000109021900010100E0000904000001090000000705810302000C + A: dev=189:129 +-A: devnum=2 ++A: devnum=2\n + A: devpath=1 + L: driver=../../../../../bus/usb/drivers/usb + A: idProduct=0020 +@@ -204,11 +204,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0504 + A: bmAttributes=e0 +-A: busnum=2 ++A: busnum=2\n + A: configuration= + H: descriptors=12010002090000406B1D020004050302010109021900010100E0000904000001090000000705810304000C + A: dev=189:128 +-A: devnum=1 ++A: devnum=1\n + A: devpath=0 + L: driver=../../../../bus/usb/drivers/usb + A: idProduct=0002 +diff --git a/tests/vfs5011/device b/tests/vfs5011/device +index 4c75e59..e39a74f 100644 +--- a/tests/vfs5011/device ++++ b/tests/vfs5011/device +@@ -35,11 +35,11 @@ A: bNumConfigurations=1 + A: bNumInterfaces= 1 + A: bcdDevice=0078 + A: bmAttributes=a0 +-A: busnum=2 ++A: busnum=2\n + A: configuration= + H: descriptors=12011001FF11FF088A13170078000000010109022E00010100A0320904000004FF00000007050102400000070581024000000705820240000007058303080004 + A: dev=189:144 +-A: devnum=17 ++A: devnum=17\n + A: devpath=6 + L: driver=../../../../../bus/usb/drivers/usb + A: idProduct=0017 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 new file mode 100644 index 00000000..f6385d02 --- /dev/null +++ b/debian/patches/udev-hwdb-Prevent-devices-from-being-listed-twice.patch @@ -0,0 +1,31 @@ +From: Benjamin Berg +Date: Wed, 20 Jan 2021 18:02:31 +0100 +Subject: udev-hwdb: Prevent devices from being listed twice + +The change to print a warning (for testing purposes) from commit +944e0d03837 (udev-rules: Print warning if an ID is supported) was +incorrect because it prevented duplicated to be suppressed if a device +is listed by two independent drivers. +--- + libfprint/fprint-list-udev-rules.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c +index e574cac..050a450 100644 +--- a/libfprint/fprint-list-udev-rules.c ++++ b/libfprint/fprint-list-udev-rules.c +@@ -136,10 +136,11 @@ print_driver (const FpDeviceClass *cls) + + key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); + +- if (cls == &whitelist && g_hash_table_lookup (printed, key) != NULL) ++ if (g_hash_table_lookup (printed, key) != NULL) + { +- g_warning ("%s implemented by driver %s", +- key, (const char *) g_hash_table_lookup (printed, key)); ++ if (cls == &whitelist) ++ g_warning ("%s implemented by driver %s", ++ key, (const char *) g_hash_table_lookup (printed, key)); + g_free (key); + continue; + } 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 new file mode 100644 index 00000000..c810b309 --- /dev/null +++ b/debian/patches/udev-rules-Print-warning-if-an-ID-is-supported.patch @@ -0,0 +1,38 @@ +From: Benjamin Berg +Date: Tue, 19 Jan 2021 13:29:17 +0100 +Subject: udev-rules: Print warning if an ID is supported + +--- + libfprint/fprint-list-udev-rules.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c +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[] = { + static const FpDeviceClass whitelist = { + .type = FP_DEVICE_TYPE_USB, + .id_table = whitelist_id_table, ++ .id = "whitelist", + .full_name = "Hardcoded whitelist" + }; + +@@ -138,13 +139,15 @@ print_driver (const FpDeviceClass *cls) + + key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); + +- if (g_hash_table_lookup (printed, key) != NULL) ++ if (cls == &whitelist && g_hash_table_lookup (printed, key) != NULL) + { ++ 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, GINT_TO_POINTER (1)); ++ g_hash_table_insert (printed, key, (void *) cls->id); + + if (num_printed == 0) + g_print ("# %s\n", cls->full_name); diff --git a/debian/patches/udev-rules-Remove-supported-synaptics-devices.patch b/debian/patches/udev-rules-Remove-supported-synaptics-devices.patch new file mode 100644 index 00000000..d1b6d13d --- /dev/null +++ b/debian/patches/udev-rules-Remove-supported-synaptics-devices.patch @@ -0,0 +1,25 @@ +From: Benjamin Berg +Date: Tue, 19 Jan 2021 13:37:51 +0100 +Subject: udev-rules: Remove supported synaptics devices + +--- + libfprint/fprint-list-udev-rules.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c +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[] = { + { .vid = 0x06cb, .pid = 0x00b7 }, + { .vid = 0x06cb, .pid = 0x00bb }, + { .vid = 0x06cb, .pid = 0x00be }, +- { .vid = 0x06cb, .pid = 0x00c2 }, +- { .vid = 0x06cb, .pid = 0x00c9 }, + { .vid = 0x06cb, .pid = 0x00cb }, + { .vid = 0x06cb, .pid = 0x00d8 }, + { .vid = 0x06cb, .pid = 0x00da }, +- { .vid = 0x06cb, .pid = 0x00e7 }, + { .vid = 0x0a5c, .pid = 0x5801 }, + { .vid = 0x0a5c, .pid = 0x5805 }, + { .vid = 0x0a5c, .pid = 0x5834 }, diff --git a/debian/rules b/debian/rules index 7df35cde..daab32aa 100755 --- a/debian/rules +++ b/debian/rules @@ -5,8 +5,10 @@ export DPKG_GENSYMBOLS_CHECK_LEVEL = 2 BUILDDIR = $(CURDIR)/obj-$(DEB_HOST_GNU_TYPE) # Configuration arguments -CONFIG_ARGS = -Dudev_rules_dir=/lib/udev/rules.d -Dgtk-examples=false \ - -Ddrivers=all +CONFIG_ARGS = \ + -Dudev_hwdb_dir=/lib/udev/hwdb.d \ + -Ddrivers=all \ + -Dgtk-examples=false %: dh $@ --with gir @@ -14,12 +16,5 @@ CONFIG_ARGS = -Dudev_rules_dir=/lib/udev/rules.d -Dgtk-examples=false \ override_dh_auto_configure: dh_auto_configure -- $(CONFIG_ARGS) -override_dh_install: - mv debian/tmp/lib/udev/rules.d/60-libfprint-2-autosuspend.rules \ - debian/tmp/lib/udev/rules.d/60-libfprint-2.rules - sed -i '/^Requires.private\|^Libs.private/ d' \ - debian/tmp/usr/lib/*/pkgconfig/libfprint-2.pc - dh_install - override_dh_auto_test: dh_auto_test -- -C $(BUILDDIR) --timeout-multiplier 5 diff --git a/debian/update-udev-triggers.sh b/debian/update-udev-triggers.sh new file mode 100755 index 00000000..24b3013c --- /dev/null +++ b/debian/update-udev-triggers.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -e + +srcdir="${GBP_SOURCES_DIR:-.}" +debpath="$(dirname "$0")" +autosuspend_file="/tmp/autosuspend.hwdb" +commands_lines=() + +while IFS= read -r line; do + if [[ $line =~ ^usb:v([A-Fa-f0-9]{4})p([A-Fa-f0-9]{4}) ]]; then + vendor="$(echo "${BASH_REMATCH[1]}" | tr '[:upper:]' '[:lower:]')" + product="$(echo "${BASH_REMATCH[2]}" | tr '[:upper:]' '[:lower:]')" + commands_lines+=("\tudevadm trigger --action=add --attr-match=idVendor=$vendor --attr-match=idProduct=$product") + fi +done < "$autosuspend_file" + +UDEVADM_TRIGGERS=$( IFS=$'\n'; echo -e "${commands_lines[*]}" ) +export UDEVADM_TRIGGERS + +for i in "$debpath"/libfprint-*.post*.in; do + out="${i%.in}" + perl -pe 's/\@UDEVADM_TRIGGERS\@/`printenv UDEVADM_TRIGGERS`/e' "$i" > "$out" + + if [ -n "$GBP_BRANCH" ]; then + if ! git diff-index --quiet HEAD -- "$out"; then + git add "$out" + dch "${out#$srcdir}: Devices triggers updated" + git add debian/changelog + debcommit + fi + fi +done diff --git a/libfprint/drivers/goodixmoc/goodix.c b/libfprint/drivers/goodixmoc/goodix.c index bb0368b9..af64d814 100644 --- a/libfprint/drivers/goodixmoc/goodix.c +++ b/libfprint/drivers/goodixmoc/goodix.c @@ -53,6 +53,7 @@ struct _FpiDeviceGoodixMoc pgxfp_sensor_cfg_t sensorcfg; gint enroll_stage; gint max_enroll_stage; + gint max_stored_prints; GCancellable *cancellable; GPtrArray *list_result; guint8 template_id[TEMPLATE_ID_SIZE]; @@ -330,7 +331,9 @@ fp_verify_capture_cb (FpiDeviceGoodixMoc *self, fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL)); return; } - + fpi_device_report_finger_status_changes (FP_DEVICE (self), + FP_FINGER_STATUS_PRESENT, + FP_FINGER_STATUS_NONE); if (resp->capture_data_resp.img_quality == 0) { fpi_ssm_mark_failed (self->task_ssm, @@ -341,6 +344,7 @@ fp_verify_capture_cb (FpiDeviceGoodixMoc *self, { fpi_ssm_mark_failed (self->task_ssm, fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER)); + return; } fpi_ssm_next_state (self->task_ssm); } @@ -433,6 +437,9 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device) switch (fpi_ssm_get_cur_state (ssm)) { case FP_VERIFY_CAPTURE: + fpi_device_report_finger_status_changes (device, + FP_FINGER_STATUS_NEEDED, + FP_FINGER_STATUS_NONE); goodix_sensor_cmd (self, MOC_CMD0_CAPTURE_DATA, MOC_CMD1_DEFAULT, true, (const guint8 *) ¶m, @@ -560,6 +567,13 @@ fp_enroll_enum_cb (FpiDeviceGoodixMoc *self, resp->result)); return; } + if (resp->finger_list_resp.finger_num >= self->max_stored_prints) + { + fpi_ssm_mark_failed (self->task_ssm, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_FULL)); + return; + } + fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE); } @@ -620,7 +634,9 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self, fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE); return; } - + fpi_device_report_finger_status_changes (FP_DEVICE (self), + FP_FINGER_STATUS_PRESENT, + FP_FINGER_STATUS_NONE); if ((resp->capture_data_resp.img_quality < self->sensorcfg->config[4]) || (resp->capture_data_resp.img_coverage < self->sensorcfg->config[5])) { @@ -742,7 +758,7 @@ fp_finger_mode_cb (FpiDeviceGoodixMoc *self, fpi_ssm_mark_failed (self->task_ssm, error); return; } - /* if reach max timeout(5sec) finger not up, swtich to finger up again */ + /* if reach max timeout(5sec) finger not up, switch to finger up again */ if (resp->finger_status.status == GX_ERROR_WAIT_FINGER_UP_TIMEOUT) { fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_WAIT_FINGER_UP); @@ -755,6 +771,9 @@ fp_finger_mode_cb (FpiDeviceGoodixMoc *self, "Switch finger mode failed")); return; } + fpi_device_report_finger_status_changes (FP_DEVICE (self), + FP_FINGER_STATUS_NONE, + FP_FINGER_STATUS_PRESENT); if (self->enroll_stage < self->max_enroll_stage) { fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE); @@ -817,6 +836,9 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device) break; case FP_ENROLL_CAPTURE: + fpi_device_report_finger_status_changes (device, + FP_FINGER_STATUS_NEEDED, + FP_FINGER_STATUS_NONE); goodix_sensor_cmd (self, MOC_CMD0_CAPTURE_DATA, MOC_CMD1_DEFAULT, true, (const guint8 *) &dummy, @@ -975,7 +997,7 @@ fp_init_config_cb (FpiDeviceGoodixMoc *self, fpi_ssm_mark_failed (self->task_ssm, error); return; } - + self->max_stored_prints = resp->finger_config.max_stored_prints; fpi_ssm_next_state (self->task_ssm); } @@ -1259,6 +1281,8 @@ gx_fp_init (FpDevice *device) GError *error = NULL; int ret = 0; + self->max_stored_prints = FP_MAX_FINGERNUM; + self->cancellable = g_cancellable_new (); self->sensorcfg = g_new0 (gxfp_sensor_cfg_t, 1); @@ -1424,6 +1448,8 @@ static const FpIdEntry id_table[] = { { .vid = 0x27c6, .pid = 0x5840, }, { .vid = 0x27c6, .pid = 0x6496, }, { .vid = 0x27c6, .pid = 0x60A2, }, + { .vid = 0x27c6, .pid = 0x63AC, }, + { .vid = 0x27c6, .pid = 0x639C, }, { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ }; diff --git a/libfprint/drivers/goodixmoc/goodix_proto.c b/libfprint/drivers/goodixmoc/goodix_proto.c index ece8123d..e30d23df 100644 --- a/libfprint/drivers/goodixmoc/goodix_proto.c +++ b/libfprint/drivers/goodixmoc/goodix_proto.c @@ -294,6 +294,12 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint32_t buffer_len, pgxfp_c break; case MOC_CMD0_UPDATE_CONFIG: + { + presp->finger_config.status = buffer[0]; + presp->finger_config.max_stored_prints = buffer[2]; + } + break; + case MOC_CMD0_COMMITENROLLMENT: case MOC_CMD0_DELETETEMPLATE: break; @@ -411,7 +417,7 @@ gx_proto_init_sensor_config (pgxfp_sensor_cfg_t pconfig) memset (pconfig, 0, sizeof (*pconfig)); //NOTICE: Do not change any value! - memcpy (&pconfig->config, sensor_config, 26); + memcpy (&pconfig->config, sensor_config, G_N_ELEMENTS (sensor_config)); pconfig->reserved[0] = 1; gx_proto_crc32_calc ((uint8_t *) pconfig, sizeof (*pconfig) - PACKAGE_CRC_SIZE, (uint8_t *) &crc32_calc); diff --git a/libfprint/drivers/goodixmoc/goodix_proto.h b/libfprint/drivers/goodixmoc/goodix_proto.h index 1611a601..53eea046 100644 --- a/libfprint/drivers/goodixmoc/goodix_proto.h +++ b/libfprint/drivers/goodixmoc/goodix_proto.h @@ -25,7 +25,7 @@ #define PACKAGE_CRC_SIZE (4) #define PACKAGE_HEADER_SIZE (8) -#define FP_MAX_FINGERNUM (10) +#define FP_MAX_FINGERNUM (20) #define TEMPLATE_ID_SIZE (32) @@ -167,6 +167,11 @@ typedef struct _fp_finger_status uint8_t status; } fp_finger_status_t, *pfp_finger_status_t; +typedef struct _fp_finger_config +{ + uint8_t status; + uint8_t max_stored_prints; +} fp_finger_config_t, *pfp_finger_config_t; typedef struct _fp_cmd_response { @@ -183,6 +188,7 @@ typedef struct _fp_cmd_response gxfp_enum_fingerlist_t finger_list_resp; gxfp_version_info_t version_info; fp_finger_status_t finger_status; + fp_finger_config_t finger_config; }; } gxfp_cmd_response_t, *pgxfp_cmd_response_t; diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c index 934a271e..b4711faf 100644 --- a/libfprint/drivers/synaptics/synaptics.c +++ b/libfprint/drivers/synaptics/synaptics.c @@ -27,6 +27,9 @@ G_DEFINE_TYPE (FpiDeviceSynaptics, fpi_device_synaptics, FP_TYPE_DEVICE) +static void init_identify_msg (FpDevice *device); +static void compose_and_send_identify_msg (FpDevice *device); + static const FpIdEntry id_table[] = { { .vid = SYNAPTICS_VENDOR_ID, .pid = 0xBD, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0xE9, }, @@ -121,7 +124,7 @@ cmd_receive_cb (FpiUsbTransfer *transfer, { if (resp.response_id == BMKT_RSP_CANCEL_OP_OK) { - fp_dbg ("Received cancellation success resonse"); + fp_dbg ("Received cancellation success response"); fpi_ssm_mark_failed (transfer->ssm, g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, @@ -451,6 +454,37 @@ parse_print_data (GVariant *data, return TRUE; } +static FpPrint * +create_print (FpiDeviceSynaptics *self, + guint8 *user_id, + guint8 finger_id) +{ + FpPrint *print; + g_autofree gchar *user_id_safe; + GVariant *data = NULL; + GVariant *uid = NULL; + + user_id_safe = g_strndup ((char *) user_id, BMKT_MAX_USER_ID_LEN); + + print = fp_print_new (FP_DEVICE (self)); + uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, + user_id_safe, + strlen (user_id_safe), + 1); + data = g_variant_new ("(y@ay)", + finger_id, + uid); + + fpi_print_set_type (print, FPI_PRINT_RAW); + fpi_print_set_device_stored (print, TRUE); + g_object_set (print, "fpi-data", data, NULL); + g_object_set (print, "description", user_id_safe, NULL); + + fpi_print_fill_from_user_id (print, user_id_safe); + + return print; +} + static void list_msg_cb (FpiDeviceSynaptics *self, bmkt_response_t *resp, @@ -503,10 +537,7 @@ list_msg_cb (FpiDeviceSynaptics *self, for (int n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++) { - GVariant *data = NULL; - GVariant *uid = NULL; FpPrint *print; - gchar *userid; if (get_enroll_templates_resp->templates[n].user_id_len == 0) continue; @@ -519,23 +550,9 @@ list_msg_cb (FpiDeviceSynaptics *self, get_enroll_templates_resp->templates[n].user_id, get_enroll_templates_resp->templates[n].finger_id); - userid = (gchar *) get_enroll_templates_resp->templates[n].user_id; - - print = fp_print_new (FP_DEVICE (self)); - uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, - get_enroll_templates_resp->templates[n].user_id, - get_enroll_templates_resp->templates[n].user_id_len, - 1); - data = g_variant_new ("(y@ay)", - get_enroll_templates_resp->templates[n].finger_id, - uid); - - fpi_print_set_type (print, FPI_PRINT_RAW); - fpi_print_set_device_stored (print, TRUE); - g_object_set (print, "fpi-data", data, NULL); - g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL); - - fpi_print_fill_from_user_id (print, userid); + print = create_print (self, + get_enroll_templates_resp->templates[n].user_id, + get_enroll_templates_resp->templates[n].finger_id); g_ptr_array_add (self->list_result, g_object_ref_sink (print)); } @@ -649,7 +666,7 @@ verify_msg_cb (FpiDeviceSynaptics *self, fp_info ("Verify was successful! for user: %s finger: %d score: %f", verify_resp->user_id, verify_resp->finger_id, verify_resp->match_result); fpi_device_verify_report (device, FPI_MATCH_SUCCESS, NULL, NULL); - fpi_device_verify_complete (device, NULL); + verify_complete_after_finger_removal (self); break; } } @@ -725,6 +742,12 @@ identify_msg_cb (FpiDeviceSynaptics *self, fp_info ("Place Finger on the Sensor!"); break; + case BMKT_RSP_SEND_NEXT_USER_ID: + { + compose_and_send_identify_msg (device); + break; + } + case BMKT_RSP_ID_FAIL: if (resp->result == BMKT_SENSOR_STIMULUS_ERROR) { @@ -760,45 +783,47 @@ identify_msg_cb (FpiDeviceSynaptics *self, FpPrint *print = NULL; GPtrArray *prints = NULL; g_autoptr(GVariant) data = NULL; - guint8 finger; - const guint8 *user_id; - gsize user_id_len = 0; - gint cnt = 0; - gboolean find = FALSE; + gboolean found = FALSE; + guint index; + + print = create_print (self, + resp->response.id_resp.user_id, + resp->response.id_resp.finger_id); fpi_device_get_identify_data (device, &prints); - for (cnt = 0; cnt < prints->len; cnt++) - { - print = g_ptr_array_index (prints, cnt); - g_object_get (print, "fpi-data", &data, NULL); - g_debug ("data is %p", data); - parse_print_data (data, &finger, &user_id, &user_id_len); - if (user_id) - { - if (memcmp (resp->response.id_resp.user_id, user_id, user_id_len) == 0) - { - find = TRUE; - break; - } - } - } - if(find) - { - fpi_device_identify_report (device, print, print, NULL); - fpi_device_identify_complete (device, NULL); - } + found = g_ptr_array_find_with_equal_func (prints, + print, + (GEqualFunc) fp_print_equal, + &index); + + if (found) + fpi_device_identify_report (device, g_ptr_array_index (prints, index), print, NULL); else - { - fpi_device_identify_report (device, NULL, NULL, NULL); - identify_complete_after_finger_removal (self); - } + fpi_device_identify_report (device, NULL, print, NULL); + + identify_complete_after_finger_removal (self); } } } static void identify (FpDevice *device) +{ + init_identify_msg (device); + compose_and_send_identify_msg (device); +} + +static void +init_identify_msg (FpDevice *device) +{ + FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); + + self->id_idx = 0; +} + +static void +compose_and_send_identify_msg (FpDevice *device) { FpiDeviceSynaptics *self = FPI_DEVICE_SYNAPTICS (device); FpPrint *print = NULL; @@ -808,28 +833,77 @@ identify (FpDevice *device) guint8 finger; const guint8 *user_id; gsize user_id_len = 0; - gint cnt = 0; + g_autofree guint8 *payload = NULL; + guint8 payload_len = 0; + guint8 payloadOffset = 0; fpi_device_get_identify_data (device, &prints); - - for (cnt = 0; cnt < prints->len; cnt++) + if (prints->len > UINT8_MAX) { - print = g_ptr_array_index (prints, cnt); - g_object_get (print, "fpi-data", &data, NULL); - g_debug ("data is %p", data); - if (!parse_print_data (data, &finger, &user_id, &user_id_len)) - { - fpi_device_identify_complete (device, - fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); - return; - } + fpi_device_identify_complete (device, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); + return; } - G_DEBUG_HERE (); + if(self->id_idx >= prints->len) + { + fp_warn ("Device asked for more prints than we are providing."); + fpi_device_identify_complete (device, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Unexpected index")); + return; + } + print = g_ptr_array_index (prints, self->id_idx); + g_object_get (print, "fpi-data", &data, NULL); + g_debug ("data is %p", data); + if (!parse_print_data (data, &finger, &user_id, &user_id_len)) + { + fpi_device_identify_complete (device, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); + return; + } + if(self->id_idx == 0) + { + /* + * Construct payload. + * 1st byte is total number of IDs in list. + * 2nd byte is number of IDs in list. + * 1 byte for each ID length, maximum id length is 100. + * user_id_len bytes of each ID + */ + payload_len = 2 + 1 + user_id_len; + payload = g_malloc0 (payload_len); + payload[payloadOffset] = prints->len; + payloadOffset += 1; + payload[payloadOffset] = 1; /* send one id per message */ + payloadOffset += 1; + payload[payloadOffset] = user_id_len; + payloadOffset += 1; + memcpy (&payload[payloadOffset], user_id, user_id_len); + payloadOffset += user_id_len; - synaptics_sensor_cmd (self, 0, BMKT_CMD_ID_USER, NULL, 0, identify_msg_cb); + G_DEBUG_HERE (); + + synaptics_sensor_cmd (self, 0, BMKT_CMD_ID_USER_IN_ORDER, payload, payloadOffset, identify_msg_cb); + } + else + { + /* + * 1st byte is the number of IDs + * 1 byte for each ID length + * id_length bytes for each ID + */ + payload_len = 1 + 1 + user_id_len; + payload = g_malloc0 (payload_len); + payload[payloadOffset] = 1; /* send one id per message */ + payloadOffset += 1; + payload[payloadOffset] = user_id_len; + payloadOffset += 1; + memcpy (&payload[payloadOffset], user_id, user_id_len); + payloadOffset += user_id_len; + synaptics_sensor_cmd (self, self->cmd_seq_num, BMKT_CMD_ID_NEXT_USER, payload, payloadOffset, NULL); + } + self->id_idx++; } - - static void enroll_msg_cb (FpiDeviceSynaptics *self, bmkt_response_t *resp, @@ -1059,6 +1133,44 @@ delete_print (FpDevice *device) synaptics_sensor_cmd (self, 0, BMKT_CMD_DEL_USER_FP, payload, user_id_len + 1, delete_msg_cb); } +static void +prob_msg_cb (FpiDeviceSynaptics *self, + bmkt_response_t *resp, + GError *error) +{ + GUsbDevice *usb_dev = NULL; + g_autofree gchar *serial = NULL; + + usb_dev = fpi_device_get_usb_device (FP_DEVICE (self)); + + if (error) + { + g_usb_device_close (usb_dev, NULL); + fpi_device_probe_complete (FP_DEVICE (self), NULL, NULL, + fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, "unsupported firmware version")); + return; + } + + if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0) + serial = g_strdup ("emulated-device"); + else + serial = g_usb_device_get_string_descriptor (usb_dev, + g_usb_device_get_serial_number_index (usb_dev), + &error); + + if (resp->result == BMKT_SUCCESS) + { + g_usb_device_close (usb_dev, NULL); + fpi_device_probe_complete (FP_DEVICE (self), serial, NULL, error); + } + else + { + g_warning ("Probe fingerprint sensor failed with %d!", resp->result); + g_usb_device_close (usb_dev, NULL); + fpi_device_probe_complete (FP_DEVICE (self), serial, NULL, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + } +} + static void dev_probe (FpDevice *device) { @@ -1159,40 +1271,7 @@ dev_probe (FpDevice *device) fp_dbg ("Target: %d", self->mis_version.target); fp_dbg ("Product: %d", self->mis_version.product); - - /* We need at least firmware version 10.1, and for 10.1 build 2989158 */ - if (self->mis_version.version_major < 10 || - self->mis_version.version_minor < 1 || - (self->mis_version.version_major == 10 && - self->mis_version.version_minor == 1 && - self->mis_version.build_num < 2989158)) - { - fp_warn ("Firmware version %d.%d with build number %d is unsupported", - self->mis_version.version_major, - self->mis_version.version_minor, - self->mis_version.build_num); - - error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, - "Unsupported firmware version " - "(%d.%d with build number %d)", - self->mis_version.version_major, - self->mis_version.version_minor, - self->mis_version.build_num); - goto err_close; - } - - /* This is the same as the serial_number from above, hex encoded and somewhat reordered */ - /* Should we add in more, e.g. the chip revision? */ - if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0) - serial = g_strdup ("emulated-device"); - else - serial = g_usb_device_get_string_descriptor (usb_dev, - g_usb_device_get_serial_number_index (usb_dev), - &error); - - g_usb_device_close (usb_dev, NULL); - - fpi_device_probe_complete (device, serial, NULL, error); + synaptics_sensor_cmd (self, 0, BMKT_CMD_FPS_INIT, NULL, 0, prob_msg_cb); return; diff --git a/libfprint/drivers/synaptics/synaptics.h b/libfprint/drivers/synaptics/synaptics.h index ac50171b..deb3a224 100644 --- a/libfprint/drivers/synaptics/synaptics.h +++ b/libfprint/drivers/synaptics/synaptics.h @@ -110,6 +110,7 @@ struct _FpiDeviceSynaptics FpiSsm *cmd_ssm; FpiUsbTransfer *cmd_pending_transfer; gboolean cmd_complete_on_removal; + guint8 id_idx; bmkt_sensor_version_t mis_version; diff --git a/libfprint/drivers/vfs5011.c b/libfprint/drivers/vfs5011.c index ffc06803..c1e684c1 100644 --- a/libfprint/drivers/vfs5011.c +++ b/libfprint/drivers/vfs5011.c @@ -815,13 +815,11 @@ dev_close (FpImageDevice *dev) GError *error = NULL; FpDeviceVfs5011 *self = FPI_DEVICE_VFS5011 (dev); - ; - g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error); g_free (self->capture_buffer); - g_slist_free_full (self->rows, g_free); + g_slist_free_full (g_steal_pointer (&self->rows), g_free); fpi_image_device_close_complete (dev, error); } diff --git a/libfprint/fp-device.c b/libfprint/fp-device.c index 6db665fa..f752a487 100644 --- a/libfprint/fp-device.c +++ b/libfprint/fp-device.c @@ -792,7 +792,7 @@ fp_device_close_finish (FpDevice *device, * in. The driver may make use of this metadata, when e.g. storing the print on * device memory. It is undefined whether this print is filled in by the driver * and returned, or whether the driver will return a newly created print after - * enrollment successed. + * enrollment succeeded. */ void fp_device_enroll (FpDevice *device, diff --git a/libfprint/fpi-device.c b/libfprint/fpi-device.c index 0968c0c1..de511920 100644 --- a/libfprint/fpi-device.c +++ b/libfprint/fpi-device.c @@ -760,7 +760,7 @@ fp_device_task_return_in_idle_cb (gpointer user_data) g_task_return_error (task, fpi_device_error_new (FP_DEVICE_ERROR_REMOVED)); /* NOTE: The removed signal will be emitted from the GTask - * notify::completed if that is neccessary. */ + * notify::completed if that is necessary. */ return G_SOURCE_REMOVE; } diff --git a/libfprint/fpi-ssm.c b/libfprint/fpi-ssm.c index 3cc39a7f..25728d18 100644 --- a/libfprint/fpi-ssm.c +++ b/libfprint/fpi-ssm.c @@ -74,7 +74,7 @@ * upon success (or fails). * * Your completion callback should examine the return value of - * fpi_ssm_get_error() in ordater to determine whether the #FpiSsm completed or + * fpi_ssm_get_error() in order to determine whether the #FpiSsm completed or * failed. An error code of zero indicates successful completion. */ diff --git a/meson.build b/meson.build index 4c52e2ec..6d379e1a 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('libfprint', [ 'c', 'cpp' ], - version: '1.90.6+tod1', + version: '1.90.7', license: 'LGPLv2.1+', default_options: [ 'buildtype=debugoptimized', diff --git a/tests/README.md b/tests/README.md index 8a70ba12..9eac6a4b 100644 --- a/tests/README.md +++ b/tests/README.md @@ -27,7 +27,7 @@ A new 'capture' test is created by means of `capture.py` script: - `export LD_PRELOAD=/libfprint/libfprint-2.so` - `export GI_TYPELIB_PATH=/libfprint` - Also, sometimes the driver must be adopted to the emulated environment + Also, sometimes the driver must be adapted to the emulated environment (mainly if it uses random numbers, see `synaptics.c` for an example). Set the following environment variable to enable this adaptation: - `export FP_DEVICE_EMULATION=1` @@ -41,6 +41,11 @@ A new 'capture' test is created by means of `capture.py` script: The following USB device is used in the example above: `/dev/bus/usb/001/005`. + For the following commands, it is assumed that the user that's + running the commands has full access to the device node, whether + by running the commands as `root`, or changing the permissions for + that device node. + 4. Record information about this device: `umockdev-record /dev/bus/usb/001/005 > DRIVER/device` diff --git a/tests/goodixmoc/custom.py b/tests/goodixmoc/custom.py index 57faf6c5..17f35622 100755 --- a/tests/goodixmoc/custom.py +++ b/tests/goodixmoc/custom.py @@ -20,6 +20,7 @@ d.open_sync() template = FPrint.Print.new(d) def enroll_progress(*args): + assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED print('enroll progress: ' + str(args)) def identify_done(dev, res): @@ -31,7 +32,9 @@ def identify_done(dev, res): # List, enroll, list, verify, identify, delete print("enrolling") +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE p = d.enroll_sync(template, None, enroll_progress, None) +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE print("enroll done") print("listing") @@ -40,7 +43,9 @@ print("listing done") assert len(stored) == 1 assert stored[0].equal(p) print("verifying") +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE verify_res, verify_print = d.verify_sync(p) +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE print("verify done") del p assert verify_res == True diff --git a/tests/synaptics/custom.ioctl b/tests/synaptics/custom.ioctl index 370a8e07..e2ea71f1 100644 --- a/tests/synaptics/custom.ioctl +++ b/tests/synaptics/custom.ioctl @@ -4,14 +4,16 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 01 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 40 38 0 00009C37FE5C669C2D000A01014101C10000D11BB7134A090FA1000000000100000000000003 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE011100 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE01130100 -USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302D302D30303030303030302D6E6F626F6479 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE025400 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE021100 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE02130100 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE03512000014650312D30303030303030302D302D30303030303030302D6E6F626F6479 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE035400 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 @@ -20,13 +22,13 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0255010C + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0355010C USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 @@ -35,19 +37,19 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE02550119 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE03550119 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE02550125 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE03550125 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 @@ -56,13 +58,13 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE02550125 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE03550125 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 @@ -71,13 +73,13 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE02550132 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE03550132 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 @@ -86,13 +88,13 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0255013E + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0355013E USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 @@ -101,13 +103,13 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0255013E + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0355013E USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 @@ -116,13 +118,13 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0255014B + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE0355014B USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 @@ -131,7 +133,7 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 @@ -140,13 +142,13 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE02550157 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE03550157 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE026000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE036000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 @@ -155,21 +157,21 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 37 37 0 A7FE02512000014650312D30303030303030302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE02550164 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE03550164 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 37 0 0000FE02591F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 37 0 0000FE03591F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 -USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE037100 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 41 0 0000FE03752301012007014650312D30303030303030302D302D30303030303030302D6E6F626F6479 -USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE037200 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE037600 -USBDEVFS_REAPURBNDELAY 0 3 1 0 0 35 35 0 A7FE04651E4650312D30303030303030302D302D30303030303030302D6E6F626F6479 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE046600 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE047100 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 41 0 0000FE04752301012007014650312D30303030303030302D302D30303030303030302D6E6F626F6479 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE047200 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE047600 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 35 35 0 A7FE05651E4650312D30303030303030302D302D30303030303030302D6E6F626F6479 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE056600 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000000 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE046000 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE056000 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 06000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910101 @@ -178,9 +180,9 @@ USBDEVFS_REAPURBNDELAY 0 3 1 0 0 35 35 0 A7FE04651E4650312D30303030303030302D302 USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 7 0 0000FE00910100 USBDEVFS_REAPURBNDELAY 0 1 131 0 0 7 7 0 05000000000100 USBDEVFS_REAPURBNDELAY 0 3 1 0 0 1 1 0 A8 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 39 0 0000FE0468214F2B014650312D30303030303030302D302D30303030303030302D6E6F626F6479 -USBDEVFS_REAPURBNDELAY 0 3 1 0 0 36 36 0 A7FE05811F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 37 0 0000FE05831F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 -USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE06A100 - USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE06A200 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 39 0 0000FE0568214F2B014650312D30303030303030302D302D30303030303030302D6E6F626F6479 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 36 36 0 A7FE06811F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 37 0 0000FE06831F014650312D30303030303030302D302D30303030303030302D6E6F626F6479 +USBDEVFS_REAPURBNDELAY 0 3 1 0 0 5 5 0 A7FE07A100 + USBDEVFS_REAPURBNDELAY 0 3 129 0 0 266 6 0 0000FE07A200 diff --git a/tests/test-fp-context.c b/tests/test-fp-context.c index 1dd1f727..156e6d47 100644 --- a/tests/test-fp-context.c +++ b/tests/test-fp-context.c @@ -287,7 +287,7 @@ test_context_remove_device_opening (void) g_assert_true (removed); g_assert_null (tctx->user_data); - /* Running the mainloop now will cause the open to *succeed* dispite removal! */ + /* Running the mainloop now will cause the open to *succeed* despite removal! */ while (!open_done) g_main_context_iteration (NULL, TRUE);