From 08cf893e2e104d48b95cf8a6af08e470c8f1da2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 3 Mar 2021 18:19:46 +0100 Subject: [PATCH 01/32] examples: Add TOD inspector tool, to do some basic analysis of TOD drivers Will print some drivers data --- examples/meson.build | 10 +++ examples/tod-inspector.c | 135 ++++++++++++++++++++++++++++++++++++++ libfprint/tod/meson.build | 6 +- 3 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 examples/tod-inspector.c diff --git a/examples/meson.build b/examples/meson.build index 06615465..3f213470 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -21,3 +21,13 @@ executable('cpp-test', 'cpp-test.cpp', dependencies: libfprint_dep, ) + +if get_option('tod') + executable('tod-inspector', + sources: 'tod-inspector.c', + dependencies: [ + libfprint_dep, + tod_dep, + ], + ) +endif diff --git a/examples/tod-inspector.c b/examples/tod-inspector.c new file mode 100644 index 00000000..4c2eafaf --- /dev/null +++ b/examples/tod-inspector.c @@ -0,0 +1,135 @@ +/* + * Shared library loader for libfprint + * Copyright (C) 2021 Marco Trevisan + * + * 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 "libfprint/tod/tod-shared-loader.h" +#include "libfprint/fpi-device.h" + +static char * +id_table_to_string (FpDeviceType device_type, + const FpIdEntry *id_table) +{ + const FpIdEntry *entry; + char *str = NULL; + + if (!id_table) + return g_strdup ("INVALID: Empty ID table"); + + entry = id_table; + while (TRUE) + { + g_autofree char *value = NULL; + + if (device_type == FP_DEVICE_TYPE_VIRTUAL) + { + if (entry->virtual_envvar) + value = g_strdup (entry->virtual_envvar); + } + else if (device_type == FP_DEVICE_TYPE_USB) + { + if (entry->vid) + value = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); + } + else + { + return g_strdup ("Unsupported"); + } + + if (!value) + return str; + + if (!str) + { + str = g_steal_pointer (&value); + } + else + { + g_autofree char *tmp = g_steal_pointer (&str); + str = g_strconcat (tmp, ", ", value, NULL); + } + + entry++; + } + + return str; +} + +static const char * +device_type_to_string (FpDeviceType device_type) +{ + g_autoptr(GEnumClass) device_types = g_type_class_ref (fp_device_type_get_type ()); + GEnumValue *value = g_enum_get_value (device_types, device_type); + + return value->value_nick; +} + +static const char * +scan_type_to_string (FpScanType scan_type) +{ + g_autoptr(GEnumClass) scan_types = g_type_class_ref (fp_scan_type_get_type ()); + GEnumValue *value = g_enum_get_value (scan_types, scan_type); + + return value->value_nick; +} + +int +main (void) +{ + g_autoptr(GArray) shared_drivers = NULL; + guint i; + + fpi_tod_shared_drivers_register (); + + shared_drivers = fpi_tod_shared_drivers_get (); + g_print ("Found %u drivers\n", shared_drivers->len); + + for (i = 0; i < shared_drivers->len; i++) + { + GType driver = g_array_index (shared_drivers, GType, i); + g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver); + g_autofree char *id_table = NULL; + + id_table = id_table_to_string (cls->type, cls->id_table); + + g_print ("ID: %s\n", cls->id); + g_print ("Full Name: %s\n", cls->full_name); + g_print ("Type: %s\n", device_type_to_string (cls->type)); + g_print ("Enroll stages: %d\n", cls->nr_enroll_stages); + g_print ("Scan type: %s\n", scan_type_to_string (cls->scan_type)); + g_print ("Supported Devices: %s\n", id_table); + g_print ("Implemented VFuncs:\n"); + g_print (" usb_discover: %s\n", cls->usb_discover ? "true" : "false"); + g_print (" probe: %s\n", cls->probe ? "true" : "false"); + g_print (" open: %s\n", cls->open ? "true" : "false"); + g_print (" close: %s\n", cls->close ? "true" : "false"); + g_print (" enroll: %s\n", cls->enroll ? "true" : "false"); + g_print (" verify: %s\n", cls->verify ? "true" : "false"); + g_print (" identify: %s\n", cls->identify ? "true" : "false"); + g_print (" capture: %s\n", cls->capture ? "true" : "false"); + g_print (" list: %s\n", cls->list ? "true" : "false"); + g_print (" delete: %s\n", cls->delete ? "true" : "false"); + g_print (" cancel: %s\n", cls->cancel ? "true" : "false"); + + if (i < shared_drivers->len - 1) + g_print ("------------\n"); + } + + fpi_tod_shared_drivers_unregister (); +} diff --git a/libfprint/tod/meson.build b/libfprint/tod/meson.build index 58c48680..406b69de 100644 --- a/libfprint/tod/meson.build +++ b/libfprint/tod/meson.build @@ -42,12 +42,12 @@ libfprint_tod = library(versioned_libname.split('lib')[1] + '-tod', dependencies: deps, install: true) -deps += declare_dependency( +tod_dep = declare_dependency( link_with: [ libfprint_tod, libfprint_tod_private, - ] -) + ]) +deps += tod_dep pkgconfig = import('pkgconfig') pkgconfig.generate(libfprint_tod, From 447cd3f7bad41b9dc8ddba22b85f5c5240e8a202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 3 Mar 2021 19:35:16 +0100 Subject: [PATCH 02/32] fpi-assemping: Do not include unneeded headers and do not use absolute search paths --- libfprint/fpi-assembling.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libfprint/fpi-assembling.h b/libfprint/fpi-assembling.h index 6e1b7071..b56aa26e 100644 --- a/libfprint/fpi-assembling.h +++ b/libfprint/fpi-assembling.h @@ -19,7 +19,7 @@ #pragma once -#include +#include "fp-image.h" /** * fpi_frame: From e5e999de2c7c9b8b0d2beaa06afb2823bc2c9ebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 21:43:18 +0200 Subject: [PATCH 03/32] fpi-image: Add missing padding This breaks the ABI with such TOD drivers, but we don't have any using an image device so far, so it's a safe break. --- libfprint/fpi-image.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libfprint/fpi-image.h b/libfprint/fpi-image.h index 3554bb7b..0ae19f9f 100644 --- a/libfprint/fpi-image.h +++ b/libfprint/fpi-image.h @@ -68,6 +68,8 @@ struct _FpImage GPtrArray *minutiae; guint ref_count; + + gpointer _padding_dummy[32]; }; gint fpi_std_sq_dev (const guint8 *buf, From 58756ab62e12a41b0c70ac91cf44f266f0784f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 22:09:09 +0200 Subject: [PATCH 04/32] tests: Ensure that we don't break ABI with expected TODv1 structures We can check whether each relevant structure element has not changed and that the supported enum and flag values didn't change value. --- tests/meson.build | 14 ++ tests/test-fp-todv1-types.c | 228 ++++++++++++++++++++++ tests/tod-drivers/base-fp-device.h | 51 +++++ tests/tod-drivers/base-fp-print.h | 57 ++++++ tests/tod-drivers/base-fpi-device.h | 97 +++++++++ tests/tod-drivers/base-fpi-image-device.h | 83 ++++++++ tests/tod-drivers/base-fpi-usb.h | 81 ++++++++ 7 files changed, 611 insertions(+) create mode 100644 tests/test-fp-todv1-types.c create mode 100644 tests/tod-drivers/base-fp-device.h create mode 100644 tests/tod-drivers/base-fp-print.h create mode 100644 tests/tod-drivers/base-fpi-device.h create mode 100644 tests/tod-drivers/base-fpi-image-device.h create mode 100644 tests/tod-drivers/base-fpi-usb.h diff --git a/tests/meson.build b/tests/meson.build index 492502e4..cfba1c25 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -242,11 +242,24 @@ if get_option('tod') install: false ) + fp_todv1_enums = gnome.mkenums_simple('fp-todv1-enums', + source_dir: 'tod-drivers', + sources: [ + 'tod-drivers/base-fp-device.h', + 'tod-drivers/base-fp-print.h', + 'tod-drivers/base-fpi-device.h', + 'tod-drivers/base-fpi-image-device.h', + 'tod-drivers/base-fpi-usb.h', + ], + install_header: false) + test_utils_tod = static_library('fprint-test-utils-tod', sources: [ 'test-utils.c', 'test-utils-tod.c', + fp_todv1_enums, ], + include_directories: 'tod-drivers', dependencies: libfprint_private_dep, install: false) @@ -254,6 +267,7 @@ if get_option('tod') 'fp-context-tod', 'fp-device-tod', 'fpi-device', + 'fp-todv1-types', ] tod_dirs = { diff --git a/tests/test-fp-todv1-types.c b/tests/test-fp-todv1-types.c new file mode 100644 index 00000000..2f29b49c --- /dev/null +++ b/tests/test-fp-todv1-types.c @@ -0,0 +1,228 @@ +/* + * FpDevice Unit tests + * Copyright (C) 2021 Marco Trevisan + * + * 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 "drivers_api.h" +#include "fp-todv1-enums.h" + +#include "tod-drivers/base-fp-device.h" +#include "tod-drivers/base-fp-print.h" +#include "tod-drivers/base-fpi-device.h" +#include "tod-drivers/base-fpi-image-device.h" +#include "tod-drivers/base-fpi-usb.h" + +static void +check_enum_compatibility (GType old_type, GType current_type) +{ + g_autoptr(GEnumClass) old_class = g_type_class_ref (old_type); + g_autoptr(GEnumClass) current_class = g_type_class_ref (current_type); + int i; + + g_debug ("Checking Enum %s", g_type_name (current_type)); + + for (i = 0; g_enum_get_value (old_class, i); ++i) + { + GEnumValue *old_value = g_enum_get_value (old_class, i); + GEnumValue *current_value = g_enum_get_value_by_nick (current_class, + old_value->value_nick); + + g_debug (" .. %s", old_value->value_nick); + g_assert_nonnull (current_value); + g_assert_cmpuint (old_value->value, ==, current_value->value); + } +} + +static void +check_flags_compatibility (GType old_type, GType current_type) +{ + g_autoptr(GFlagsClass) old_class = g_type_class_ref (old_type); + g_autoptr(GFlagsClass) current_class = g_type_class_ref (current_type); + int i; + + g_debug ("Checking Flags %s", g_type_name (current_type)); + + for (i = 0; i < old_class->n_values; ++i) + { + GFlagsValue *old_value = &old_class->values[i]; + GFlagsValue *current_value = g_flags_get_value_by_nick (current_class, + old_value->value_nick); + + g_debug (" .. %s", old_value->value_nick); + g_assert_nonnull (current_value); + g_assert_cmpuint (old_value->value, ==, current_value->value); + } +} + +static void +check_compatiblity_auto (GType old_type, GType current_type) +{ + if (G_TYPE_IS_ENUM (old_type)) + return check_enum_compatibility (old_type, current_type); + + if (G_TYPE_IS_FLAGS (old_type)) + return check_flags_compatibility (old_type, current_type); + + g_assert_not_reached (); +} + +#define check_type_compatibility(type) \ + check_compatiblity_auto (type ## _TOD_V1, type) + +#define check_struct_size(type) \ + g_debug ("Checking " # type " size"); \ + g_assert_cmpuint (sizeof (type ## TODV1), ==, sizeof (type)) + +#define check_struct_member(type, member) \ + g_debug ("Checking " # type "'s " # member " offset"); \ + g_assert_cmpuint (G_STRUCT_OFFSET (type ## TODV1, member), ==, G_STRUCT_OFFSET (type, member)) + +static void +test_device_type (void) +{ + check_struct_size (FpIdEntry); + check_struct_size (FpDeviceClass); + + check_struct_member (FpIdEntry, virtual_envvar); + check_struct_member (FpIdEntry, driver_data); + + check_struct_member (FpDeviceClass, id); + check_struct_member (FpDeviceClass, full_name); + check_struct_member (FpDeviceClass, type); + check_struct_member (FpDeviceClass, id_table); + + check_struct_member (FpDeviceClass, nr_enroll_stages); + check_struct_member (FpDeviceClass, scan_type); + + check_struct_member (FpDeviceClass, usb_discover); + check_struct_member (FpDeviceClass, probe); + check_struct_member (FpDeviceClass, open); + check_struct_member (FpDeviceClass, close); + check_struct_member (FpDeviceClass, enroll); + check_struct_member (FpDeviceClass, verify); + check_struct_member (FpDeviceClass, identify); + check_struct_member (FpDeviceClass, capture); + check_struct_member (FpDeviceClass, list); + check_struct_member (FpDeviceClass, delete); + check_struct_member (FpDeviceClass, cancel); +} + +static void +test_image_device_private (void) +{ + check_struct_size (FpImage); + check_struct_size (FpImageDeviceClass); + + check_struct_member (FpImageDeviceClass, bz3_threshold); + check_struct_member (FpImageDeviceClass, img_width); + check_struct_member (FpImageDeviceClass, img_height); + check_struct_member (FpImageDeviceClass, img_open); + check_struct_member (FpImageDeviceClass, img_close); + check_struct_member (FpImageDeviceClass, activate); + check_struct_member (FpImageDeviceClass, change_state); + check_struct_member (FpImageDeviceClass, deactivate); +} + +static void +test_usb_private (void) +{ + check_struct_size (FpiUsbTransfer); + + check_struct_member (FpiUsbTransfer, device); + check_struct_member (FpiUsbTransfer, ssm); + check_struct_member (FpiUsbTransfer, length); + check_struct_member (FpiUsbTransfer, actual_length); + check_struct_member (FpiUsbTransfer, buffer); + check_struct_member (FpiUsbTransfer, ref_count); + check_struct_member (FpiUsbTransfer, type); + check_struct_member (FpiUsbTransfer, endpoint); + check_struct_member (FpiUsbTransfer, direction); + check_struct_member (FpiUsbTransfer, request_type); + check_struct_member (FpiUsbTransfer, recipient); + check_struct_member (FpiUsbTransfer, request); + check_struct_member (FpiUsbTransfer, value); + check_struct_member (FpiUsbTransfer, idx); + check_struct_member (FpiUsbTransfer, short_is_error); + check_struct_member (FpiUsbTransfer, user_data); + check_struct_member (FpiUsbTransfer, callback); + check_struct_member (FpiUsbTransfer, free_buffer); +} + +static void +test_device_public_enums (void) +{ + check_type_compatibility (FP_TYPE_DEVICE_TYPE); + check_type_compatibility (FP_TYPE_SCAN_TYPE); + check_type_compatibility (FP_TYPE_DEVICE_RETRY); + check_type_compatibility (FP_TYPE_DEVICE_ERROR); +} + +static void +test_device_private_enums (void) +{ + check_type_compatibility (FPI_TYPE_DEVICE_ACTION); +} + +static void +test_print_public_enums (void) +{ + check_type_compatibility (FP_TYPE_FINGER); + check_type_compatibility (FP_TYPE_FINGER_STATUS_FLAGS); +} + +static void +test_print_private_enums (void) +{ + check_type_compatibility (FPI_TYPE_PRINT_TYPE); + check_type_compatibility (FPI_TYPE_MATCH_RESULT); +} + +static void +test_image_device_enums (void) +{ + check_type_compatibility (FPI_TYPE_IMAGE_FLAGS); + check_type_compatibility (FPI_TYPE_IMAGE_DEVICE_STATE); +} + +static void +test_usb_enums (void) +{ + check_type_compatibility (FPI_TYPE_TRANSFER_TYPE); +} + +int +main (int argc, char *argv[]) +{ + if (!strstr (g_getenv ("FP_TOD_TEST_DRIVER_NAME"), "v1")) + return 77; + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/type/device/private", test_device_type); + g_test_add_func ("/type/device/enums", test_device_public_enums); + g_test_add_func ("/type/device/private/enums", test_device_private_enums); + g_test_add_func ("/type/print/enums", test_print_public_enums); + g_test_add_func ("/type/print/private/enums", test_print_private_enums); + g_test_add_func ("/type/image-device/private", test_image_device_private); + g_test_add_func ("/type/image-device/enums", test_image_device_enums); + g_test_add_func ("/type/usb/private", test_usb_private); + g_test_add_func ("/type/usb/enums", test_usb_enums); + + return g_test_run (); +} diff --git a/tests/tod-drivers/base-fp-device.h b/tests/tod-drivers/base-fp-device.h new file mode 100644 index 00000000..2eaff419 --- /dev/null +++ b/tests/tod-drivers/base-fp-device.h @@ -0,0 +1,51 @@ +/* + * FpDevice - A fingerprint reader device + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +typedef struct _FpDevice FpDevice; + +typedef enum { + FP_DEVICE_TYPE_TODV1_VIRTUAL, + FP_DEVICE_TYPE_TODV1_USB, +} FpDeviceTypeTODV1; + +typedef enum { + FP_SCAN_TYPE_TODV1_SWIPE, + FP_SCAN_TYPE_TODV1_PRESS, +} FpScanTypeTODV1; + +typedef enum { + FP_DEVICE_RETRY_TODV1_GENERAL, + FP_DEVICE_RETRY_TODV1_TOO_SHORT, + FP_DEVICE_RETRY_TODV1_CENTER_FINGER, + FP_DEVICE_RETRY_TODV1_REMOVE_FINGER, +} FpDeviceRetryTODV1; + +typedef enum { + FP_DEVICE_ERROR_TODV1_GENERAL, + FP_DEVICE_ERROR_TODV1_NOT_SUPPORTED, + FP_DEVICE_ERROR_TODV1_NOT_OPEN, + FP_DEVICE_ERROR_TODV1_ALREADY_OPEN, + FP_DEVICE_ERROR_TODV1_BUSY, + FP_DEVICE_ERROR_TODV1_PROTO, + FP_DEVICE_ERROR_TODV1_DATA_INVALID, + FP_DEVICE_ERROR_TODV1_DATA_NOT_FOUND, + FP_DEVICE_ERROR_TODV1_DATA_FULL, +} FpDeviceErrorTODV1; diff --git a/tests/tod-drivers/base-fp-print.h b/tests/tod-drivers/base-fp-print.h new file mode 100644 index 00000000..787820c9 --- /dev/null +++ b/tests/tod-drivers/base-fp-print.h @@ -0,0 +1,57 @@ +/* + * FpDevice - A fingerprint reader device + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +typedef enum { + FP_FINGER_TODV1_UNKNOWN = 0, + FP_FINGER_TODV1_LEFT_THUMB, + FP_FINGER_TODV1_LEFT_INDEX, + FP_FINGER_TODV1_LEFT_MIDDLE, + FP_FINGER_TODV1_LEFT_RING, + FP_FINGER_TODV1_LEFT_LITTLE, + FP_FINGER_TODV1_RIGHT_THUMB, + FP_FINGER_TODV1_RIGHT_INDEX, + FP_FINGER_TODV1_RIGHT_MIDDLE, + FP_FINGER_TODV1_RIGHT_RING, + FP_FINGER_TODV1_RIGHT_LITTLE, + + FP_FINGER_TODV1_FIRST = FP_FINGER_TODV1_LEFT_THUMB, + FP_FINGER_TODV1_LAST = FP_FINGER_TODV1_RIGHT_LITTLE, +} FpFingerTODV1; + +typedef enum { + FP_FINGER_STATUS_TODV1_NONE = 0, + FP_FINGER_STATUS_TODV1_NEEDED = 1 << 0, + FP_FINGER_STATUS_TODV1_PRESENT = 1 << 1, +} FpFingerStatusFlagsTODV1; + +/* Private flags */ + +typedef enum { + FPI_PRINT_TODV1_UNDEFINED = 0, + FPI_PRINT_TODV1_RAW, + FPI_PRINT_TODV1_NBIS, +} FpiPrintTypeTODV1; + +typedef enum { + FPI_MATCH_TODV1_ERROR = -1, + FPI_MATCH_TODV1_FAIL, + FPI_MATCH_TODV1_SUCCESS, +} FpiMatchResultTODV1; diff --git a/tests/tod-drivers/base-fpi-device.h b/tests/tod-drivers/base-fpi-device.h new file mode 100644 index 00000000..59bff3e9 --- /dev/null +++ b/tests/tod-drivers/base-fpi-device.h @@ -0,0 +1,97 @@ +/* + * FpDevice - A fingerprint reader device + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +#include +#include + +#include "base-fp-device.h" + +typedef struct _GUsbDevice GUsbDevice; + +typedef struct _FpIdEntryTODV1 FpIdEntryTODV1; + +struct _FpIdEntryTODV1 +{ + union + { + struct + { + guint pid; + guint vid; + }; + const gchar *virtual_envvar; + }; + guint64 driver_data; + + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[16]; +}; + +struct _FpDeviceClassTODV1 +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* Static information about the driver. */ + const gchar *id; + const gchar *full_name; + FpDeviceTypeTODV1 type; + const FpIdEntryTODV1 *id_table; + + /* Defaults for device properties */ + gint nr_enroll_stages; + FpScanTypeTODV1 scan_type; + + /* Callbacks */ + gint (*usb_discover) (GUsbDevice *usb_device); + void (*probe) (FpDevice *device); + void (*open) (FpDevice *device); + void (*close) (FpDevice *device); + void (*enroll) (FpDevice *device); + void (*verify) (FpDevice *device); + void (*identify) (FpDevice *device); + void (*capture) (FpDevice *device); + void (*list) (FpDevice *device); + void (*delete) (FpDevice * device); + + void (*cancel) (FpDevice *device); + + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[32]; +}; + +typedef struct _FpDeviceClassTODV1 FpDeviceClassTODV1; + +typedef enum { + FPI_DEVICE_ACTION_TODV1_NONE = 0, + FPI_DEVICE_ACTION_TODV1_PROBE, + FPI_DEVICE_ACTION_TODV1_OPEN, + FPI_DEVICE_ACTION_TODV1_CLOSE, + FPI_DEVICE_ACTION_TODV1_ENROLL, + FPI_DEVICE_ACTION_TODV1_VERIFY, + FPI_DEVICE_ACTION_TODV1_IDENTIFY, + FPI_DEVICE_ACTION_TODV1_CAPTURE, + FPI_DEVICE_ACTION_TODV1_LIST, + FPI_DEVICE_ACTION_TODV1_DELETE, +} FpiDeviceActionTODV1; diff --git a/tests/tod-drivers/base-fpi-image-device.h b/tests/tod-drivers/base-fpi-image-device.h new file mode 100644 index 00000000..f034dd14 --- /dev/null +++ b/tests/tod-drivers/base-fpi-image-device.h @@ -0,0 +1,83 @@ +/* + * FpImageDevice - An image based fingerprint reader device + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +#include "base-fpi-device.h" + +typedef struct _FpImageDevice FpImageDevice; + +typedef enum { + FPI_IMAGE_DEVICE_STATE_TODV1_INACTIVE, + FPI_IMAGE_DEVICE_STATE_TODV1_AWAIT_FINGER_ON, + FPI_IMAGE_DEVICE_STATE_TODV1_CAPTURE, + FPI_IMAGE_DEVICE_STATE_TODV1_AWAIT_FINGER_OFF, +} FpiImageDeviceStateTODV1; + +typedef struct _FpImageDeviceClassTODV1 +{ + FpDeviceClassTODV1 parent_class; + + gint bz3_threshold; + gint img_width; + gint img_height; + + void (*img_open)(FpImageDevice *dev); + void (*img_close)(FpImageDevice *dev); + void (*activate)(FpImageDevice *dev); + void (*change_state)(FpImageDevice *dev, + FpiImageDeviceStateTODV1 state); + void (*deactivate)(FpImageDevice *dev); + + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[32]; +} FpImageDeviceClassTODV1; + +/* fpi-image */ + +typedef enum { + FPI_IMAGE_TODV1_V_FLIPPED = 1 << 0, + FPI_IMAGE_TODV1_H_FLIPPED = 1 << 1, + FPI_IMAGE_TODV1_COLORS_INVERTED = 1 << 2, + FPI_IMAGE_TODV1_PARTIAL = 1 << 3, +} FpiImageFlagsTODV1; + +typedef struct _FpImageTODV1 +{ + /*< private >*/ + GObject parent; + + /*< public >*/ + guint width; + guint height; + + gdouble ppmm; + + FpiImageFlagsTODV1 flags; + + /*< private >*/ + guint8 *data; + guint8 *binarized; + + GPtrArray *minutiae; + guint ref_count; + + gpointer _padding_dummy[32]; +} FpImageTODV1; diff --git a/tests/tod-drivers/base-fpi-usb.h b/tests/tod-drivers/base-fpi-usb.h new file mode 100644 index 00000000..c3d6862d --- /dev/null +++ b/tests/tod-drivers/base-fpi-usb.h @@ -0,0 +1,81 @@ +/* + * FpDevice - A fingerprint reader device + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +#include + +#include "base-fpi-device.h" + +typedef struct _FpiUsbTransferTODV1 FpiUsbTransferTODV1; +typedef struct _FpiSsm FpiSsm; + +typedef void (*FpiUsbTransferCallbackTODV1)(FpiUsbTransferTODV1 *transfer, + FpDevice *dev, + gpointer user_data, + GError *error); + +typedef enum { + FP_TRANSFER_TODV1_NONE = -1, + FP_TRANSFER_TODV1_CONTROL = 0, + FP_TRANSFER_TODV1_BULK = 2, + FP_TRANSFER_TODV1_INTERRUPT = 3, +} FpiTransferTypeTODV1; + +struct _FpiUsbTransferTODV1 +{ + /*< public >*/ + FpDevice *device; + + FpiSsm *ssm; + + gssize length; + gssize actual_length; + + guchar *buffer; + + /*< private >*/ + guint ref_count; + + /* USB Transfer information */ + FpiTransferTypeTODV1 type; + guint8 endpoint; + + /* Control Transfer options */ + GUsbDeviceDirection direction; + GUsbDeviceRequestType request_type; + GUsbDeviceRecipient recipient; + guint8 request; + guint16 value; + guint16 idx; + + /* Flags */ + gboolean short_is_error; + + /* Callbacks */ + gpointer user_data; + FpiUsbTransferCallbackTODV1 callback; + + /* Data free function */ + GDestroyNotify free_buffer; + + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[32]; +}; From eb329903b452386985a615fae458c91a7bcf80eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 14:48:06 +0200 Subject: [PATCH 05/32] test-fp-device-tod: Ignore deprecated functions and use new ones --- tests/test-fp-device-tod.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/test-fp-device-tod.c b/tests/test-fp-device-tod.c index d134d1e1..f3d45cb1 100644 --- a/tests/test-fp-device-tod.c +++ b/tests/test-fp-device-tod.c @@ -193,7 +193,10 @@ test_device_supports_identify (void) g_autoptr(FptContext) tctx = fpt_context_new_with_fake_dev (); fp_device_open_sync (tctx->device, NULL, NULL); - g_assert_true (fp_device_supports_identify (tctx->device)); + g_assert_true (fp_device_has_feature (tctx->device, FP_DEVICE_FEATURE_IDENTIFY)); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_assert_true (fp_device_supports_identify (tctx->device)); + G_GNUC_END_IGNORE_DEPRECATIONS } static void @@ -202,7 +205,10 @@ test_device_supports_capture (void) g_autoptr(FptContext) tctx = fpt_context_new_with_fake_dev (); fp_device_open_sync (tctx->device, NULL, NULL); - g_assert_true (fp_device_supports_capture (tctx->device)); + g_assert_true (fp_device_has_feature (tctx->device, FP_DEVICE_FEATURE_CAPTURE)); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_assert_true (fp_device_supports_capture (tctx->device)); + G_GNUC_END_IGNORE_DEPRECATIONS } static void @@ -211,7 +217,10 @@ test_device_has_storage (void) g_autoptr(FptContext) tctx = fpt_context_new_with_fake_dev (); fp_device_open_sync (tctx->device, NULL, NULL); - g_assert_true (fp_device_has_storage (tctx->device)); + g_assert_true (fp_device_has_feature (tctx->device, FP_DEVICE_FEATURE_STORAGE)); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_assert_true (fp_device_has_storage (tctx->device)); + G_GNUC_END_IGNORE_DEPRECATIONS } int From c906b30cba8dd25814812bd6d9e261c398ef991b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 14:55:04 +0200 Subject: [PATCH 06/32] tod: Add support for device features, keeping ABI compatibility --- libfprint/fpi-device.h | 6 ++++-- libfprint/tod/tod-shared-loader.c | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libfprint/fpi-device.h b/libfprint/fpi-device.h index 3e861a8e..dcb2a42d 100644 --- a/libfprint/fpi-device.h +++ b/libfprint/fpi-device.h @@ -139,7 +139,6 @@ struct _FpDeviceClass const gchar *full_name; FpDeviceType type; const FpIdEntry *id_table; - FpDeviceFeature features; /* Defaults for device properties */ gint nr_enroll_stages; @@ -159,9 +158,12 @@ struct _FpDeviceClass void (*cancel) (FpDevice *device); + /* Class elements added after tod-v1 */ + FpDeviceFeature features; + /*< private >*/ /* padding for future expansion */ - gpointer _padding_dummy[32]; + gpointer _padding_dummy[31]; }; void fpi_device_class_auto_initialize_features (FpDeviceClass *device_class); diff --git a/libfprint/tod/tod-shared-loader.c b/libfprint/tod/tod-shared-loader.c index 3fb04209..d214aebb 100644 --- a/libfprint/tod/tod-shared-loader.c +++ b/libfprint/tod/tod-shared-loader.c @@ -127,6 +127,12 @@ fpi_tod_shared_drivers_register (void) fp_dbg ("Loading driver %s (%s)", cls->id, cls->full_name); g_array_append_val (shared_drivers, driver); + if (cls->features == FP_DEVICE_FEATURE_NONE) + { + g_debug ("Initializing features for driver %s", cls->id); + fpi_device_class_auto_initialize_features (cls); + } + shared_modules = g_list_prepend (shared_modules, g_steal_pointer (&module)); } From 344d5cb2a9cc60d017c8823a66f650d52bd93ecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 15:40:06 +0200 Subject: [PATCH 07/32] fpi-device: Reduce padding on FpIdEntry to make space to new elements --- libfprint/fpi-device.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libfprint/fpi-device.h b/libfprint/fpi-device.h index dcb2a42d..9bce196e 100644 --- a/libfprint/fpi-device.h +++ b/libfprint/fpi-device.h @@ -55,6 +55,12 @@ struct _FpIdEntry guint vid; }; const gchar *virtual_envvar; + }; + guint64 driver_data; + + /* Elements added after TODv1 */ + union + { struct { FpiDeviceUdevSubtypeFlags udev_types; @@ -66,11 +72,10 @@ struct _FpIdEntry } hid_id; }; }; - guint64 driver_data; /*< private >*/ /* padding for future expansion */ - gpointer _padding_dummy[16]; + gpointer _padding_dummy[13]; }; /** From a79a8d0e221e47d7df97f4d37b67bcba3312f9f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 15:16:23 +0200 Subject: [PATCH 08/32] device: Keep device type ordering as default --- libfprint/fp-device.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libfprint/fp-device.h b/libfprint/fp-device.h index 603ffdce..34b5b8a5 100644 --- a/libfprint/fp-device.h +++ b/libfprint/fp-device.h @@ -43,8 +43,8 @@ G_DECLARE_DERIVABLE_TYPE (FpDevice, fp_device, FP, DEVICE, GObject) */ typedef enum { FP_DEVICE_TYPE_VIRTUAL, - FP_DEVICE_TYPE_UDEV, FP_DEVICE_TYPE_USB, + FP_DEVICE_TYPE_UDEV, } FpDeviceType; /** From 1d7a561b0b73c261a6d1df700b5ff3795c726e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 15:16:45 +0200 Subject: [PATCH 09/32] tod-inspector: Add support reading features --- examples/tod-inspector.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/tod-inspector.c b/examples/tod-inspector.c index 4c2eafaf..e2012fdd 100644 --- a/examples/tod-inspector.c +++ b/examples/tod-inspector.c @@ -49,7 +49,7 @@ id_table_to_string (FpDeviceType device_type, } else { - return g_strdup ("Unsupported"); + return g_strdup ("Unsupported device type"); } if (!value) @@ -105,8 +105,10 @@ main (void) GType driver = g_array_index (shared_drivers, GType, i); g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver); g_autofree char *id_table = NULL; + g_autofree char *features = NULL; id_table = id_table_to_string (cls->type, cls->id_table); + features = g_flags_to_string (fp_device_feature_get_type (), cls->features); g_print ("ID: %s\n", cls->id); g_print ("Full Name: %s\n", cls->full_name); @@ -114,6 +116,7 @@ main (void) g_print ("Enroll stages: %d\n", cls->nr_enroll_stages); g_print ("Scan type: %s\n", scan_type_to_string (cls->scan_type)); g_print ("Supported Devices: %s\n", id_table); + g_print ("Supported features: %s\n", features); g_print ("Implemented VFuncs:\n"); g_print (" usb_discover: %s\n", cls->usb_discover ? "true" : "false"); g_print (" probe: %s\n", cls->probe ? "true" : "false"); From 18b3acdfb084371482984cf2abc01a0a780e7f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 22:32:01 +0200 Subject: [PATCH 10/32] fpi-spi-transfer: Add structure padding --- libfprint/fpi-spi-transfer.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libfprint/fpi-spi-transfer.h b/libfprint/fpi-spi-transfer.h index 755b405f..0b75673b 100644 --- a/libfprint/fpi-spi-transfer.h +++ b/libfprint/fpi-spi-transfer.h @@ -73,6 +73,9 @@ struct _FpiSpiTransfer /* Data free function */ GDestroyNotify free_buffer_wr; GDestroyNotify free_buffer_rd; + + /* padding for future expansion */ + gpointer _padding_dummy[32]; }; GType fpi_spi_transfer_get_type (void) G_GNUC_CONST; From 81ecee3ead7ec9068858ea6f8ba73b490b73425e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 22:33:17 +0200 Subject: [PATCH 11/32] tests/tod-drivers: Add newly supported types --- tests/meson.build | 1 + tests/test-fp-todv1-types.c | 23 +++++++++++ tests/tod-drivers/base-fpi-device.h | 17 ++++++++ tests/tod-drivers/base-fpi-spi.h | 60 +++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 tests/tod-drivers/base-fpi-spi.h diff --git a/tests/meson.build b/tests/meson.build index 5b3d0fe3..9f9ad59f 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -251,6 +251,7 @@ if get_option('tod') 'tod-drivers/base-fp-print.h', 'tod-drivers/base-fpi-device.h', 'tod-drivers/base-fpi-image-device.h', + 'tod-drivers/base-fpi-spi.h', 'tod-drivers/base-fpi-usb.h', ], install_header: false) diff --git a/tests/test-fp-todv1-types.c b/tests/test-fp-todv1-types.c index 2f29b49c..654b0d6b 100644 --- a/tests/test-fp-todv1-types.c +++ b/tests/test-fp-todv1-types.c @@ -26,6 +26,7 @@ #include "tod-drivers/base-fp-print.h" #include "tod-drivers/base-fpi-device.h" #include "tod-drivers/base-fpi-image-device.h" +#include "tod-drivers/base-fpi-spi.h" #include "tod-drivers/base-fpi-usb.h" static void @@ -164,6 +165,25 @@ test_usb_private (void) check_struct_member (FpiUsbTransfer, free_buffer); } +static void +test_spi_private (void) +{ + check_struct_size (FpiSpiTransfer); + + check_struct_member (FpiSpiTransfer, device); + check_struct_member (FpiSpiTransfer, ssm); + check_struct_member (FpiSpiTransfer, length_wr); + check_struct_member (FpiSpiTransfer, length_rd); + check_struct_member (FpiSpiTransfer, buffer_wr); + check_struct_member (FpiSpiTransfer, buffer_rd); + check_struct_member (FpiSpiTransfer, ref_count); + check_struct_member (FpiSpiTransfer, spidev_fd); + check_struct_member (FpiSpiTransfer, user_data); + check_struct_member (FpiSpiTransfer, callback); + check_struct_member (FpiSpiTransfer, free_buffer_wr); + check_struct_member (FpiSpiTransfer, free_buffer_rd); +} + static void test_device_public_enums (void) { @@ -171,6 +191,8 @@ test_device_public_enums (void) check_type_compatibility (FP_TYPE_SCAN_TYPE); check_type_compatibility (FP_TYPE_DEVICE_RETRY); check_type_compatibility (FP_TYPE_DEVICE_ERROR); + check_type_compatibility (FP_TYPE_DEVICE_FEATURE); + check_type_compatibility (FPI_TYPE_DEVICE_UDEV_SUBTYPE_FLAGS); } static void @@ -223,6 +245,7 @@ main (int argc, char *argv[]) g_test_add_func ("/type/image-device/enums", test_image_device_enums); g_test_add_func ("/type/usb/private", test_usb_private); g_test_add_func ("/type/usb/enums", test_usb_enums); + g_test_add_func ("/type/spi/private", test_spi_private); return g_test_run (); } diff --git a/tests/tod-drivers/base-fpi-device.h b/tests/tod-drivers/base-fpi-device.h index 59bff3e9..ab296ff4 100644 --- a/tests/tod-drivers/base-fpi-device.h +++ b/tests/tod-drivers/base-fpi-device.h @@ -95,3 +95,20 @@ typedef enum { FPI_DEVICE_ACTION_TODV1_LIST, FPI_DEVICE_ACTION_TODV1_DELETE, } FpiDeviceActionTODV1; + +typedef enum /*< flags >*/ { + FP_DEVICE_FEATURE_TODV1_NONE = 0, + FP_DEVICE_FEATURE_TODV1_CAPTURE = 1 << 0, + FP_DEVICE_FEATURE_TODV1_IDENTIFY = 1 << 1, + FP_DEVICE_FEATURE_TODV1_VERIFY = 1 << 2, + FP_DEVICE_FEATURE_TODV1_STORAGE = 1 << 3, + FP_DEVICE_FEATURE_TODV1_STORAGE_LIST = 1 << 4, + FP_DEVICE_FEATURE_TODV1_STORAGE_DELETE = 1 << 5, + FP_DEVICE_FEATURE_TODV1_STORAGE_CLEAR = 1 << 6, + FP_DEVICE_FEATURE_TODV1_DUPLICATES_CHECK = 1 << 7, +} FpDeviceFeatureTODV1; + +typedef enum { + FPI_DEVICE_UDEV_SUBTYPE_TODV1_SPIDEV = 1 << 0, + FPI_DEVICE_UDEV_SUBTYPE_TODV1_HIDRAW = 1 << 1, +} FpiDeviceUdevSubtypeFlagsTODV1; diff --git a/tests/tod-drivers/base-fpi-spi.h b/tests/tod-drivers/base-fpi-spi.h new file mode 100644 index 00000000..9045816e --- /dev/null +++ b/tests/tod-drivers/base-fpi-spi.h @@ -0,0 +1,60 @@ +/* + * FpDevice - A fingerprint reader device + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +#include "base-fpi-device.h" + +typedef struct _FpiSpiTransferTODV1 FpiSpiTransferTODV1; +typedef struct _FpiSsm FpiSsm; + +typedef void (*FpiSpiTransferCallbackTODV1)(FpiSpiTransferTODV1 *transfer, + FpDevice *dev, + gpointer user_data, + GError *error); + +struct _FpiSpiTransferTODV1 +{ + /*< public >*/ + FpDevice *device; + + FpiSsm *ssm; + + gssize length_wr; + gssize length_rd; + + guchar *buffer_wr; + guchar *buffer_rd; + + /*< private >*/ + guint ref_count; + + int spidev_fd; + + /* Callbacks */ + gpointer user_data; + FpiSpiTransferCallbackTODV1 callback; + + /* Data free function */ + GDestroyNotify free_buffer_wr; + GDestroyNotify free_buffer_rd; + + /* padding for future expansion */ + gpointer _padding_dummy[32]; +}; From 00128e11fdedce3cc52a12c3095786d8d5b0cefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 13 Apr 2021 15:45:58 +0200 Subject: [PATCH 12/32] README: Link to TOD README file --- README | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README b/README index fbf76705..29846596 100644 --- a/README +++ b/README @@ -39,6 +39,10 @@ We include bozorth3 from the US export controlled distribution. We have determined that it is fine to ship bozorth3 in an open source project, see https://fprint.freedesktop.org/us-export-control.html +## TOD Informations + +See https://gitlab.freedesktop.org/3v1n0/libfprint/-/blob/tod/README.tod.md + ## Historical links Older versions of libfprint are available at: From 35bcd4326cb7222ae922dec587fbe6386849b400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 14 Apr 2021 17:51:38 +0200 Subject: [PATCH 13/32] libfprint-tod.ver: Add new symbols to newer TOD subversion This should be something to do every time, as it may allow to define multiple symbol versions, if something changes upstream. --- libfprint/tod/libfprint-tod.ver | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libfprint/tod/libfprint-tod.ver b/libfprint/tod/libfprint-tod.ver index d18569f1..03879411 100644 --- a/libfprint/tod/libfprint-tod.ver +++ b/libfprint/tod/libfprint-tod.ver @@ -4,3 +4,12 @@ global: local: *; }; + +LIBFPRINT_TOD_1.0.1 { +global: + fpi_device_class_auto_initialize_features; + fpi_device_get_udev_data; + fpi_spi_*; + fpi_ssm_spi_*; + fpi_ssm_get_device; +} LIBFPRINT_TOD_1.0.0; From df36c66730f1087d2014400d140b57e9d3737e1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 14 Apr 2021 18:02:33 +0200 Subject: [PATCH 14/32] tod: Use dynamically defined version script So we don't have to manage the soname manually --- libfprint/tod/{libfprint-tod.ver => libfprint-tod.ver.in} | 6 +++--- libfprint/tod/meson.build | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) rename libfprint/tod/{libfprint-tod.ver => libfprint-tod.ver.in} (61%) diff --git a/libfprint/tod/libfprint-tod.ver b/libfprint/tod/libfprint-tod.ver.in similarity index 61% rename from libfprint/tod/libfprint-tod.ver rename to libfprint/tod/libfprint-tod.ver.in index 03879411..5b464908 100644 --- a/libfprint/tod/libfprint-tod.ver +++ b/libfprint/tod/libfprint-tod.ver.in @@ -1,15 +1,15 @@ -LIBFPRINT_TOD_1.0.0 { +LIBFPRINT_TOD_@tod_soversion@.0.0 { global: fpi_*; local: *; }; -LIBFPRINT_TOD_1.0.1 { +LIBFPRINT_TOD_@tod_soversion@.0.1 { global: fpi_device_class_auto_initialize_features; fpi_device_get_udev_data; fpi_spi_*; fpi_ssm_spi_*; fpi_ssm_get_device; -} LIBFPRINT_TOD_1.0.0; +} LIBFPRINT_TOD_@tod_soversion@.0.0; diff --git a/libfprint/tod/meson.build b/libfprint/tod/meson.build index 406b69de..d7c6d872 100644 --- a/libfprint/tod/meson.build +++ b/libfprint/tod/meson.build @@ -10,7 +10,11 @@ configure_file(output: 'tod-config.h', configuration: tod_conf) gmodule_dep = dependency('gmodule-2.0', version: '>=' + glib_min_version) deps += gmodule_dep -mapfile = files('libfprint-tod.ver') +mapfile = configure_file(input: 'libfprint-tod.ver.in', + output: 'libfprint-tod.ver', + configuration: { + 'tod_soversion' : tod_soversion, +}) libfprint_tod_private = static_library('fprint-tod-private', sources: [ @@ -34,7 +38,7 @@ libfprint_tod = library(versioned_libname.split('lib')[1] + '-tod', soversion: tod_soversion, include_directories: include_directories('..'), link_args: [ - '-Wl,--version-script,@0@/@1@'.format(meson.source_root(), mapfile[0]), + '-Wl,--version-script,@0@'.format(mapfile), '-Wl,--unresolved-symbols=ignore-in-object-files' ], link_depends: mapfile, From 2d20c6a8f27537c5cdfc737e7f504b04d83520e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 28 Aug 2021 03:04:30 +0200 Subject: [PATCH 15/32] fpi-device: Ensure FpDeviceClass is still compatible with TODv1 ABI Tests are ensuring it, adapt internal tests to ignore new features when using old drivers --- libfprint/fpi-device.h | 17 ++-- tests/test-device-fake.h | 10 +-- tests/test-fpi-device.c | 170 +++++++++++++++++++++++++++++++++------ 3 files changed, 161 insertions(+), 36 deletions(-) diff --git a/libfprint/fpi-device.h b/libfprint/fpi-device.h index ca52e1bc..f43d3433 100644 --- a/libfprint/fpi-device.h +++ b/libfprint/fpi-device.h @@ -161,10 +161,6 @@ struct _FpDeviceClass gint nr_enroll_stages; FpScanType scan_type; - /* Simple device temperature model constants */ - gint32 temp_hot_seconds; - gint32 temp_cold_seconds; - /* Callbacks */ gint (*usb_discover) (GUsbDevice *usb_device); void (*probe) (FpDevice *device); @@ -176,18 +172,23 @@ struct _FpDeviceClass void (*capture) (FpDevice *device); void (*list) (FpDevice *device); void (*delete) (FpDevice * device); - void (*clear_storage) (FpDevice * device); void (*cancel) (FpDevice *device); - void (*suspend) (FpDevice *device); - void (*resume) (FpDevice *device); /* Class elements added after tod-v1 */ FpDeviceFeature features; + /* Simple device temperature model constants */ + gint32 temp_hot_seconds; + gint32 temp_cold_seconds; + + void (*clear_storage) (FpDevice * device); + void (*suspend) (FpDevice *device); + void (*resume) (FpDevice *device); + /*< private >*/ /* padding for future expansion */ - gpointer _padding_dummy[31]; + gpointer _padding_dummy[27]; }; void fpi_device_class_auto_initialize_features (FpDeviceClass *device_class); diff --git a/tests/test-device-fake.h b/tests/test-device-fake.h index 7e14b478..e3782e34 100644 --- a/tests/test-device-fake.h +++ b/tests/test-device-fake.h @@ -32,8 +32,6 @@ struct _FpiDeviceFake gpointer last_called_function; gboolean return_action_error; - GCancellable *ext_cancellable; - GError *ret_error; FpPrint *ret_print; FpPrint *ret_match; @@ -41,12 +39,14 @@ struct _FpiDeviceFake FpImage *ret_image; GPtrArray *ret_list; - GError *ret_suspend; - GError *ret_resume; - gpointer action_data; gpointer user_data; + GCancellable *ext_cancellable; + + GError *ret_suspend; + GError *ret_resume; + FpDeviceFeature probe_features_update; FpDeviceFeature probe_features_value; }; diff --git a/tests/test-fpi-device.c b/tests/test-fpi-device.c index e3da1e97..c01456a3 100644 --- a/tests/test-fpi-device.c +++ b/tests/test-fpi-device.c @@ -48,6 +48,24 @@ fpt_context_device_driver_get_type (void) #endif +static gboolean +tod_is_v1_class (FpDeviceClass *device_class) +{ +#ifdef TEST_TOD_DRIVER + return g_str_has_suffix (device_class->id, "_tod_v1"); +#endif + return FALSE; +} + +static gboolean +tod_is_v1_device (FpDevice *device) +{ +#ifdef TEST_TOD_DRIVER + return tod_is_v1_class (FP_DEVICE_GET_CLASS (device)); +#endif + return FALSE; +} + /* Utility functions */ typedef FpDevice FpAutoCloseDevice; @@ -539,6 +557,12 @@ test_driver_features_probe_updates (void) FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device); FpiDeviceFake *fake_dev; + if (tod_is_v1_device (device)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + g_assert_cmpuint (dev_class->features, !=, FP_DEVICE_FEATURE_NONE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_CAPTURE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_IDENTIFY); @@ -592,7 +616,10 @@ test_driver_initial_features (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + if (!tod_is_v1_device (device)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); g_async_initable_init_async (G_ASYNC_INITABLE (device), G_PRIORITY_DEFAULT, NULL, NULL, NULL); @@ -606,7 +633,10 @@ test_driver_initial_features (void) g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE)); g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_LIST)); g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_DELETE)); - g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_CLEAR)); + if (!tod_is_v1_device (device)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); g_assert_cmpuint (fp_device_get_features (device), ==, @@ -616,7 +646,8 @@ test_driver_initial_features (void) FP_DEVICE_FEATURE_STORAGE | FP_DEVICE_FEATURE_STORAGE_LIST | FP_DEVICE_FEATURE_STORAGE_DELETE | - FP_DEVICE_FEATURE_STORAGE_CLEAR); + (tod_is_v1_device (device) ? + 0 : FP_DEVICE_FEATURE_STORAGE_CLEAR)); } static void @@ -663,7 +694,10 @@ test_driver_initial_features_no_capture (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + if (!tod_is_v1_class (dev_class)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); } static void @@ -684,7 +718,10 @@ test_driver_initial_features_no_verify (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + if (!tod_is_v1_class (dev_class)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); } static void @@ -705,7 +742,10 @@ test_driver_initial_features_no_identify (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + if (!tod_is_v1_class (dev_class)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); } static void @@ -726,7 +766,10 @@ test_driver_initial_features_no_storage (void) g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + if (!tod_is_v1_class (dev_class)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); } static void @@ -744,10 +787,16 @@ test_driver_initial_features_no_list (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_IDENTIFY); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_VERIFY); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_DUPLICATES_CHECK); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); + if (!tod_is_v1_class (dev_class)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + if (!tod_is_v1_class (dev_class)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); } static void @@ -768,7 +817,10 @@ test_driver_initial_features_no_delete (void) g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + if (!tod_is_v1_class (dev_class)) + g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); + else + g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); } static void @@ -2005,6 +2057,12 @@ test_driver_identify_suspend_continues (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; + if (tod_is_v1_class (dev_class)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL); fake_dev = FPI_DEVICE_FAKE (device); orig_identify = dev_class->identify; @@ -2071,6 +2129,12 @@ test_driver_identify_suspend_succeeds (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; + if (tod_is_v1_class (dev_class)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL); fake_dev = FPI_DEVICE_FAKE (device); orig_identify = dev_class->identify; @@ -2133,6 +2197,12 @@ test_driver_identify_suspend_busy_error (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; + if (tod_is_v1_class (dev_class)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL); fake_dev = FPI_DEVICE_FAKE (device); orig_identify = dev_class->identify; @@ -2190,6 +2260,12 @@ test_driver_identify_suspend_while_idle (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; + if (tod_is_v1_class (dev_class)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL); fake_dev = FPI_DEVICE_FAKE (device); @@ -2234,6 +2310,12 @@ test_driver_identify_warmup_cooldown (void) FpiDeviceFake *fake_dev; gint64 start_time; + if (tod_is_v1_class (dev_class)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + dev_class->temp_hot_seconds = 2; dev_class->temp_cold_seconds = 5; @@ -2532,6 +2614,12 @@ test_driver_clear_storage (void) FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); gboolean ret; + if (tod_is_v1_device (device)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + ret = fp_device_clear_storage_sync (device, NULL, &error); g_assert (fake_dev->last_called_function == dev_class->clear_storage); g_assert_no_error (error); @@ -2547,6 +2635,12 @@ test_driver_clear_storage_error (void) FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); gboolean ret; + if (tod_is_v1_device (device)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_GENERAL); ret = fp_device_clear_storage_sync (device, NULL, &error); g_assert (fake_dev->last_called_function == dev_class->clear_storage); @@ -2653,6 +2747,12 @@ test_driver_critical (void) void (*orig_verify) (FpDevice *device) = dev_class->verify; FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); + if (tod_is_v1_device (device)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + fake_dev->last_called_function = NULL; dev_class->verify = fake_device_stub_verify; @@ -2861,6 +2961,12 @@ test_driver_action_is_cancelled_open (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; + if (tod_is_v1_class (dev_class)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + dev_class->open = test_driver_action_is_cancelled_open_vfunc; device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL); fake_dev = FPI_DEVICE_FAKE (device); @@ -2881,6 +2987,12 @@ test_driver_action_internally_cancelled_open (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; + if (tod_is_v1_class (dev_class)) + { + g_test_skip ("Feature not supported by TODv1 interface"); + return; + } + dev_class->open = test_driver_action_is_cancelled_open_vfunc; device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL); fake_dev = FPI_DEVICE_FAKE (device); @@ -3030,11 +3142,20 @@ test_driver_action_error_all (void) g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID); g_clear_error (&error); - fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID); - g_assert_false (fp_device_clear_storage_sync (device, NULL, &error)); - g_assert_true (fake_dev->last_called_function == dev_class->clear_storage); - g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID); - g_clear_error (&error); + if (!tod_is_v1_device (device)) + { + fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID); + g_assert_false (fp_device_clear_storage_sync (device, NULL, &error)); + g_assert_true (fake_dev->last_called_function == dev_class->clear_storage); + g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID); + g_clear_error (&error); + } + else + { + g_assert_false (fp_device_clear_storage_sync (device, NULL, &error)); + g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + } /* Test close last, as we can't operate on a closed device. */ fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID); @@ -3135,15 +3256,18 @@ test_driver_action_error_fallback_all (void) g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); g_clear_error (&error); - g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, - "*Device failed to pass an error to generic action " - "error function*"); + if (!tod_is_v1_device (device)) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*Device failed to pass an error to generic action " + "error function*"); - g_assert_false (fp_device_clear_storage_sync (device, NULL, &error)); - g_test_assert_expected_messages (); - g_assert_true (fake_dev->last_called_function == dev_class->clear_storage); - g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); - g_clear_error (&error); + g_assert_false (fp_device_clear_storage_sync (device, NULL, &error)); + g_test_assert_expected_messages (); + g_assert_true (fake_dev->last_called_function == dev_class->clear_storage); + g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); + g_clear_error (&error); + } /* Test close last, as we can't operate on a closed device. */ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, From 4ed67f90846076fb9724f0dc54ad5d6ae792e1e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 2 Sep 2021 13:23:30 +0200 Subject: [PATCH 16/32] build: Use host machine family from meson --- tests/meson.build | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/meson.build b/tests/meson.build index 8e69622a..7106ff58 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -297,8 +297,7 @@ if get_option('tod') 'fake_test_dev_tod_current': meson.current_build_dir(), } - machine = run_command(meson.get_compiler('c'), '-dumpmachine').stdout().strip() - if machine.startswith('x86_64-') + if host_machine.cpu_family() == 'x86_64' tod_dirs += { 'fake_test_dev_tod_v1': meson.current_source_dir() / 'tod-drivers', } From 0a7473dce104a2704e4b09884df00c90e1538168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 2 Sep 2021 13:42:18 +0200 Subject: [PATCH 17/32] fpi-device: Do not include config.h in headers It should be included in files requiring it only. --- libfprint/fpi-device.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/libfprint/fpi-device.h b/libfprint/fpi-device.h index f43d3433..aba30b10 100644 --- a/libfprint/fpi-device.h +++ b/libfprint/fpi-device.h @@ -24,8 +24,6 @@ #include "fp-image.h" #include "fpi-print.h" -#include - /** * FpiDeviceUdevSubtype: * @FPI_DEVICE_UDEV_SUBTYPE_SPIDEV: The device requires an spidev node From 29b904b93d5b990a600a8dafbab5a6036744e8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 2 Sep 2021 13:32:57 +0200 Subject: [PATCH 18/32] tests: Add versions check on TOD drivers based on their IDs Recompile tod drivers using libfprint-tod-test-drivers project [1] so that we don't have to reorder the private driver structure, plus use a versioned driver ID and parse it to check whether a feature is supported for such TOD test driver. https://gitlab.freedesktop.org/3v1n0/libfprint-tod-test-drivers --- tests/meson.build | 30 +++- tests/test-device-fake.h | 10 +- tests/test-fpi-device.c | 163 +++++++++++++----- tests/tod-drivers/README.md | 4 + .../libdevice-fake-tod-driver-x86_64.so | Bin 52832 -> 0 bytes ...ice-fake-tod-test-driver-v1+1.90-x86_64.so | Bin 0 -> 44720 bytes ...ice-fake-tod-test-driver-v1+1.94-x86_64.so | Bin 0 -> 42784 bytes 7 files changed, 152 insertions(+), 55 deletions(-) delete mode 100755 tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so diff --git a/tests/meson.build b/tests/meson.build index 7106ff58..c3fa4f7a 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -239,15 +239,21 @@ if valgrind.found() endif if get_option('tod') + tod_test_driver_name = 'fake_test_dev_tod' tod_envs = envs tod_envs.set('FP_TOD_KEEP_MODULES_OPEN', 'TRUE') tod_envs.set('FP_VIRTUAL_FAKE_DEVICE', 'yes') - tod_envs.set('FP_TOD_TEST_DRIVER_NAME', 'fake_test_dev_tod') + tod_envs.set('FP_TOD_TEST_DRIVER_NAME', tod_test_driver_name) tod_envs.prepend('LD_LIBRARY_PATH', meson.build_root() / 'libfprint', meson.build_root() / 'libfprint' / 'tod') tod_c_args = [ '-DTEST_TOD_DRIVER=1', + '-DTOD_CURRENT_VERSION=@0@'.format(tod_soversion), + '-DTOD_CURRENT_SUBVERSION="@0@.@1@"'.format( + meson.project_version().split('.')[0], + meson.project_version().split('.')[1], + ), ] fake_driver = shared_module('device-fake-tod-driver', @@ -294,19 +300,29 @@ if get_option('tod') ] tod_dirs = { - 'fake_test_dev_tod_current': meson.current_build_dir(), + tod_test_driver_name + '_current': meson.current_build_dir(), } if host_machine.cpu_family() == 'x86_64' - tod_dirs += { - 'fake_test_dev_tod_v1': meson.current_source_dir() / 'tod-drivers', - } + tod_test_versions = [ + 'v1+1.90', + 'v1+1.94' + ] + + foreach tod_version: tod_test_versions + tod_dirs += { + tod_test_driver_name + '_' + tod_version: + meson.current_source_dir() / 'tod-drivers' / '-'.join([ + 'tod', host_machine.cpu_family(), tod_version + ]) + } + endforeach endif foreach test_name: tod_unit_tests basename = 'test-' + test_name sufix = test_name.endswith('-tod') ? '' : '-tod' - test_name = test_name + sufix + tod_test_name = test_name + sufix test_exe = executable(basename + sufix, sources: basename + '.c', dependencies: libfprint_private_dep, @@ -323,7 +339,7 @@ if get_option('tod') tod_test_envs.set('FP_TOD_DRIVERS_DIR', tod_dir) tod_test_envs.set('FP_TOD_TEST_DRIVER_NAME', tod_driver) - test(test_name + '-' + tod_driver, + test(tod_test_name + '-' + tod_driver, test_exe, suite: ['unit-tests', 'tod', tod_driver], env: tod_test_envs, diff --git a/tests/test-device-fake.h b/tests/test-device-fake.h index e3782e34..7e14b478 100644 --- a/tests/test-device-fake.h +++ b/tests/test-device-fake.h @@ -32,6 +32,8 @@ struct _FpiDeviceFake gpointer last_called_function; gboolean return_action_error; + GCancellable *ext_cancellable; + GError *ret_error; FpPrint *ret_print; FpPrint *ret_match; @@ -39,14 +41,12 @@ struct _FpiDeviceFake FpImage *ret_image; GPtrArray *ret_list; - gpointer action_data; - gpointer user_data; - - GCancellable *ext_cancellable; - GError *ret_suspend; GError *ret_resume; + gpointer action_data; + gpointer user_data; + FpDeviceFeature probe_features_update; FpDeviceFeature probe_features_value; }; diff --git a/tests/test-fpi-device.c b/tests/test-fpi-device.c index c01456a3..deea3f16 100644 --- a/tests/test-fpi-device.c +++ b/tests/test-fpi-device.c @@ -46,24 +46,101 @@ fpt_context_device_driver_get_type (void) return G_TYPE_FROM_CLASS (FP_DEVICE_GET_CLASS (tctx->device)); } +static int +tod_get_version (FpDeviceClass *device_class, + const char **sub_version) +{ + g_autofree char *tod_version = NULL; + const char *tod_version_info; + const char *tod_subversion_info; + + g_debug ("Getting TOD version for driver '%s'", device_class->id); + g_assert_true (g_str_has_prefix (device_class->id, "fake_test_dev_tod")); + + tod_version_info = device_class->id + sizeof ("fake_test_dev_tod"); + g_debug ("Tod version info is '%s'", tod_version_info); + g_assert (*tod_version_info != '\0'); + + if (sub_version) + *sub_version = NULL; + + if (g_str_equal (tod_version_info, "current")) + { + *sub_version = TOD_CURRENT_SUBVERSION; + return TOD_CURRENT_VERSION; + } + + g_assert_true (g_str_has_prefix (device_class->id, "fake_test_dev_tod_v")); + + tod_version_info = device_class->id + sizeof ("fake_test_dev_tod_v") - 1; + tod_subversion_info = strchr (tod_version_info, '+'); + g_assert_nonnull (tod_subversion_info); + g_assert (*tod_subversion_info != '\0'); + + tod_version = g_strndup (tod_version_info, + tod_subversion_info - tod_version_info); + tod_subversion_info += 1; + + g_debug ("Tod version is '%s', subversion '%s'", + tod_version, tod_subversion_info); + + g_assert_nonnull (tod_version); + g_assert (*tod_version != '\0'); + g_assert (*tod_subversion_info != '\0'); + + if (sub_version) + *sub_version = tod_subversion_info; + + return atoi (tod_version); +} + #endif static gboolean -tod_is_v1_class (FpDeviceClass *device_class) +tod_check_version (FpDeviceClass *device_class, + int tod_version, + const char *tod_subversion) { #ifdef TEST_TOD_DRIVER - return g_str_has_suffix (device_class->id, "_tod_v1"); + g_auto(GStrv) versions = NULL; + g_auto(GStrv) wanted_versions = NULL; + int version; + const char *sub_version; + + version = tod_get_version (device_class, &sub_version); + + if (version != tod_version) + return FALSE; + + if (!tod_subversion) + return TRUE; + + versions = g_strsplit (sub_version, ".", -1); + g_assert_cmpuint (g_strv_length (versions), ==, 2); + + wanted_versions = g_strsplit (tod_subversion, ".", -1); + g_assert_cmpuint (g_strv_length (wanted_versions), ==, 2); + + if (atoi (wanted_versions[0]) > atoi (versions[0])) + return FALSE; + + if (atoi (wanted_versions[1]) > atoi (versions[1])) + return FALSE; + + return TRUE; + #endif - return FALSE; + return TRUE; } static gboolean -tod_is_v1_device (FpDevice *device) +tod_check_device_version (FpDevice *device_class, + int tod_version, + const char *tod_subversion) { -#ifdef TEST_TOD_DRIVER - return tod_is_v1_class (FP_DEVICE_GET_CLASS (device)); -#endif - return FALSE; + return tod_check_version (FP_DEVICE_GET_CLASS (device_class), + tod_version, + tod_subversion); } /* Utility functions */ @@ -557,9 +634,9 @@ test_driver_features_probe_updates (void) FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device); FpiDeviceFake *fake_dev; - if (tod_is_v1_device (device)) + if (!tod_check_device_version (device, 1, "1.92")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.92"); return; } @@ -616,7 +693,7 @@ test_driver_initial_features (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (!tod_is_v1_device (device)) + if (tod_check_device_version (device, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -633,7 +710,7 @@ test_driver_initial_features (void) g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE)); g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_LIST)); g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_DELETE)); - if (!tod_is_v1_device (device)) + if (tod_check_device_version (device, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -646,8 +723,8 @@ test_driver_initial_features (void) FP_DEVICE_FEATURE_STORAGE | FP_DEVICE_FEATURE_STORAGE_LIST | FP_DEVICE_FEATURE_STORAGE_DELETE | - (tod_is_v1_device (device) ? - 0 : FP_DEVICE_FEATURE_STORAGE_CLEAR)); + (tod_check_device_version (device, 1, "1.92") ? + FP_DEVICE_FEATURE_STORAGE_CLEAR : 0)); } static void @@ -694,7 +771,7 @@ test_driver_initial_features_no_capture (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (!tod_is_v1_class (dev_class)) + if (tod_check_version (dev_class, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -718,7 +795,7 @@ test_driver_initial_features_no_verify (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (!tod_is_v1_class (dev_class)) + if (tod_check_version (dev_class, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -742,7 +819,7 @@ test_driver_initial_features_no_identify (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (!tod_is_v1_class (dev_class)) + if (tod_check_version (dev_class, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -766,7 +843,7 @@ test_driver_initial_features_no_storage (void) g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (!tod_is_v1_class (dev_class)) + if (tod_check_version (dev_class, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -787,13 +864,13 @@ test_driver_initial_features_no_list (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_IDENTIFY); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_VERIFY); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_DUPLICATES_CHECK); - if (!tod_is_v1_class (dev_class)) + if (tod_check_version (dev_class, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (!tod_is_v1_class (dev_class)) + if (tod_check_version (dev_class, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -817,7 +894,7 @@ test_driver_initial_features_no_delete (void) g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (!tod_is_v1_class (dev_class)) + if (tod_check_version (dev_class, 1, "1.92")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -2057,9 +2134,9 @@ test_driver_identify_suspend_continues (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; - if (tod_is_v1_class (dev_class)) + if (!tod_check_version (dev_class, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -2129,9 +2206,9 @@ test_driver_identify_suspend_succeeds (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; - if (tod_is_v1_class (dev_class)) + if (!tod_check_version (dev_class, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -2197,9 +2274,9 @@ test_driver_identify_suspend_busy_error (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; - if (tod_is_v1_class (dev_class)) + if (!tod_check_version (dev_class, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -2260,9 +2337,9 @@ test_driver_identify_suspend_while_idle (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; - if (tod_is_v1_class (dev_class)) + if (!tod_check_version (dev_class, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -2310,9 +2387,9 @@ test_driver_identify_warmup_cooldown (void) FpiDeviceFake *fake_dev; gint64 start_time; - if (tod_is_v1_class (dev_class)) + if (!tod_check_version (dev_class, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -2614,9 +2691,9 @@ test_driver_clear_storage (void) FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); gboolean ret; - if (tod_is_v1_device (device)) + if (!tod_check_device_version (device, 1, "1.92")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.92"); return; } @@ -2635,9 +2712,9 @@ test_driver_clear_storage_error (void) FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); gboolean ret; - if (tod_is_v1_device (device)) + if (!tod_check_device_version (device, 1, "1.92")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.92"); return; } @@ -2747,9 +2824,9 @@ test_driver_critical (void) void (*orig_verify) (FpDevice *device) = dev_class->verify; FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); - if (tod_is_v1_device (device)) + if (!tod_check_device_version (device, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -2961,9 +3038,9 @@ test_driver_action_is_cancelled_open (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; - if (tod_is_v1_class (dev_class)) + if (!tod_check_version (dev_class, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -2987,9 +3064,9 @@ test_driver_action_internally_cancelled_open (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; - if (tod_is_v1_class (dev_class)) + if (!tod_check_version (dev_class, 1, "1.94")) { - g_test_skip ("Feature not supported by TODv1 interface"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94"); return; } @@ -3142,7 +3219,7 @@ test_driver_action_error_all (void) g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID); g_clear_error (&error); - if (!tod_is_v1_device (device)) + if (tod_check_device_version (device, 1, "1.92")) { fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID); g_assert_false (fp_device_clear_storage_sync (device, NULL, &error)); @@ -3256,7 +3333,7 @@ test_driver_action_error_fallback_all (void) g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); g_clear_error (&error); - if (!tod_is_v1_device (device)) + if (tod_check_device_version (device, 1, "1.92")) { g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*Device failed to pass an error to generic action " diff --git a/tests/tod-drivers/README.md b/tests/tod-drivers/README.md index 3afec6dd..a1b27de9 100644 --- a/tests/tod-drivers/README.md +++ b/tests/tod-drivers/README.md @@ -7,3 +7,7 @@ test-device-fake) built using the minimum libfprint TOD we want to support. In this way the library is loaded during tests and tested for all the upstream tests and particularly test-fpi-device. + +Such binaries are compiled (for each platform) using the [libfprint TOD test +drivers](https://gitlab.freedesktop.org/3v1n0/libfprint-tod-test-drivers) +project, per each supported version. diff --git a/tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so b/tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so deleted file mode 100755 index 822f417c3de78c27ce9f28f58f2dd20cedf0a69a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52832 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 Lh9Mh+4P^fZ53gp4 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..b7cc06e59f127a4bb54c9af3702189fe091aae27 GIT binary patch literal 44720 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 bupPQxjS3*6ZAasnc78@eS7cSl0*(I(YH<)# literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..c370fc2128bbe37b3b1692e7da5ed2642bf3eb55 GIT binary patch literal 42784 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 literal 0 HcmV?d00001 From d0aa30a43505ce0f45624d9863ec0280a0eb473e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 2 Sep 2021 15:04:06 +0200 Subject: [PATCH 19/32] tod: Check the message emission if the tod path isn't readable --- tests/test-fp-context-tod.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test-fp-context-tod.c b/tests/test-fp-context-tod.c index f25a31dc..7137e3dd 100644 --- a/tests/test-fp-context-tod.c +++ b/tests/test-fp-context-tod.c @@ -17,6 +17,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define FP_COMPONENT "tod" + +#include "fpi-log.h" #include static void @@ -33,8 +36,12 @@ test_context_has_no_devices (void) GPtrArray *devices; const char *old_drivers_dir = g_getenv ("FP_TOD_DRIVERS_DIR"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, + "*Impossible to load the shared drivers dir Error " + "opening directory*__HOPEFULLY_AN_INVALID_PATH*"); g_setenv ("FP_TOD_DRIVERS_DIR", "__HOPEFULLY_AN_INVALID_PATH", TRUE); context = fp_context_new (); + g_test_assert_expected_messages (); devices = fp_context_get_devices (context); g_setenv ("FP_TOD_DRIVERS_DIR", old_drivers_dir, TRUE); From 71827856c9ad84579f99ea9d71f6b7ffad9aefcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 2 Sep 2021 15:13:43 +0200 Subject: [PATCH 20/32] tod: Update version file to include new APIs per versions --- libfprint/tod/libfprint-tod.ver.in | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/libfprint/tod/libfprint-tod.ver.in b/libfprint/tod/libfprint-tod.ver.in index 5b464908..14863826 100644 --- a/libfprint/tod/libfprint-tod.ver.in +++ b/libfprint/tod/libfprint-tod.ver.in @@ -5,11 +5,26 @@ local: *; }; -LIBFPRINT_TOD_@tod_soversion@.0.1 { +LIBFPRINT_TOD_@tod_soversion@_1.92 { global: fpi_device_class_auto_initialize_features; + fpi_device_clear_storage_complete; fpi_device_get_udev_data; + fpi_device_remove; + fpi_device_report_finger_status; + fpi_device_report_finger_status_changes; + fpi_device_update_features; + fpi_print_fill_from_user_id; + fpi_print_generate_user_id; fpi_spi_*; - fpi_ssm_spi_*; fpi_ssm_get_device; + fpi_ssm_spi_*; } LIBFPRINT_TOD_@tod_soversion@.0.0; + +LIBFPRINT_TOD_@tod_soversion@_1.94 { +global: + fpi_device_critical_enter; + fpi_device_critical_leave; + fpi_device_resume_complete; + fpi_device_suspend_complete; +} LIBFPRINT_TOD_@tod_soversion@_1.92; From fdf86e65ece3e1fb694ca713c058f308111ea0b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 2 Sep 2021 15:14:17 +0200 Subject: [PATCH 21/32] TOD: Add changed functions in libfprint 1.92, a fallback version is needed --- libfprint/tod/libfprint-tod.ver.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libfprint/tod/libfprint-tod.ver.in b/libfprint/tod/libfprint-tod.ver.in index 14863826..0027338f 100644 --- a/libfprint/tod/libfprint-tod.ver.in +++ b/libfprint/tod/libfprint-tod.ver.in @@ -18,6 +18,10 @@ global: fpi_print_generate_user_id; fpi_spi_*; fpi_ssm_get_device; + fpi_ssm_jump_to_state_delayed; + fpi_ssm_mark_completed_delayed; + fpi_ssm_new_full; + fpi_ssm_next_state_delayed; fpi_ssm_spi_*; } LIBFPRINT_TOD_@tod_soversion@.0.0; From e4ef2ed7a0b56069be12f7e96fdc50308a9c2dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 3 Sep 2021 15:49:46 +0200 Subject: [PATCH 22/32] tests: Do add TOD testing for SSM API Driver is coming from the TOD drivers testing project [1]. https://gitlab.freedesktop.org/3v1n0/libfprint-tod-test-drivers --- tests/meson.build | 47 ++++++++++++++---- ...device-fake-tod-ssm-test-v1+1.90-x86_64.so | Bin 0 -> 128072 bytes ...device-fake-tod-ssm-test-v1+1.94-x86_64.so | Bin 0 -> 125120 bytes 3 files changed, 37 insertions(+), 10 deletions(-) create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-ssm-test-v1+1.90-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-ssm-test-v1+1.94-x86_64.so diff --git a/tests/meson.build b/tests/meson.build index c3fa4f7a..0ec194df 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -240,6 +240,7 @@ endif if get_option('tod') tod_test_driver_name = 'fake_test_dev_tod' + tod_ssm_test_driver_name = 'ssm_test_dev_tod' tod_envs = envs tod_envs.set('FP_TOD_KEEP_MODULES_OPEN', 'TRUE') tod_envs.set('FP_VIRTUAL_FAKE_DEVICE', 'yes') @@ -299,22 +300,45 @@ if get_option('tod') 'fp-todv1-types', ] - tod_dirs = { - tod_test_driver_name + '_current': meson.current_build_dir(), + tod_driver_infos = { + tod_test_driver_name + '_current': { + 'tod-driver': tod_test_driver_name, + 'tod-dir': meson.current_build_dir(), + 'supported-tests': tod_unit_tests, + } } if host_machine.cpu_family() == 'x86_64' tod_test_versions = [ 'v1+1.90', - 'v1+1.94' + 'v1+1.94', ] foreach tod_version: tod_test_versions - tod_dirs += { - tod_test_driver_name + '_' + tod_version: - meson.current_source_dir() / 'tod-drivers' / '-'.join([ - 'tod', host_machine.cpu_family(), tod_version - ]) + tod_dir = meson.current_source_dir() / 'tod-drivers' / '-'.join([ + 'tod', host_machine.cpu_family(), tod_version + ]) + tod_driver_infos += { + tod_test_driver_name + '_' + tod_version: { + 'tod-driver': tod_test_driver_name, + 'tod-dir': tod_dir, + 'supported-tests': tod_unit_tests, + } + } + + if tod_version != 'v1+1.94' + # TODO: Adapt symbols to new ABI + continue + endif + + tod_driver_infos += { + tod_ssm_test_driver_name + '_' + tod_version: { + 'tod-driver': tod_ssm_test_driver_name, + 'tod-dir': tod_dir, + 'supported-tests': [ + 'fp-context-tod', + ], + } } endforeach endif @@ -333,10 +357,13 @@ if get_option('tod') link_with: test_utils_tod, ) - foreach tod_driver, tod_dir : tod_dirs + foreach tod_driver, tod_driver_info : tod_driver_infos + if test_name not in tod_driver_info.get('supported-tests') + continue + endif tod_test_envs = tod_envs tod_test_envs.prepend('FP_DRIVERS_WHITELIST', tod_driver) - tod_test_envs.set('FP_TOD_DRIVERS_DIR', tod_dir) + tod_test_envs.set('FP_TOD_DRIVERS_DIR', tod_driver_info.get('tod-dir')) tod_test_envs.set('FP_TOD_TEST_DRIVER_NAME', tod_driver) test(tod_test_name + '-' + tod_driver, diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-ssm-test-v1+1.90-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-ssm-test-v1+1.90-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..9b1c3ff070aeeddd77c85436c68d7d83534c43ba GIT binary patch literal 128072 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�yV~;0IGmCm?}--v?QF{6;6AFb1LDS6NE$kovGhV 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 literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-ssm-test-v1+1.94-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-ssm-test-v1+1.94-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..0ad3be4b463e0c37fb436b56fce5f815b5b87af3 GIT binary patch literal 125120 zcmeEvdz?2jE2qEbylatlQy8JA(?ek+B>;K49vCNpkbhiS?*9;qmmN>ZsP z-8rR5HM)tebU{iTrIIeDKGpo*@3qeLnHkT}_xE33FSF*Xeb!#@z1G@muf5NCp1D4` zZ_g@maUthl)zC#DUafDUoFuzp{Z8+mq)>;@v7w|;qtKahZ#Da#^2qwS%5`WcUa#3( zb^e;jANZFjKVACh7kcebzntoG@C503r>LAm{c<(Xw7P-bzq&<`#tWEGsDn)%xhjyM z+^$pg{#`ADbiZDP99mP=hlr8?SFnR}Xrgf4;fA8+HraB~w2>|6Q0m~nA$xMi9f`hy zw%o4T_PC;G4;zO=9esl!N4r$^pY8V0U|U~Bei&F)dvvI6Ua=+npnH1t9~J_v^~7S| zF6|68UbFqmrtjSKUe)BU`s}DSXXKf++t&XwZXcQ`7wU-r?3eiC^YEi)p71WfudjE% z^r!E?cwsGmE%#r02%b<*%PHu%JpL4bERWwDKpmU-yK9L1%j0v3me&vOP4stQ|6U9I zmv{eD74*}q0{jnE(9d%8Qy$Jb74&~<1^sNSfZw=+el}oy<>_5h!Tq%=u>S=W=p9+X z{lhD;PlpQp^)2o%59c)%^z%mrcotTGXGH~efEhxG_#gdmeg$|Y;>PlDrc|JJPX%`F z2Yz||F#nau|Gk2Kj;rAQeihi~<_h|mj{D2gn}_k1H!s>(;Fnny*x}_0a6VDN{hwBV z|DFo)+)=@}eyu=n3-ptS|Iz;@R$zy%74+W|9W;#Y1lPAzfWNqc@eYGbdG`Mr{1Za8 zLZ38MCATXHO%^=0Ld9n*qqfZtrKV1pl9id7lbbd*H#Ies+Iwif)N$dd;R)$Ex#6ip z`*qLA$_x)p8

%w(?t2$IeVk9iN_=mXUr{I5a*RT})3O8%~`N&P~mol^qUE5Ry7} zVtDN2)Ug?9IXS6g({gfy{Paw~$b?vWPHGx@Nl(qmnUXqwYS@z($?R}=a%y(k)NrQP zfi$Fzn=~yaH#K`|`t-EiaB9~0@j2mK>Bz>z{&K^(#Rn`)G-jsfrlP;_R6z1L8R4|) z7&y&C+!H6Kj!#R^z%A*#Rm_%~J{HYW(=#VHgK(oqiG!~ktriQ0Z%_5+j40yvagl!L)Fg!Ik9lo0q&dEue5Kaxx z%;wEy8eB_q(Bsl_J=2mgcG^?{N*k-5wCwC~=D6~DN*y~TJ9F9;x5LcvjMVYdGBR8S z%pKG)mj28@IAo;F!k}r9FzlF?IYA9VhY*D`(lX%P7I7Pf7#^GJj2IAwt3n(<8llBD zNRI8LG&(G6%p^(zv3HR+Zd~e&a2jGMOZ@4zOv{`a9`B8clLL)vo{Vtjgxra4V`g|} zu5CakVm+2Ka0ut7PYGvD%T0w+Tun(!&rBVgg(!k_I${Ztl9lOpI%(RJYy?YGzX7h> zwWD=P+Ej#S7Gn)YaJve!15);+5ZjAo0$nlEr60)1WY+txoCZA@LHf9iFb5MA0Fp;? zrj5y&!h5pReW{L+rz(&T+=(wafhcU1*;BK|AYSZ2$(ZaGnGxkRXmUxL2J59`Qm0Ew zN*y0g%bhkgoD<4OA2S~LAv3pS+m@J(t#YzjwIOpXe{0X*R6)z}X_Ldeqa{MLCBv-c z^ft}gwCZ?X%b6Y8r?x*2_lJ7*?cJ?=YTH(ATeWk4KQ9Dk&w+z`_aB-%bU=^PHmMM5 z8_jIhx>f7YIa%4c=Rn;#z4{O6mwXO%J6SnEtJqa|6;#()4)Bk^X|1il^Gg3|i?(4& zk$+0ri+3L@eeE|+YV|l=)j;vjHKjHFPdhpNXx?*?&8wT9Zg9tSvAuue{XYYYvj%nh z@>;Z44Gp#LkN@FAY`Ln0((U`5{UDg~FZ(Q|YwUfZ!*6Z#*GKV>7nGsUnl@O-@Xxv5 zx!!V)^10_YO774f+kAXShAq2%{8N4RTRwhUAAi4(-_FOc-&*xjr~ammi9WvH>P>xo z$3K*4?c=MDwVw_?zHLfrNb>Rh`@|F<9}aZ?4fOGkak-(;a3B9zAAhuuf1Hm$(Z`3w z-GA9Wel3?93eEKK-I@dKc|N`qLlm3q<8vSB{9EATAMY?h7yJ1Bx^t&c`}j?K z{0=_8of@Py$;WT%yFbOpw@Y1V9q8jX^W8t($8YZAkM{9d`#b+8`uHs!CTO;g-^$0I z>EoZ{9^-efxuM7S-D_^-F@E=&8+eT0z2?Rp<9DyQVaNF0Yi`sr ze)pOibd2A<=EfZ3cdvQCgz>xA+@NFp?lm{&82{hS_!H&&OZS=^ag5)+<^~+&cdxne z#`xW9Zn!ai_nI4RjNiTH1{>pdueq_t_}y!6s4;%`nj2}1-@WDr8sm4bxpBt$-D_@` zF@E=&8)b~&z2*iP<9DyQF~<1+a>maMG5qgdb0duLyVpFJ!}#56Ziq2{=NhwV+Hsss zJwh^{a2<)dE{M9mHtITBeo9n(IO=*-)b+5a>wZz!$x+vxqpsUUUAK(7ZX9)eYSeW? z)U^?HT|Mgh?_-1Z`Yr1Ehp6j4QP*EYU4ImH{chCt>rvP1qOPBdx?UA^{ZQ2Py;0YT zqOK!R*9B46*G64Wi@Kf?bsdhn9u;*xEb6*n)OB*yb?2z-c2Upy8io^DE~XxDUr^9;P;eB^#ddwOL7yil>J^)m$IWvchx>U53?_{(WbcnO}W3_ zt0ZUtlTx@pWy6nMQZ|%SO^JIWW$Qn=b}ca4{M>d14w%j;YK+0eA+!&34) zKZZL)DTRA-k4q`)JRW@OB+PSb92So^s*l2T+$hMp`YFG61{#M!CZ+INE2SveN-0d< z4~qZjDY-;`Ehg#^ek~cbQSQy(7mxc(tUr;KQwm>YOG@F#DTT$>OeCr|ots+Yrfq24 z#!jtw(H=xtY;9*Ab@9m{Y%#WOnuqxfP`==&cwn-uCBF}i#Z3Uyt> zMLs2Bd<74hHBnKe6z|&aHXSHOjN5<06eF8HBGDA@wp1^9sjk zJ;k0i{7Q=DVG)g5oKy`S68m~;7>I1#pC5`N4fg4@n(X%Ar~7Mfh|m8suJ*$9wVz)P z6Skm4O8)x#9L_tA?~0OY^7DIn7nKRZ zL<|D+avB1o`sy0+X~*PUxlQ^;s{eujgImVo{Zw-ryNI+?R_C~nV8j-Re;4&nLhK@> zDD|64wW8E?m0BmP&ToTQzf15i5foc*Nl3r~k{F7u@1)0JC57FpIjm2}TI?hNv797= z_v~9!3cJ+|PJ$%K3Wd|Qq!bR@gdu%VU52zphLot_p86c%3KX2OI=3RY%Syy05G}Uu zguCn^HB_mqDRrYteTTqBWS4+gXX=o)QR*Oju;aBjDc-icG#%#~3g#k%K!#FHhXRXq zt0}{_<7J8P8TuGU;lTQ6lYU;K3YbLZrB#&FNG@o^{VAQ2OL7P7oKmuL%Kq(d$}CGy ziHvKs|Fa7lITW*QI#9z?IWh)g`DYl`Ejp|^I;=A|tdYM%PyTDIgXT>vymnvVG=Lq( zc*(2A958KHQ9r9_*uLIaU?S}v-~@*$u2EC$w`NFU6E~OOuEK$hQi}R1-bg}kxqCAO z`cNT8;hTJsgrflEW$vP0;SXyn!Z$DlHF|YrVV@=JX)Ah?4B+c3e_tX1zgIPmLx1`G zP-rbXH2DLd_X);gtN0+n+xZ4PoyBX+WJdOb5W;*|_$kEJsn}OrB@BKBu^MRbz%<2H z9)|+4&OjuLEHEa8CWU$zZa`17wWo{O)63e^UE0$l>}d|AnfPqs_j#=zFHSDO{jhnZ zon43?p|Xjp{A4>+zM?9dsLJ!GGV51S+1gQA8{>|0Jgj$X6|r8eXzM*8`Lx(7Bv7CA z_Wp)z+j?QqW{f8Q_>@L}Xp30y84zm+MeXr+v&CHNwE@GkUU%)O0eiyCWKScsr*!tz zgVH|hE#&o)TCWd!g!L@x-*|KzR3i6LrS+bG{~g3?^NXl-t+y2_gVu|WUYd)O_oE+l zl&~3nzs!9;^2rMJ_5poSRJ{>igof%mX!b&t(Gp^WoyJiy2Ski>iE6iW&~C7z8qI!A z;Vlu|g4@&SPuQ2MwU!82tuFxVzzjJA%JY3FtFZT$L>WnF?c;y98TPdm14c6#t_Lk23hLIuM0Fx&X4C(S_a; zv%NA9IwUPvTOcXgIgcX4U?NGy9R+*8{St^p3CsSbttB@-`7;FU@T@~`7eT0_E-HP* z=Ego$Ip+U#7;nET!`KdDRiiG5nrI5W{L{;;q`0}l*Ws(U!;}WQ$1}9YyV>JE+T$$k z@h0~8w94*xrdC6}eKKz^)!Q%D+lTY^eBzC09!g_mM#n*0^cRSOGIpHIB@W(-w&PqP zaVC6Z7*d_s@n;!wKP+7^Z&AYKf4O#?uwRTJG5NL(148zwtBUW9*D%3MY>GI^^4}3V z-U?#92pF>OmJPTmE-F|BXI z8orBb_^zE(wjE*(e;Peweoau-tC0uIlU4NqRXvKT7yk%NSi@b!7{zk%3fGI*kc1#Z zwHDOw&%F|LgY2JX)%>jG60A-;Htd{Yfn$Yc9rszwn}xIe&F`xm0@z6k>>n||QIEh* zQDD!%B{q2t#47zE0IWVu+0jN>-%IshX)jx`V3_ z3m01!?GO3{r(j|78sSIU^^@dXY~4jG*th<`Te(baLifm;;+9Qt%N9n%mYq{J9m43# z-;`*G(~&=o_1SEuBkzh9B-8;Q*3J8%LZe~Lzlpu}s_j_`G@}Q#HCJsPY!Yo>f>;ea zZDNZCI#^e;g>mk;$Eo3maqdUF9b%j>p<_h-1*-Wi6ar=|)qI(1o6^+(rT}tOd?_741LmZ$T zHC-(bex%(trXjE!(KNBV5f3 zb!=PT5QFRlu}=ODnl#=7*f9jg5MKe6t8JAlpmH@;uHHFi#UWH~K#x#)h1kyc7E7Ml zSyf)4Dl@3^k-e@;j9WL_&wwWhZw=J0hYS#vI~J^-<5dBDULwP+ik7i8Ak*eW~gpFqbj$vvw1L#%;j zSJm7{HD5-}3oX|qqWK1DrWa({u~k-f+3BPzhpWmos_dpJx4kBV{RYH3!&B*cp(S|U zvV&8e3YMM5STTajP95RI@WL|ag)I(hcx=M5Xm(d%T@+Y90-O7-YYW6bGJ|aF4ye%W z6iQa1V^pXwB1voT7osd?|4HC;h(YCCJ*&RZLeD$sN~GMIlz5NJ27(<7_A{rTRH+W5`4G9kf8i zcm*qkIY^P7rbt`x)^GLJ^-gj)lCZ3Yj^K)FYLj8qG(NRFRS@g%Jpf`aMg;Z) zfgNdBE=P}0xk19-*o{nY4po(1RpkJxyxCKU6ZT zR)Oso6C1q=Y?uODu|aI{Jc#x4*RCyKc_%DK=xFLv=u#ERQK8usT1kVkct9jN<&#`^ z3)XT~`#zQ+bGY`)oPrihxf$GPBDX8mc7r6aihoFtqW zA+`c~5&IE%6cf7!frS-VvH}}IVDoo-ws`rN5bg!CyXcBYLSux9lQ5d_=0WNr@n)DK ziWpBI*HK(h}9XJf6 z|3R#?Je8jR!Shl~723Ys4Oerl9>ElIl5k@AA9`Vnztu{D6nJ&HiW?D?{aP7 zTlq>RsjRS|rmr>9?i*%EG`8i~ zi=@$B*9z+M#^QoR5cmTQQBEh}k^4XD4*YO6S535jG;RpeYmpM{5uphj2Oxhd9`>a}}9~!0`~&07o}5ym2OR+^9IZ zDUN}}QMALwp?1>rv=D5DXF&(Wk^}-_+C(^=3dqU5cIPV6l>BuhQZQeIyo-QcCAa0T zBayOsjPPTG?aw$51Lltva~29M^CrbSA1#CNF#034%1Y#hSr zBpl*k%g$9~9s97T#FS8>b%vDSSKT^dz>Z@vMxcypp+$p+DsQy`p9 z1?141r0^z*cylGPD7`7S<*y?VZ!Q#m3~!#Pm}e^H2e2-i^Az)X9F@SEn?bCjJZmhh| zICh?kxl?iqfpBq{3*8G;H-7Jwynvh21v{tAJ%rXqs`U)jx@-fqE>Nu-UXbCx2Vx!L zX|2gI+Vw#luw{LaN~o$#y=2{qV}H67yV0fMpktBRxjrlgXR)~E4`kgP8)CR-E>y!J z>m(BxHHht2#nxD{ol9()pO&%6WWo)&Mhhn!VP!Y&HC6u<)qmr9=wGP%A9`MF^9+df z*&RB#dJD(S_gH(F=ry|^V%m(rATe#?B@T=~kk8CVboeDt%kXR92CM7G z(52~9fB{h}!sQw`Q*b2b*&yVy(%JiSD1rJ}Vrt_ms$Ze%XQ}#|K&)3ka@BJ|b@J%j zU`u3528S5yY|Y@9wF@vu7s#yLxIrUxE;w^#);=Yi7?GKz*cwYX89R_z%tsa57f*?4 zz6Y_Ic-UwfetC{;wQA8m0goZY7bh>Z7aC3Xu@7Efgbo;JuKMRPf>@~_hAW8i1o6O! zu7L=G5i_4IV=`R^K@ik`kT#=RB#+x#E1SokK&Ke` z+cGtbzSR1(YVD(1FQe9l@4G|yyX9W6y*zHOAm!xoMM$N=Jf1I{7;ZU1vGr1mtVVrg zKBL&4d_pX;4#XW4sm7Ae*1(aJ&v#HzsdE6eK?_hSB#DLM7{XDPz zoTL48WzQLT3yd$pTq2Nj#r9TLF)mw z;XKw&4nGq{#4xdVnHv;kA#TLPx|8=0W;0Iu0*A8pM5=6r&Ot|rl>w3^jDgg&Q8k^e znp#rR#4XSyiCs?whZCtAp0>)$hG%V6d7P^J0xPQdnyOs6QU+&&SiimJs$B16@;Jco zViPi)i{-@TAIN{f*!)&FF=BH%^uiV+BoK@q1opZDtE0fqAh3}>U|wLpAv4RUO`&2H z+VQxIW*>-EPhHEARCFj?Th+dcWNL2G9+qeikFkdWb%A>*`y`xSCLZ&E%^#0t4`tVK zy(#n#Wv^hjWe;UHGXEhD)#hM*hjOwu!R|DCW!I+D0Uu`lP;6+lJW9Mk>)|}zz43WE4$pItXU!d|p}%Sv$@}X`vvWNA9->o^XH&rs9M3+X z9anHXdzi^40jlAa-5LpJ65H2`?dcUV`t=~z|K9dS&lvokV?NSkvkW~#<^8I1HI@%^ zkE-mVD*I98Tu-GN2@ApVl8rsma+1wF!-I|TlkJ=FH@o2$e^aBLRYHL^%Q!H20Qfe>@tZ3V<~&st38~fJ#=Od^)&$9O9cgz3lOi1a7zg<;lZ^SW_&H0QYLsAkH-FJ_ zU5Xa0m|+lW>6_4`Nk*P|FCd^JO)|Yy<=4``Q9zZys>-h)5|sx)td^ciH?%r}SD7T! z2DvhrWKI`OjL>=ldJ*%ti$jflSeeY<6j&bxb{T;!+~nEfWvTPvitA|*pDU#3wTr;Y zmK5ix`h^-|Q>eZ~)xWb`?D8pymEcp)AgInDaA)~po?N_y9x>uUs`5{)q~;&0@-kI9 zfhw03yCZg8@dS94ndJ{7Sp{eLLgB=4#hD6hrn(}H!2VQV>mL+bYzDE8_5t%siX0Vc zL7~4?s7QtGqR?v$tV7T8m&D!1cUUdVzqNuPBBGBfs<8j)ql$DcDDd}lZxH_fhog$s%On=U;&`JL$9@#DH}XwCv>+3V z0I}|P9qNNe75Vf6BJkfGRkTs{n?;v#3)UU|>{6uN<_ARm=O9)+PrZNhl?b*(V~nGU z`pDaiM(?PihHzp;<07cWG`UJ*!1x8Lh=mPBk@_soo=;`9RoQe^ zb_12YvayU?SJKpOj<>Z|wvZgFS~uxL+JNfKj90B8)mn>MdwW{_-W&|Jm*yc>K`nVP zQe-gAcMwhtZx-J#7HOc~Y)ov&E4FcHL7-0su~xn6db2Y|;dt{Bw#}xe^$_vp-|YjT zYiX{C@i9`VnV{VzXm@8)WQU4yn1OAlh*$n#NTK-J_ylW@*+Ba_QTu7ceoECg{)3Sw2$(Xf#zElpts3PVjI`!@?>iXz zh&>~l+{1Li0}^h#BJD1aHKf?OkptJan&jn~-(Ru4QTA9a@F?a-Bno=Ndld7zaAJ64 z@)GgJKnV+DFOrVgM6FR1E%3&PAl4v&u*=Ey#Yv425@^yBlGAB$3}**#@tx7gd7j)@ z`FHwv+#_Ia7e5#y38uM%xf(41QwUZCC0QK+>FwO64Y6w0F7h`yx1f~n4SXIEs=GC_U< z1{MhNr07RDvNZD5efyIl`)LY9#q$y!__RnQ;YrxRNy;1U0)&0M$Nn6`cEZ8^i`S87 z+=|3yc2d-NxEHRUPm$glWLun!EJ0R^f6!am+&BvzAvfNs^ZzVr>a3bhR85VjDfK0E zsvD>+PLNFo&kHg;w#x~!vB*uqAR8o{7(upcu>d<&fz8KiXI`Yh@U)vIC<3wGc+mq^ z#E*Q4x3gt_7?)9~iwdQv&?OX_t)|{W6PsKoZL<%7*~@sl5r!G?c6PM4M{()Y?XA4d zTZLXj*PA4@Y1I>_b8rDtTdJKR9w&4ZLXP)V@JWnq#>&jV8pSH8TCjf7yH@TRufy(u^N)K+mle@8- za^HbWplu=vXCNy$)3YJv`q5kV``Q=S4*r9EMGO|v=B29Y%SB>?pFpg~RAi~X3poap zRS(+^fFC$)>#C8k)Oi=u4T&RJHC8}1%rHv*bH`F(8>QHi726PEo4>|0gX5pO!Sg0G zWGYxSZbOm?PUt-0#PCmT1vXCo^Ec+Td4&R7xloK|f>^)3-~sa{^!+-TO%zI1p&2Sv zK%v!)wg_e#X5C($+!E+>;LI`;dI*N;O=x~8#c=igf0#!1P?fK3mh#pudab zlUEBr(ryv+FW6raa}n8km^=vAVn~@^_S7%uFqxZj8qzyVK3_O74Ee_G;^D`|oyON# zh0S!e$yl^t(q9Q;t$ZG!G-a>01O1ii@Tpamt}omOd&$_Q(02L_8?)?jI2lRishu7+ z;RwDmA3Zx;!R-+57`+HCOToQyn}GWe#H#HB=UD9&@Wg5o^^jrs=`x1WZWo@;?~>>B zb(X2swt=%vp4Z0-Cx+D)KriOS9<|yNSboiH1=do5bt16o&v{n!ik1=`%`6H{RiTnw zWi&M?)P@#S|4Y$wrgKqL-x`JvJ8qm7@3NAr<(E{??QC60O+~{HG=u9;sy?uH;Z~rl zqKe|FC`T3DqKfVXv1Y2-q%&`F%u%7wP#2lGDs;IDO{CE6^lAjriAa4%Q<6A7jG$fs zSeE}Y;OzyK|BF>PK~kb8$RsIfuzs*wN5A4v(2pdTh|TIGai& z0!8?H0@MgR_$;v+NgN7a_``B}3uF<~_p*!O9KWxsmH@R2p2`O3Tyz9WKP+p4@i8g| zbB=0iteVcHrp#xcNoNnXBs#6H0?!LjdtQ_ipxl3RT6+OHS~xKR^ru?{SPKQ#nZWWD z*gUkr1b2g2A3f~>^FrWy31Ooqg>F!xOI0XLp#?O!UEaPaiifnpEq|G z`y{UjB-JN4ED32bMtzBJ`DA}1wnU6oDACM&RP{>{QT-N(Rlwe4cJc!go#7BI65a(r zP$V=^wX2;XVa316()m!0Nzg%J#5kVV9#CwFimer~rLT6);`(bEc-|y{Oa)nb3Z`&y z5{wW|41aw$Pk?n%f6YX#U@lW&H=zaoS_EQkdC~*sW$D2>n(h=@u0n%VXf%b2yvTF2 zG>26mS^7zIXlH3A7M%0vXR!*e?8a|^>dNd_$oJ}ey+R?9(b2<24)hY z-aDWV3nxa@|5_;6wkx)$QKFbnE4EwFf~dbA#QJn)z%*{6+WiFhfk!I3=d@R-#ei9v z4{>KHh(-#cB|)rJ5XUKqlL=y25CkKp8}-9Kn)7X~mEFPqF;|9uho~@KK+#~Ds`U=E zVCc(1teua$L-)JI0=xXhqxKDR0L1@s?$0stf(yu7!inLU%M{;55+g=E;(Jl?{eF|+ zt44fXYr-&drA3X2UBIsmp7pmVf?(}xe3*_xnA*%S3J2O){~F9 z_8QJGhL@JmarBau*S1!zUa;wp@%17@RBN_sJ)T-OsMh^AiWU9=u{wHM{a)$@ws^_H z4DZ49y9`>1OX zVv|)vKJ8sizJ=M#413v#IX&;||qbc0Dl*~Gj zUHt2}#am*a@WgI0pK&ZLu|+NM)(v8bZ6H>i6|N^7)(b2QgBXJLvrU{>?+H%E zBl^alr)SGRCa94Ypn5mI(t!*>3zpGQAlBmLu92OoS3unEvS2UXm0cDtRIS@Zg>f>q zeyv)!=ZV&DL9B+JR=;bTgY7K~aZp|UvT!CQa&TEVUN|vayA-P7+5+*TaUH5obB|){ ztl0Vx+l>#p76~p3Kd2>pQjUMp8Xm2#a&;(o5zSVaWudj|{|8l-X=y*}t{2<94Prg4 zw&Akic;sC~N10{eKH&5%3;FxXJcam#>w6*c0^hB`oV|uU7bY*oVRmTTa>BBkI{nWedG{bOe92(&Td*HT|KQR$V9d zcoD?<{Q-1p@5G%Wf-1}WIUt08P`d{8L(~`c{E7Gr<^W4LF#=@<^a9wknga?@4w!!` zu(}GYA%Tr@fJG91MYucWtiiT6a86)?XEUmbl4-B}lG5BgFfBJ3CO>+MKziv~8Sq;m zR)Ke`Ov59o37Xd0}VMpM&0OI_1SfE2;3-pse>Uu9>0H&vOc zDhEQ~sJaRruR^C&=wccSUgenqPGRH=>g2-voM1Oqo5UV! zXbAw<_85!6zn8&LP-o8p~upPvzdmnV^24BzvQ5<0-CJQD)0n1Pj8;5Z4p+#_r zgA^ZH#Lq+Eco=Gcqq`X1_!`xyd4l5Tt~dq}$Gm%89BL=s=`RAC;aM;fN`NH~MCXQb zIthm#m}d(pt*`H8id6lYjq#g)1`}{063O{*f@mKNjSv8mYu7}JOqvppbaj~7F!s{6UQlvBU^D? z2V$+g2f8%0{4RYJY;oxd#j+a2cBybW6_8W=22_8covZje+)5&DU5+@WTjkdLbtK}} zdBTt3)>9OBNaD`m{=;mbxYx`O`@I2T#o4$6Ye);mr|VPu^dJS=ok_cfK#L33gV>`H zPAB2evTWJ8ip)b;b`}7@vf~xu3;95Jh9W#s5jG;i)Vp2F4y0OmxG$Yf4{su)xL^y2 zjYBw{ghL!`*}00$L*V#%y5Oj#IL;xChKgf8S}*~YfLNd0<>H_zoHb<^*y7=BWEL0f z0>M(ts25Hr;c(Kj1>PkQ@4kUhqIc!C{BFqKzjIU<{Rx^dw zU11F(ta*!R3Hi;BKL~t19l}iM#KeRQX!#z@(i)U%NidFNw?D?Olp#>l3Md(~vzJ z;T+~S4Qi1O&&$chK5&aZ|<78pOsSoWuO4p-zgU zgW{NVJ#e&D9NVS}j&DG$GdvuA7dHc2T--siB!NJfvsO42f74JrrW$9h+~)hHp%TPc z%r8K>36S94mn5wiucKl!&sEHg6mwf*p0X%lJ9pMjquX5%iz!nS{y@)^!a2;Z8`^)R zz*;9$)M!Om7bvUz+oi(Mub*&cEn6{bNo3Y`L>$wta;xtvht3dwj9I%n zTkN+-rl|2Fics@H#oZ4ru-^y}>yF#iet}uLfxdQqnqN|-%&eU$!%5Dw$0C=N{uYZ9 z71`B_jQbC>t0H?QOOR~~p#o=y$P|k_31WSBYrrDz6g)s5y6zGK$$^AzpvoRdTn`;E(AP5QjddtI z%!?I70|n8HAi_ZqoN$AwpKg)YyKJp`9ufQX$)i>4eX6w=wf0f14^NSyKMP|0w7?y@ z-z_Czi(BNBz;=r~IdYzNd0$4f4{=7N1f`AHSMk+Qe07O$ zfQ>IOjjm!WIey`un$Nok-#IptCr`G$DtpkdJwxzZB)P|^M?8ZR&vdk4THgR-y>d&r z_Syut*vsORr|KHUj|il#yeCgj2q%WEIxDsd6x-FPbIiet?bFGE%>uE`3}W-% zS6C)tW^||AP?cMza;qu#86!^(=$tt4%ZcoG@O`PpyW$w*e^`XgVcO5-+RsGx(_MYV zBSw)$1iy}iSLWQI6L1F39pX{@MV~udxfr1A0{;1TV6&NSyBYwF4m*%NIo2_7sj?$ic5kxIxRdL-_TZ ziGuAOwPz1vo2c0G(E`8T3Szxe6u`zvTT2tuuPKUSAWfq2C7i>o$gWTv{}ZLgOIS$F zbj9(%34-Hj;^^Vw@cXqN*y7jWie)s2?N{MwRpwMeY=v)0#JA@lnCV-&HGdt6__m(# zW2B{rfeyYc5=R=gvO?aX9|uZ{8GpQ^bP~fQT1P8sWY=x zeM42>n(8Ne>S+OI!sdc4Yl;+QYJ~D$1{HfQcpM~o%6*bN ziz*KBLeNLd_L#6|&=mhaUI=P{fx;78#eBwNs8h{b)Dmk)izSLdtSUD^y?qkN0RYiY zMC8x&7&FU6N&A)Fc;AcOq5cA~y3w5Kxr;`SUVs+l(i9LYKi^e9+L!0&f$in_IMH8T zp1%R{70mNfg%cx4;}qLBitQHEu;#6b?Y>mOwi3kpc8-gUz6};&7Z7;BZJOr+l@qG6 zd42{I!AdO@Np&K*Q<2nFBn^pVR1gWBbTR$r=6PFdW%GQTYSqCSx1bI+7u(~%LdOqc zeLLG7zu!0e!S?dJ?HkGS!MB1exICESKNe05--MwW7P%NM!W#4o$^`Q+#a2bJ#S>c} z4;y{6Rt!+cSAQ~4rRZBh6KFO6TR|hSFz8!B`{2F6^3X}$DJ9?k(OW@FM#(@1i64z- z9LNJYkdA1<1n31~&B=3(EC~dz%_44hZLnRt4d*|V`CD{NRO?1jVLXfa!Cahw(RR& zix8XlhQKFk$z7;U%!gF&rx7xyzd@{~G+Slf3OZT!FJ?avYd?=@KhLqB1!^1rTR|@% zI?AjKbAi*hHstRc9lbDY;A+K6j4$fIvE$iuAwCQiNoa|&IIppEq1H)k!+pUl^Wk;i z;{6pueNLhNb-4`r7z(|vLaUuK9;v)wGxnr2GWMC+Z|DzBsiPTaBT6gt1=Vz$YFY|n zeReH6m1V;Iq$Rc|{5!mT#Bs(vimg$x5h|8Wv4sQ}N$3KLJEI*${xz^&VE(-b20(Kp z&PzKT*ylR!^C;~zfwEh?TVzf-2Xm%4Vvv16AgDDpxz3p6kJ@%&eS& zC<)HWuyA4|++T+aua{eJbqR=u67Ih)&8n#S`$d-#PxbGq`ui^t^{YTEYnH2ibSVvyRFg*e z8SKiGX532$OS4ae6C)bOLpAe?#DI}I7TC5ZwyKKlcw+18VWVj@Y2vmJ5#GL&YkOi!+Q5v1*vx72jC2z$#aQSSx3!RRTHw zlYn3B^DV-6mM_WV;>F5m^7e}79*vhC#Ir;3d@w}tdX5o0rnBRJlJW+0R$nPgm_{ z0Q+gC9$}T`cw`XfO_|)@5I6(5y}Sn_!&wrPc`$O2LyUefas?L@B#FnSfd%L z59?ILVTw{?GI9K000!k(GC&gStG1n#L0XeqqP)1{PPGMOx0BvWgTY0FXi$X1W68^rK zLJ?yu`#h+9J`Dl*V?E`rE*lOV)D1}>b~p&d#g6U8(+> zsrHb($9n1X48tKsad3BN;}FhaK2NEoI35?J#z^A$Q*k`rU(B!;#QOD07l%I_{svpZ zL8fYje^d+4$t2JDo~3*RdovtF(Dy9mZQ;iVhsyy8w(BCkH&$TBWByMuAM7WXs}pmQ zgE^9L8b;@Y!(QBC)rHpsYtRsefqQ@`1x+I4`Lft{ghvnR2vuX}?QT~c53rw+o>(~# zV`^!(m`Fz*=EIm7=p92`t`Yw_iea;gs;{f+8&dtKY}YN$aplE~7>37836JDF8-!d| z`jD=quc#lT>U&asRaL(TEtnh+f>=AUT=o8__!ewg$L8`48G9X@iyhbk9t3%R<7Fp| z%5}_p81t@hVt9X~VtYy>_A%7TW;Mn3M<2m<6tQ)4utgHy_a%exaf@{#BSUADCWGH; zD#m(`fTqW^abBC&qCQ=)Cy)TRn|e3 z^`x@dnXYji-)7R?EKOEG>uOu;3K+IBf1A6pYQ0&t=1^;G)%xniVzw$VGiM0AJ6{q`5&fhu+Qbd^$bE$ufW{96)D#0D;UfG0M~(a1+=0&p8BV(#!PIvdaFtGn|;l z_&$b>&0f_u|5K^;(fqm+b7@Jd7F+VpF-_a=r$EvN};zAr?%_ekKZA-lYCQ- zp@fXfO`h3adl;xaT)`eXs*mE;`py^gbXT>E8}6*4CVmUv`95Q2x9FBqf^ZfTbxk- z4m>ZE?HN?gGO`=!gQ2`dI59#wRe>$hP&No`paT1=tC-*z0!#J*^SI!%R3@e#ga+RNQ2x>Kc1C8I7XW6C7w%|!q`Yqg z`H;GSA(4X!99RAyoid+-(Zab~#FNI+G{;Ca$C@Ou;Ts@U+&HM$lL+Slw+}>QVCw#ddEOG0o#3);D8ZY&4CV0W!;Y?1&DSuZ9j7sI`Jf zCy20usIMTJ5JXxK1S6(DUFPl&U>h1|MJ4wK)m7^p zu+c4R#Q>6Rv$5psv;WDonsc(0QPi4Q zI*`t2!BWu&#JUltjhcEn#O>}2Y}Zycn>SOf#iGKfPp#RiwfI8O`Voi~?`ieB_9R?* z3Eg&WISKuEcqN$7OQ9&{)^9#k!?ii$N8=il=jN4)t+`_BNNl;Ou0@DV$`g6c{Fz#^ z2jy~9?w3w7rZ~#ApxG*ODt(&j{|gJAnXCOguKlb9u@an@L(=;ek(&@vWtNiR7@Kb?Dd*2K+{%^7_vabf6HTFfq3hqk?UW_8sqq4~ zMG}7Z@ef`Aenay4^dEWR5?V82bRp>33i@T-gYbKYx8CI38fljzYgMte@CuO*{&h<` z3OBK^=igtC@%LAkqi=ZnGI6W%Dpqjw236iwl@Flun@2&D))a#EDq=m-z;B}}H%tG< z0IDodm76=tcs~cR>Uk>HJ7vt7;8iB-Pk{}CQGc{>VkET1&T`!d6$~(#q-5vZ-Q9WMnJt5Kh9u&CL#o)et2C!&Tiw_#v#}rXUFF$_&Ij{@cJP> zPjLs-0LQuFC*wox(9F9P$GM85D{)+Nxr<}H*eOX)2MWMubQV}-R`}U;oV)Mm4f*Rx z_HE(E z^y_3Awn&`r_*D*C^mFaDJ%w|apKI@_*fwf*xuFNJ-KW^TYA4u!2C-VW*xYbDiHPXe znx**VUq9x18EW9y$%^AIY{<;}6~_q0kxm@T@!Z3XFO7foD<6l5U+XKDL=atZ_2HlW z87TObE$|`9E=ASehr4aK{#r(*5V!P)+to@g|m>G+X z`Zf)<4MV<6U^O9G~F7L6al7Wbtn7FMCQ`-EdZnuGh; z0{4-K`#yvsx=(J)Uq>SDdr9~)+}B4jx0d)a3cCXHa>Z=570kbbSZzGaP9|PRx%g=4EZfimO4a?}tWX zb`P8FG5AitT4-Mfu~wRo+2hx~#<8z1>Jb)|{s}cxhMk;;A#*m#Wu+h7bwS6l{I6nW z<63H7shU4;Eu;7j#A@t~!kI@W5DexKHq+Qxt8RN^jnXd0$J*aSr_efH24@^at*cb) zc-5LqtxpbdZRcOi)__fa>s~odMr}V!3w*47HM)g&eIIMTPdG9B+ETHdpca{oy4ZX| zvAuPUSY#WBRma0dKjO4ofJEG7;xpO@3)tPfF)(Ma!}h*azp}gSJE0U7TdDc(BUE?h zGm7dwMb(X{t{v=J%s)eJ1Y0Z?<7wP=7%VO3?Y1+76T@QvYbDr{6kA7PdseY6MhkM_ z!ywj|g96yRW408Pi=*6gDmPl?GAVZ#V^0mpb7FpH8z0q_ojpHlK3j{G)O=q1sjvMs zVLx%|v8dUD^Hsd{YX?zfcP7W6KRDx{#Hx`(g=-$)I&9$nvjcV;etyg(k{gWmiYzYAi6{%-Je)K4r#uGXAi!ZQ@J1L$#kd?1wuPobi0wTrmFxV!fsIYS%c1%O?jnLbWxBOcs{>7s0SWQuxG-X1MB-B9$ z@@<*=YGZ3Q+BFlfj37MFGq^U|MNN?uSLAlKTdQg-YaK^6(r$^Jp{)MG?SMw7MoZz1 z#qtp}&FuQ}&|$tR^i?wnipAm;qbn9S^IbJ?9$F9-^FgdP`$3m(on+vE{XFA@H5!KO zR2Mc5;T-0d;fzomC8E?=i`|I1S#gw{EjVfrM^_IAP2tpN7lR#LUFgKs)Afq0i`E!$ zdDTUI;m4Rzj{q4a`#gz6qdGCarjQm!&r{B)BH>^f7L`V{|sWa@G$%B*$!;4ps?4ma*pp?!W6-R;uPV;u;*h? z4PW1)*lH5n=ZdYDVjD(m3wpcu)Y!(#AdjFAs@xXr$;>ZQuC~gZO1TtTR}JW28SL@- zR)%}EpSkR3hxSw4SZwnVh_za6!-9hTbetgth3$;W78GmI9|oK$(PGr2!d+^k z3hzf+wlgIaIvHvO*y0Q+D(t0Qiwe}k-k)4sif-wQZSJ33n=hOg&Nx-EO_f<@T#db> z`K4kr8;LPCfml_8*u3`v=IEHZQ|>F3o1=0IDEA_b=orv(;B=L#O_{G%roYOJq|8m8 zjN`zw?LK&ozXbG9FZoMAb^Kg@Ago$$l2wSdl%hpyLHs?SYW81k>nkB*+>KS&+@ngj zpD6?U7Q}j02go`=A_Y0N2Pb7j4-#}0XU)_T$ zc_I9RdE~OvrBGa=jO02^9k*cpH%nFPeW%MvR)SdHb_@Ch z@%$m(bfl$F5jsUAbWp7)QER9=)wOG?TH90Wm7dn79HZ^?tH74kVlg&?ORLDJ%R4=p zif*}DEXHcFSk4x?DUbPh_NUVX+j)xZTCAXEoMM}Y7WnpV5bL9^u0@E=DTN|#n!1;c zf}KWk5E``3`YNXHph$8FB($z+KU<8xFJX1vOLf3n!&4-l)7C*zb@Jan^d;tQJ-wV#FT z=XmYsLG9-$_A^iI$*M_04qmJ!DcYUs%Q?d%Zq>2~mt{^*#$)8(=?M-`c47KQmq<%k zA{1)Bk%W&E10_;zZPc)Lb)QCbg<8*fM=CXiTWoFS)UgYwVyW`tB{ zdd0EN53~WanIfLOnrAHe3-E0^n-9;DobDmPW- z@+kK>W6xV?oToiy7oL#zGlKne)_$64KONXl9rYON6=tJif!8&z}8iBQG9D;P^O2nPep!^UxdY;A2P=~4j)tjAvV z5HIaiL%(o9x`M4j#bZ?Q1GQw3Pl8zAwFwN;alkKNivu?C`Ma%IkIUfz@8f>oV_~KP zHo*bDRo9BS%)R?U(H%{f=HDpYmfmk*C z5$t5BlO*blKd~;EVU@W{Wgel-`(ku;z>U-!bbxGWZ8PZEJsc3@^Mm>57lX7E>})Dd zSH+2{xD^$rBa!(gqvL?7V0%jh6A)&Ag@;E`f6sXmx(zN7!-W&W0pA`c*q&8vdr&Nx zlN8$xXu%A)4a9o)oB%fOsX<=}U1JsHCaYXumAjmB1)Mo<;&V?mm~5E-y>A7ZA>KB) ze>O9;pK99A3GC+wwGFET%F1k#M@YY_9QV)W6qS4DSi$`%h*h2XBU+0iLw7=^F0%+c zg|T^y03Z1;hLQcN03P{c75Eb!`c{E3SF*x_Y#E9YXvif{&CB@1R9;-gx21@c3`X zh{rz_^BQ#^VqUA3yA3Vy_)-w-vzEZ9O9KaCFAdh$zzJJ~xgsK;gbIt-;AhBsiMJQN zicyI{^pN*X-mK$v@|Uc3b{e0HAYQ=F7sPl8t%m|WUR^x~yIV6~0e^Y40R9QYY8C|S zOrLYXmg!S==?c7r)*Rh(`gq5vCkZEpF;_q}ruN@zOzyAE8x&izVjDti^IHUr>E*BA zRBk@y3RKQexl<_D(+d=D0l7@#+qj%EH>%9`nqr4ia8v>MCnA(okYp&h2EA}P&y5mmT(v%e)E7S95>Aa zTijH3frFd8?-9QN-O^3o+3i%}#BfubVr#GFKAqT#6x)4AiRo5?Sl>1aVDsG6Urqik z>S1%9%8ggKT*}=~YdZ#XmYJu;kH#~UiKt9ll}Vz^WXM=|&=~kqBP7v)n=%O`+D*NA zv!g|~tYz0^xGBb`b$+iQZW^IOs!MpcD!kj#g6aPNi1qo|Q07g4$4z^{7B|T#qx!YCl z6_tAz#47O&$i;_SRz8l_94(KdYryUuH%{Z@XqU^!(RJ`R`a5bZTBLkDj;>=rj$S8D zHQq*fYc5o!7pv0YRC=z)6jv^adMlSs3gdRlEmFA?R4$QneIzs#2G*0=nAKdl0#Bt6 zHYKFMQ|bJDi7AEGT2dlF>?N7+$t8MSy?=Xn7@fR45IKR%RG8=@?b?%%%ja=v^}?EI z<)I3))}nl}F2_n{C1B;UhGXY!^~SPijl$;N`UaaD>ouI$T3fMwvo6IctaZyk{1|)* zeta<;Kaxk`N0T)CxO4)3oIeRa5;O2)UlxAU%)yTu)9_mJiyvPu z#*dt3_;K?J{HVPWKfZYiKT==9j}fopN0s&Xv1Ai|ob)z+r0v3w>-XZvh1>9>@d5rQ zp^0dK1q(Q4`E~VN{nc6vDg&PaOD^z=fRy}w@i1e_D_n)GBs9uwOfHdGN=x-cH24K@ z^MX+uf2n=ipTklL_dq`2h6icpLUBV0=6f&3ci{pX1v$f%<3KFVTTEp5Cx9af*PbI1 zOKnbZ-U|GNFp>7+yp{M(3kK+jB>ea{)h$?Kw}W#g>yW|)`yCEOaEy)s9HIu|nwal3 zH{$xgfB#wF|JnjQv(tNor>Bn%4;j*LXgDV~)N^3!CA|j^9oDsPYR|5Hl2dymU(&mK za%fz5dSd6!iR05Ihg0!81VXJ^os$cRmU`JTCud5lv7wCgG2^qRrf251M27%-7W(Tw z#O@`rDegV{ti+s&S<^DcC5{Ov4jnu!ImAz5kIzm|MGvVH!nvtqr%g@G$xX`*CpHD^ zZ0a4CmYde{qVUY@@Yvk&xYUfaoLs#HczdS~O&&5dmHPY_sY8Z#9h#ile;8qe&hjf@ zZ`!vXOaEbg`v!1?r%uh9s`mx><=`tvaqAH6nFv^k{nMs|L(RGk>vci1iD{YRGQv}v z*_WC2NOK$p#yu4l$OxxpPRni@4^tJoW6v z)-%V2)5eVnhsTG`Qt>i&I7=;V!_7$@J25Riv&>!Cj)`OJ+ib5vS-JKg#tEr88R>9d zMmTdq?nDHHU*1+D9&clJElz;{^hSorIGA;6)~xV2Kb)Rj`wmHt@_+CCz4|6=7zFH6 zj{jO$G?3P|VQu|mv!-Ncgb{*%-4evX`zplg+#4A8A?>CS;P-zy_{*`k%2nFlZFK;L z8mHP=yR zhdT}=z{KW>ZR|ik{PDQ*>Uc@a%_^EM<-}p@#Fno1n0dZp`3fB8B*;qJueC2p4C^MV z1}&O1ZA=9k%7aw#IHrwpmaOvSqH#v+4W_`u#Dyt;IQ_TvMr~(Vhw0v+qCLvM|&uAN&3{>X=xdWT0A6<$3n}Ml1pZK z<^+v#{**r0nZ3k#E&7|=?k1$vv1u6@W75V>mK)sm%&wWq5b)vE!XO96$q3_Kx1Y@LOn32* z=BH+6NtrYi3s!XhluMnFo;wj9%1Fa%sy77sO?8ZF3;X+@G;K;Y9BWr$-VIT|x%~z1 zF9%qZoO4-$d|BYOKn3@+V3a#5XctfN2Dg1m+SJMJ_#NxnN_?b(`zt-bisUOAVDSF& zY3Uh`=X{`izm|7@rNN<}a^))m=fB^Ms?>_&)8CFMn>jWdJr!jXuKvLNW#ifza{2dr zaa^W75SLCb9zFE^hX8JO5ktP>fmBZ3jcX5a@V6NH-M9}*c~@oRqvl17_L!j-OFlX> z%G|Fvq&f?j+m3aN%Z8*)Z#Z5&+wC%(LrkM``_sHBT_1Y(`R0!wPdRzlf#~Y97gaX} z**BDFCw52Jqj_DD^djz*s-1e^xlS)!CdHSQj>hi`>Xeqw1zift7ufHrS6aFT^mWi} zpx=R(fL>a^w6s1RHcSNV0D3d%aL^T?GeHl6E++pZ$b)_h`Z?(DpnrkZJ-M{B0nVcP zgI)+a5p*QzM$l_O_kb<|t$Ipn=}Vw3K|crm3-mA05vM{PhiPwv@=d4jLHQQIiKjsx zbm-}j2fZy3@}M2gfIMgk=wF~oI9+RigX#8-AP+jA3FJY)z`5Zypzq@lb_wVxoZ-F% zy8c|qgWin;)W1N-;8ofNI7L2y&l+3^n%W!kpvnCp4|??w$b*i?x#~-x{f9#y^z@OC z2Te*XEltGHcXu4L_5l56Txsb<&~-R&oeTOQ9?7i$eI>WFbQ9?L1vnT5-8{dvv?iWX ze7CT)v?*xrVjL2J4!jTYpqp1f9`tG)y{-U#?+M6*p8Oo-L6^J$c|4oj{2Jsz_r6nF z+86Y=k4sB4KwsKXS~?GO!`G#yD?zXSzO-};=o|Y=OZS5w1dYeRXN@09OIw5TUtJ}k zxT^+-;%3IjopRh!HTiZ-Bk=J!JG9LxEgcA-hib+5tX2Qw+Q-hQnHTDE@&(P#ZPbvW zl<&b`jz{05_CNAR;(rNZGl}x{KlaHLdwbo|(iY@(trdS`mF`B32~dnnwlBp0J!o$X z>b8&e+MfmcJG4*nw^x}cH&FgV{69aTwDfp?dtXofSMZynT?XLjALX^z#rT_{9WQQp z`Y-d^&qF)q2e3Wa#$TnUtA8lkFGc(9f%coFJrTTIw7-S+QU3Pi{Hj$3csds2o~kF7 zmf}g3r$beUjn<(3fP>M&FwB$RhW7nvzrZhlrPp49_G8dLo<@895AxdUBTrOA`v`w~ zmBDfYZQKFvUC>^U4Tqz>E7~iv;Y?e;nZN%uPyb@H_lEp?{`M+wxcb+iy#(#47>DbF zs+Yv^2IAX>_Vba)vIFuOWNa@%`%P$1^tWH?>93ENWqWgf`xvji1KMvx`$Yl$?OgrC z(Y_k_vZD5xXy1%H`LMtLD)+kMTa5Oh$d~H_?Jv0PYta5H+EW7hySVzdp}hg}>hA&h zA6)qov>!nGNw9-wzxXP=f%f6o-G7ffJU`H0;I?-_`(+JFOMgQ@p8US5j{I=6w?bYn z3dqlK!aWQbuBIZCNRD)-0^il`v!c@p*_|UPrhXh zM?arMe$uD3bWcG4=dS*lXkXI5wDiY-|Ms~4Ta5Nec(}JUpnsF-PlU=fXg_6WY3UjM zcI1$%b>x;1@8OzR|I*UZs(uW-=QmL!_k@7|;PBE?{+UpB9K2_d_QP0cgnOoA?fV4% zx%X7v?Ap2q+FOn(Ev*-@MJ?ABi`LBbtExT%O2LI@!ek~9el-cCXil4wX`E?m6g zwN(8ySTES-t9UJ1FH~(yu~xLTVr^^MTBWtNRH3yurQWqF|GV~HYo9rjbC9p!_dWgp z=lSP>%vyA-xpzpf&(4lMM zjwhcKq+-Js_fG5jx0`|@yp-%W=OU4k(*cD^S~6-};QaG< z9y(Ox?T6qp;|o{f{Gq!K9a8;1^E9*5s(@IS=)>mEFGXf{@Y#Ppkz zLHgx_v>)fcw(HQLQQlZuiat(L;iTd{jB__Xedy5mI2(^NHlB?0Tc1C4Xot6s;MYw& zE(Lw^i-!);f`OP0pC}uW4$U~9@f&>N*?XRJcu+M{>2Mu*zK&`*(E)fcs}XR+2cW}q}cTMp$+Y?NAQ>t#m1Jh8Co zPHoI)Sp`}jN`SH-Wp@~zjjt7My z;76!AWjoGLd*>Z<-0^l*+qochJsMws*3)MXdg7oRWcs~aL{b`Wd+K@@v$S6 zfJb4XLC1|CU7R3<4VphR3#JZ)Lf^v9nMiDOoj8WW0;XM|_EowP%h*I z8RKvq4!@7X!LO4*G)61t^x{m~gq)$Eq~CyJH*HdQJ_?b?>BN+XYE+~E9hEjUolcN6 z!aIwQ9n&AoK1dpbzk*taILaXgA8X%&^X?3sx7`3dAmH8w{|dR3ZNu(4u(#_zhGn9; z?!)Mlh3<){ebdk$=zbBZ`aLzp4bh7tnZF`UdhIDxeP$z0L~gRDJPl&X4*W@P03|1* zJ^UA9dl!C}(V2D^j(l>9$ID^Hj1B3})A2fJm$5PO79GEjj>x!R z=;d_02L6$8;n3^p_)#dGaZw}%yWz(X|HT<2>3Bbs%D7~(Qak5cP-6k4s_3z$r-$5T z(?{OjO8~RoJk%C&e}m`T=y-XhN=AhyGsZmcr3Djob$m zwuM6*;T@Z>ZLpj>z%^uhkOVsPzTuFk$9)sW>GUSx(jh+&(_560d2p#Azsw|iT9F(y zZpg1x2ZSSZ7i7pwnM$?D$MCZuFQ-%Y=0rXNaL8U&$c-FB6}*y35i~jS0n9$+x2jMO zxr7R@rjr*RADK_J{VtPiyD%~sxn;=jm7y1-NA4jFr+~rz{?uyJojw`IIqoN^wDewS z=zgX(%%*Bw+gA02vq^#*urpPlSk8%5d~)h7KxHk!@n(0Cow^*IlzlM_=`OZi@^CBr z95mA{v0W91+3&*~?lRl`7>sWA3v{l+cJD_iCwl^&tF~Rbn$FFpd5wFz?fw|0$=Qox z5_hF86=dH_vd^&HQNSOc-9fl>>>;yIT9};*sqSif2;r7ylU?0LJB@;|GW#>aHQSNn zz`4?L(y5o9p1KO0S!t@ryX-JY&;B!&dh8+8YgYDXxT?F(9&#T!HcWU8SW@rCpEUJ{ z%$!E&(iD3*TmlpVfVfBt57)yUu6{cIik!CwQ(f;;k@`JNRZ2zFL{<%li8XZ?H22g; zMVunJxc)^Um5iVnSebDkM{!!F1=Bc=Dv(RNOzxt<`MTQ{LOIhg}A})O$etU zF1?EHx~D_Sq3$sdnCW(+hAek5YRGn90sk=fM9`0NpGR%O-DxmWj{7GlJ;Kew-;wTC zNFU{X6K6-eVf-EAej6%}b$^2Tk9OOjZLXVw-W}&|Kt0E}^yb`n_pdmc=Z=Hi3GRC6 zFws4TzmweO!86(YCX&|__cV0%RCh2WPIIS%GTr?v&Q5pfi#s#i2FT5~oNvPrnK|RH zz?qD1;n+D1I%JL*a}x;ZD{!2fd1d%}C`1-QaOTy6$px&)1k{)L#o=@!2OUJV4u?16 zuhR<60=f2!I8Hwg$2lmxg+k;UGJmeE@RqX`MnvhKI5X;29ESs0H-<^$$bB$)*3B*j ztu?x(!OFTVn^O7aNEX<#zM=}f5ev=D`fBzSKx~aX4f|yEWz%@OEwYvhw-2UNyghOn zv27b10PTUur)W;rU1?th+m6Vq@QJLu(;h%!XXGCw^Bz^$9Vw*>?p1|7kvtOmbyet( zTm>J=+O7(FBXvjyS@)^JzR2rT+x@EWM&v{)d_xruM&=Oa0af^L%nHIhqzaZj<}M`J ztZ!z$f;NQhF+YPzvmQ&UC-d54a$v2jZ>f@Nk7xm`@o^+PP-{Z@KiK&350Tesp_a%aD5uS{im;N@4DmaI{?a8nkes`$Yu7rm?rc z_?B%szemdgrv`8E)cXb1CGHcjyXBq>4A>4p^*~MVPad`{gPWj}`&IP6<*o;_?MCo7 z;O>FQp!*_h8*)@b@DV641$>1R35Q@@W7l0;`enSc7I+i{$7J^rM>4nl8Me)yLt98Kes6`}V;v*xE?kK^#s zO{mF@DC?I+)}b)j$_;1Dc8GO!2f6Xw49a}g=yg<>rwSp=AhHUA^jhaQs(AP#R0b+SXEBXsjFYvDL*l@<8`Ic?!M3Y&1`dh+@usU*a; zj>^e8F-Yo-qndU4q_9!xGXhWf3Mx>sLs63UH1&Hpd>xKc$@$VKLP59#$13$cjRS=p zX*n%OAKAy`{tToHdY3sIrn62l4ucojzf{MR5J%eoz;QY~BF`B%HXK3sspK*&H$vWu zBo_{VDUaxs3~)^Ti>iKyzC?)-;qU=e5)KpB_?y8M8g0{9kQ&^>mucfa1O!w{1gXJ( zrshxsHvpuxwyl(As$e|)H8eJd=&8Zo)5+aH9ZuBgnbhXg;9jmEcXB8{buikb<|3g2 zcMGeVr4E{0g}>G+R#$BBRi!p*imB;Bq5jv>-IsrOSz&$mMY2&^&b}H$ty* zhK^N*Jj^pa!0%y^PUo89*u;fv4|oSspj@Xc1c9vKkN6^n0|TXq`>)(eaE|6kh+bn^c#WzrPmp( z&;}=+{4cm=-z5|2QYv(TGiD^T32xbY$rO5(@n{fJgFA+3*;9wUr|a6zx<3O=COW7g zbg>h>9>n05H!hj@BY0(uaPSgq>PL(_pK+fW+!apna)tYlafYzzQfunD?`uFGFPIhSBDW6sli_9>cCsNF41iV1Zn+Nh$*DY z41v0AC*#BvG%wS*GsP6rWrjdqHsxTvyj*Cmac7A<=`us0E}Q=kjT3n*4Q{o_lP)s^ z>azP8C+)kz;Oa%5bQu$<%ckynJ6_x~2G*j*nQk-XN^9D*cj6nT8+NXA^h({)rd-P% zOzyed^H`4(+~oku!Bi4|j(BTE%qlB@@#qspJS@EBE|J zCySD1aLbNMCjOHW?`Uy_ZI?`JM|GjGj=H51+_GK!MhK}OHCQXYvH6c${1tj<{RDdI zCXExD@8obcgxyF3>3`CI&5R2ng=*X}g4@G5L+A(Y%Zz)BaVHwwcN24<}?gWu1zHbQR`_5lAPUO*-#58V!$P?c;1oHiHe~XuQt-+ll^2GO^lglaJKgLQS=gzx_JoV2Z`?=rh`qX1z z9NK-u@#IJQ{$E4v`8H}EnePwgG&*45+a5`A#(of8Yl7| zGPrb+Cn3TF6(X-OOw6+1z#_g7F=d3v%Kh<5YJ+6>Ld2A75e+xv>Lv7a$bRTW4OI&z zaA@~^XOu+455@Vnax^?61USEnhG)h3;lnB#o)f|j9SzT-vee+g!94$4`YSC>qTv}t zo>um!;w|FUhCp8ZJmVx9J~g$5;?-*n z?iV6YyxI`RtM6o-bl*J&_e;Tj$kA>Hx zzbq+y$Hm%dZx*NBezE7GrC*#jV~>_5PJ6*e;Ti6r@?I(d6IMtfs)R9j1zhH z8{B;&Z!ha<2$Xc*`D>$yv&_sDvwT;>OyV(R45cG~8Ly-^Wy-b4O0?c5 zv@v9V{6h^@YZh^6_nkIQveJc;gwR4Ya$aPT(4{KptN|--lt|9$dq&sQrgzrgb4B?p z{cUD~YIE9;G=CSv#-mopF1SPc!9O_B3(<Z^#m1DvVBh2mFBpU_oF#GQlF zTD=NigG?C>`ZlBDL#NW$AXAnGk!;nVX;unpoaY>c2IXQpzEf+V)>W$p{bGVN=oo1b z`d>9@yv$p+=^XMJSW|v{oQpiGi599hV^rxU*@Q~I* zEnLT;-FM*>G2owre07g$kTT$3f_yQ5P*41>1#4<>Uk1Dj+tjPMt}9d#A266G2K;+a zu2FenWC)v(GEyJb0GUvI!{FW&+-9Bt7(y>_TNo!32m0|nZI8EteC@uKafYxBxSMxq zd7|g2NrL-GasHR-Yfl48z0yWP{ zp-9Z@9fm;N6SQl#>-y-89op=^7pF;}{#XJPZlnVBc?r~hJtx=?*3{rO3DojB1zEv_@TehC0^EJGm2s=HsylMef# z!M!Z<#IX#49P1a1lOFrT;Pwhm9Lo^Mv6g;A%iE@R)?AoP_uH>UPjM_mAje91AYRY& z4DNR#PaKO0%CR;uOw_!?z<#e`#<5Hpj`b#^#F$#aeOf^?<2L15b}VuM!586MzTPv?#eZryLM@w(@{oMz|v0yIcSPzP0@en!ztf|3Taja$c=(=P~>zOVF z{Eiqx3}^^sz=ik5;~p@$Cj}=4WP&o_LkyGY`)dZa+h;&ih5^TYT?>mJLZ9*((3ET0 zfYelFz^PUWSt#$RqhP?zLHnVv>H5^WWjM6^E}ba`yhaQt)Awt|fHHl*E*L+3zX4cG zO2nc=Zr7Dds6GqHy2o!2%Sfmi0)^_0jFV73WN^KLlTbAT3e}<8v^?>yiR*@&6Y6ujn$K9djNeq15;I;}*Le&r`R3BuV=t;jHtnG4}=qa9N z2;^yZ+^OY>o=3sl8h3}t6HjA;^0dsm;?*oOusb!(gsLgS(>60ol+=Rm@_Cvm*RrRP z3n)*UV5N{N<jj5CC7 zz!l%BaiZrQgKHLf+ZksFJAm86IMLIZCGBew+)l2UaOaAidl+X3 z{lHD)bRv3o7+kx^lRz~D3e@`o)V~rK!N(Z zujuxjuXk3?Y_ZD*ktcy_2o$IlU)2B!)JlWfC^!jJL!dx?hH=|i-e!ZlK=hPAH3SOO ztGHpJ=aU9^smPN+WrCipF-+8a&%icmmeA=VJhmq3jKc@5C+i}aW}ILJ>#cV46}v~{5NOQ3$r zb%|p=2SHlDp<;+V7wK8DA@pBlP2F^r)rgbgBkj+iHQ87K0#GtLlp05|VT@p^v2;Eoa8PR1DmJ=S=FagS-Z^(BKF zFM94_oFViBchxl-AbLJ!a8pIzUd9;$J=O?c8?Wa_1~*M`7$THi4B;Sfy^Irk&N^1? zGF|kP0l^SxKxn=$Ue6YTnR0EUrNaZQQXQ2lF4J|j>7DhAQU0R<-%%4A z8v@z*YmDQ$h4rbyeH`FBV`5`NARAwMdAz*2P)9f2mc9`iGeOz-BZhUcn&%o=z-MDq zra_l8n<%LT1${O)bP{Ena5uA9M zA&{rt$~e)p$>3fQJ;l=uL3!FGTAt|nHG_Ly$BkTZ zstdVtNv)rn*4*GXo*|I&p6Jx=k@03ORMKs_!*4t$knyHXt-rIc>3dIZ;h#An)DwHl1Gwjf#Buv2$(U84QlM*GYC z+A~3EKe0oLj@SMQpZ2B22)(i&+JcjQ8_VqJqYsiIZaA-eqtg0yv8{2gfs)RDv2YMhwjQ-f>wn}P|-6jw1! z#A#6-K2w;on1Ym6rpUHZsI7U0gJ6oHfSup0)%dwF#jYYTMX{J-6Psd*m;!l(dNNcZ zPR^4f{kU^d-M4PB82wl=Iy6=OcbqmlG*yF>eo(YfO#CcYB_=LHMcPy+`E)mB=svGW3y#dLSUWpIa=tA0xU;Iv6hw!|C7xu%-rGQT~3eOVqG&S}Q-% z-(O5n{k6J5i0d$PU;O z&emF}j|bw=?)yQB7$PW!kSRvUH^tC%*Mn)=0j6HabzPyWw9=P|AyUNQWr|@4G{yLg zaWcgyGPtndWQt)3G{w0194$yj#S0BCRSYjv3`3wPMnhENWaxg>;D(4iqz3&wSO~qq z{fcoicK_AjTw#+$UYJfwYMki#zQKJc@}zH=p!()ghKZWfVJL0sk2K8mjVYsV z-e#02sSzJ*1C?LKe6p!)M!1`$3<~y_eGXT-~3Ga<{Qqk8n+_e2%nhN{8Ee{on;8rSvN3FtT6XfvBHajlg=^(>a4(NTAtXU)!=^R z?<_;0&YE_5yqI%~Cy z&e~<$i>frV*NjS5nRM3oq_dDJR3JSeoyDUPzso0m^L?&M9Q0OnyH@1~{x&l~wRw8A zRzceQQv>^2O8DE=CncDmrIp`g>eF0iX+a5>n?Y_n3(&oFQ%`yPp zEp6uYCN*G94Hih7`?)R|fUZMXtMYYevkX9nKm(Ba899iT0qBPYw_R{D02u-eK)+b7 zb(R6>6N9@?{80uVL)Zj=yc}xNCIir1)T8x$K;%i>7y`x3JB*Xe-fD0U3Qpq25GZb1 zDzrS&^KOHCNc4nPsR7RrC~ihz;!T_A`HI1PQ{+k9FhTjyH4GCqheB=Lyhk+5Bso)t z4_RN(!bC}pc+}@Zrd-Q28*%|PvpLF2AiEVEy()Fp&HsjFl`xYeV^(LEa zem1s=GvDPlU-*8gR~%}`a>cPerml%sA2WQ-ixs^pt=z1PZvXU`j$8-|V#J!DF;tZV-7AaE3qumyJ=D zHu0>r2G=V%2{=QbfV+lq;#>C^+!oPO0?rU9;O1dKqfG+fRfD@p^3dV1e_@&;EqRX_X^Vr zenks1vkFtLMQnW){GqdK`=nD8(o&yH$01(y!U&*a>l{hiGOLJ6(#8dNJ5^BYn^klI zixnfOd>L^aSKg*&SXCIwv~KlcJn1Y$pw9Z3aWZsWV{i?Elg=^(>a4X3wICV1o;J8f zF}ie?Ay8*sSEzBK=SK$DBl4uPn4miAV}^;EGtqk8ymh|LGG%nuTHJJ?O_bD#^}fzB zMZq9d>q<+=V7L(d$3G;5Y1LojpfpVJk`*j zl<1cZn}S=yw22`Cs7dQr?KcDylp$_qm>A-C1FP{F!jxf%G~8#UE#43-e1XLPkC!$hf2cOkml1)lQ-*^zHMmpS9GS1GGHw3AD1V}~ zS)9}m$Vo3?oHTkSro!4*CkalR)DXx?|IRpRc9X%K>~~T_ASb=?gm^u_W^jcfPn?tq zs&A|X8YXJKXkd$cePhb#n=VF)lDc6T#T6R)0t#Z-~JpaIPUeHB{jkE2U$7(Iq zFF)YW?sG9E*ZnhI`e*y4+H3PchPcv)(t`2@!FSb68HUJPH5_fuwC$tjYJnrnHNa2MX5GYWaZ+@da?)Ws zFrlfstM*%P;!`iu4SHYi(1~+#g`^wg=spWG5hF zC&gwo`MY5V{Eq$p48Oonjll253CzG<6Fd+Rfsf>CV7$O5;{{3)0+r#Z4rTa=l|pjz z-y9AtzG1(Px}IlErs;ao^lEU=R6hTW*)z~iG+lT2gREGyRWNxlD!4~|dF>lqL9VGF z|8L}vUsh)q@YxP?_V-l%@?pf0LrE;K<*b=+W>ImHF0PzOUwI9EdC_C)Y^4@{GYhXB zuT;B5-P)qBd`*8P1KgL|zvULF-v$EG?z`kn%bKNJ_0q}ojV?^hX5kk~tJ1Efeje&Z0R*I{R{ zdM_}}?t9g!*D*$`w^FNj{ur%ZrB|0M zR4t5mFiGxN(zms_EINN@P*~S_T%Zd9eGVj?o9TRsrOt|R*>anx!yBKqf z!Cdaa7zuBsfxE_D%G^*4fbY;DcSqZXc^V&o-8#4OWHLOaRL zPnfzv#YnR?H`gNqh&gNC`LXiL zlQrj;4Wb2iyyY3)X2u6vK`GHfcZFCTw6!<@kzpRa^$; zNw_s_7ArZLYl&B{cJ>K;9%kZgdK!WZRc>ba6->ALZiNOj)#m{9rxcaj)u2o8^~Q6V zJ7(Nxh@0FFXX#kG9fipBanKUfrHqNW-A5jb4yI;n&h;=4z649(8$6B?Lyb<;qR0*% z-JQgt(_FKae-)-fC{tqm@g&W<)*$)@AeK&hiMen}ZR7hf>qiarDR2w`GosOMDw0p2 z87L}wR6p__GVyLGg!820JzUiUuFCHF*#Lpf*0J+&+Wx6hc_Sk@B_Y0Nb#&n5C`sGY zJo|+V?V+_ZIvdwmcE7sMOg6Rbq4tEqS?R&SqXrMPGgDk-jX<82o_;b&urnWq(W&#S zQuH%k(G3nhA$>vm{B$Y~8UkK?#dM-NiQm{rSLD=T_M{Ou&Zjx*M0%DT9Gsr6aYV;Q zHe=Nsj~X(vKsa#(J`YOJ(kx;c60%QDrwU^@cQV*UgMX+xfP-YRLXK7_%SZx&D#>O^ z>O4sr=Bbr=jv8)zl^gC=4&$e7YkfwHLt|#5ijhhZy4ATu(g#lWtRvPju{f}>eg zi-~n2V+~=_K2R0K6f)~HeTaDEy5JB#J!WuS%2f!S z?`18`ic@+fD{Yty@=b%u9}F`h7Ocj`RPXF`i%whCoJ0b+WpnebQ$|Qv_-dS&ZznlN zO+7YAtq8)JF^CbX1d(mq{~VlwzxWC;3ivm(y`y_3rW!L#$}5%^&unR{Z|!MloY~ac zvU3nvPEV?8c1QN5C=@zs5de7Od;%MKv*btbm_qpkD2(&uy&l{(Qcc z_M|*LU8`rzn%RUMe!qTg<60~jfl1bM%+Nm$k0LC#rlWB^eU@4@eR^RfD^U_PdwXva^rbE&JfrAv<2*0r=TnJU5| zBDiT?U2BgVuWjt=s%tVLI_f&>NIzoJR^dWRdt+PATG9kgN6m~i44IM|W*UmNQJHwU zJL}rI)--kkmY~JW)MESwf|VMOoF4qCZ95rPI4M^-;Rl_xha7uZC=mSdCHcF;m+!(4 znAn5D7+FGrUi=9WVbI(7lS0MR@XA3eFAoKSzqNWbYxk}}C+@-v-rFt>=Mo#hbRrne zAGBX{1oAV9Kqo^~@1T|VlX5Elq=p|recgM4seww{NxQ#9VdupJs!+B(Ful6fhc>> zozt9la&p2e9s9~f;9j4EJL?^1>O;aBywVv08Q)X9 zfhn1eJt$C-wa`fopY5atCLQIB!IxyAb@)c5Ea@CZd(wfq(ny?&7no=} zb})Sx;fDghB{BSQh3+MTP0TW~oRQ0%;JfM+^;0(P87NnJiOi}F1CwEk^Yt-U=If&e zNc4IwI!%clbHGWx${82l;-u|z!k3f&Gj#>Zn4WsGwJKqfp?l#0(Eprx}>f~MSjPb}&b+Nu4aawn;yreuzRgWGHq<018+s?4>!n#8|3Mh+(dmaz( z9bl?~q6bt9vvpIob}%Ep&Iq|Eo9wX785SO{q{E4N9A~DJ_PUdLsuMi(U(}{SYcmGg z>?i+O@I5DQzcTJR_BiB`L4g%)xjCNW<8XX&_5mgM$e75Ns<@^}I2Iq9hU4?4rei!O zj)+O4l^XCVlWfp~je!%%)T8%P_M(MBT>_4c$CvshELLMJG@3m#x+1ac*0t( zUN+R@*w^tG?g?l8yWA@~e6|+FCH}tW!&+xc!$pz9)PV zcR=8CI{%0{6FESWc7Tx{2S}LTkjR`A3K3__sm>^P@UAOWb>2jw^7QBA(=N)V12S5? zNM{uCN^sW|2^`Qf6g)r)a)YT(j{yTSbOgi8=V!H8+k)%D!($43t_%7VYBCCqLeKBv zkdJSl3`<^<278>GJ!tg9M`G2$pgmvNk9?^L4xf=7RftgTvn+(m}GBhV`XL60} zb$S@l`}bU!55kb0wQUEHE8>ae@v`hElVR zf3uXXPKa7s@yzfa)j>%v#FMGv16Oj4zbt#E!UtH!|+IJ-x{;ayjH zaDafr!<1)wFM8nd%eDW^_4v={&w$3S!}RAT+R>+*ysQV_v9CL6r#h*-WF#9f>(p0t zo~viieFEg8Rx?#N%5xRq(@70!>eh(5s->{U{3X%o<)8GeHPsJ`pYHz`g8Xyy^8e(} zJ}7Xaw%AK_7iBf6ZwHU|bQj-ZP?z~fcAeDoxHBwxKHWzO(#;Z?-#F`>Vd2xAk?R~M ze5NzH+i`H;$OZ7eH}IS@jWHHg+E%R`-7?l)OO&A6CQ2uzjz?z%$WPZ}X)E8`xPNGp_geNDb}e zV5YYJ!Ot}TUjueKX+2~Jp5E`*mo5LYEfNl%(*A(D2^|X4&0`0t54LCsEVN&9hP_6{ zIA(ur^8erUHhqILpuGw=A>eo!baWcjD5!$@~$)XLEH$< z{Nt)4-Oh0Az$83s3F5g=_{R(JXaw~PeHTw~#^GVnIA{3F&e7QAyzFG}RfJ%8Jf08* zf_RErvKY?;JKHyww|BR!*=UtS%PR1{__X4(Xi-&ZO=(eK8HkmIRfWr=r-M+qsI1s( zigtB3*0n}E+VSMHvC~>oSsJY=uC9qzS1*rN*A&(iM`tG@&at{%);6~HbVu=ouKqkA z>)RU|t&$o%BwW&3*VJW2)p1d4U00WSQW?c_%V=BUhVJP4mhR?gLt|^*#>NI{R9X=& zuBxi2iY_TEEh}CeU0PVa7<)V;gi3Q}TMaE;9qnDHn{_W; z5$$e=T}g-ao$YN+Fkp0X@oA++#oW@8;_~7ubjP~rn%4HZ?iiS@5?zbuw9sj7M{8qu zV?(s99lCVab>i6DoYN~-lr4@{6&J0jszz5zAL8*Z9HFOPbL$STtSUVXojE|0#f3G6 zWXR}}iWTLHt*GCa)_JM}b!SSWWBRr=uGdY}&F%7PS6Y5rVOiEw6}HR~8l(YlrflsVXj99IYrXTNP76j8;z_(i&9{w!M(b zs*07XR3i(^$|_EWYk8cmrgS-cu3|-v)z#eI*_{iYqleG%PjV^c0m>Dc8sX}2?r1xN z3@~F=@$!n(P;snTONt9?R#X)uhAOHGON!C|WyP?+ajUML)f5n_S9L^42a|LXV0XiGy}NUo2r>1l2C z8igEUIUGXei0Bf8CCQtc=cjd8;cdBkxdW=t3M6nrD`P9A=JLYj#TM2|MKMvTZ%2MNGn^vvSvBx_bXA$X@YX1Y-xk_eEE? z_H?ecIvRS`uH8uCGb>@osNSSp(b(CBT}!ve9rW~D4NUAKqPmlu|= zidIw>m#eu*wYQHKV@|JU)jAapXcoM-rXtocG+?&1M|pY?qf1tZcg?7tQ(9445#G|! z*rqP6;M>(mle#M^$;A*ZYI3M!Cg%J8Szu9FabeX!p(-)Tbbp}HV*uf4fMTt!t8wKO zJ4XYCazal8kkJ>H;tBz?P+a-6wE$p(hSDwT-NKhMj9e zO~jzOZE9*B=Pk;FF~4c4N3pK6 zzWJmL#~(Z6*txkgnsR4!bvK+;5B?czDocy-x2|hrTYWRGyV`rYX7seJZ)wA@PGQxB zlZe*(^JZWO@5V%}y%S)%Kr<((|C;4AW^_1Fzs6HGeY3b2{Z4b*#jzI4OjbH6c1FBy zO=BI+U%Hh0`!2H!5)o&?^XeKJTH25VReUe$sD?|b6r`_L;wC`G_$r4-yMRMBQ4=K| z=;_+n8$OGwDwZLvDoZPoACZSTaWa-+kc?LpM++Ar_6v(V1A5#XBkt-Hu3uWsk)1Ti zmzFNBDm>k*h8|jIRN=b-upOqv&2-({h^ZGYSS0-}(KbA6l0$a$1Of8KV!B+3mMo?m zT~b6@-dwn^i;8J5TgG(8*w8an$2F0X>g3yrE@#w0m`2ijn6!R z-56`?fQebW5yYY6Z$w}sNB5Z$iHhZUN)i~u;x47JL>z|Z`9(uJEitEBVkx!ybaKZi zhN*b_nW3Ppw0v2$g=u(OY+l~pIWSwv0AC|lm2o*sF5l$7Nt5)Xu`ijes<>oDSt0ID z>8oIKZaLCEUD&I>#61qWw=&?~S^0|PUI)m1Wt*BaLai^Jq z!sDG}rP6ZTVZ`m8GmsEHr;1mWR@YP~j8!!UX~TZ!R{Yfi7IS{8R>C6*qf7YfTxFI-iP ziKMlzrL(&SH=i5Z)~&fS z(`T9Pf9Lf@ru*NXeS_)#_izJf4(acIr*|yqWQRR$2fQeywo{ni&vbeViZ*(OpX%|y zNqiO4|M-dKdsOeNySW~D1zPHVlKK5FT>pXTFLOQen)b)4o?+H*wsS7Zv^n&WAN1er z(|;)Fq^JJ{@qDKHUo~IMbpKoIXE5FWf_x{_{jb^I#B~2F`#YKLfARliru#oa@CN9% zKLy&jFM}tmw@PF+gpXvT@L@Z#s|Kk&@neP8QMmy*v zcOQTD0I&Y4?Ly}Ff4}2Dm|worfp@aib{q5iKN#{&=6CtSAb77-ZBH=2{|hBAGrxR^ zL|&?Yo%#KrO`*>qk^b^M6w$|q!;{@|=V*EI;g(UL6MqNmBlS;W{-gNAG4kb_W0}8~ z`Nf|XF~9%oJ}a4DKG|~=x3_`${hx2@WPbT36XikLE@6KEC$6?Kf4@)vyP4nrQL`tR z{~+^^($!nfGr#`>gRe2ad^Hd+uB+`$=J$W;(!mR)WKa2grSK00o$T-b8t7c+ujQ{2 zj_3LpGXF1XG(kS~+Q9tVm_LvCJDA`9+1~4zzn}RfjB|*lANfkS=syf}vJc)`RhxYD{RHOU#2@CKpif&%nBV`s z{4<$fK7x<0zo@N=`Tai`u$lSyasA_%|0d@5|I)&@nO}Y_;TYzBn)&^|?y;Bo%x5_y2zBcbH#(gLER-{{!at|6uH!%wNmDSvrmRKW2XaFBgx+fJ^?f zjrqlYrh-oP@&6=w1@rG?e(|3(ncx2#@E0<_{IGj2>vJ{ppZPsasKK~J+at^`KW#7b zpC_3A;qPm{W$16(_A~z`{^9sZnrywr{2%{N6E5faGg5VXcQF50=Fb70+I!KnnlPIO zs(j|}XMXXw`ON{*rASW$mL6sd%<1==l7IwU65+r#iVFndb}r5=BS$Er_q@QWOIgPUZ@y-roe0 z%niI}zLA9fqa^fSfQ~QO4A}mVg#JO2dQ#~NB?D@)tO=ke(sOPS`hq0%+9dQZgPutL zZHj;JfX^#EnWUbdC!xQSggzD*eu>&OU(p9!{?9O-26`erHzuj)#w7GzN$7t_LVr66 zeJb)zB7IIsLN5V5QG3@Wq2H2({=+2ozY2OH|M^=I{y~^nCenW_=!x`Pl7xOcwLN%()Cgq{T@6WMug68a+0 z6SeCs5EJ$Lx+MHpf}Tk3R?ubc;Mk z;XwzjK3a>L`t5Caz7@qol_(xptj68F20SV0!V|>}xL3~$8uJShb3}3f6)RvmJL@*$ zrXbzsU4y%LSiZ*3wml{F3_FgMZm7jC5F5C-Rh~KPCoH%*=6zTtCu0j1lCKyTaK`sw z^svu7@BmdWB}lSjHPJ(pdU|LT_x%2FTzCLRx33edp2(j&H{tDgS-7FsHzulE-LUtp zAoMOQB>vcQWnLC1&sE}1(xWa~>XzW9E3Mub$g5X%46yfrM>_*JVm(rm@bQn*MAbgv zMz1`tjq<(b{JC>HH(bSwW6$7Ye6!;ouj{3GF~fMDk01WNt+_i)rixWRE2aic=;~u< z3*ygumN^)nIrHOr)NN*Y)Dh!4KE`F16~xXSH}I@lPXmj`be(gohl|!Odrr;sosuWj zF%ffP9Q3%sgZ1>pfX9|G{Oovq{2H7XTbw3N1n&1ad+rrEVDf}jbn*>IAny* z_82#wJ?{BHjNfDKcz*Q^BgW@3cs!qemJnm~nBVt!D8}RIfOwuHjq-Ghk3UJPJUyfU zyeKZFfv0ag3`xX$ddbV2SoSPWhskr3crTmf=_4|u2{65c|<>^KN#Cub$ z)d~7Ao;9(jB5cHmQlIHfvJ%|cXCjVi|6GeL=Jhs?b6<*c^!gGszaD2mMk|oS9_(RI~+`#70q>%lmbd z(AIIG>})DfrsnqR6vt-3D?jp0R!)g{tH|R-D$hyM_e(rXtRLPKVmit{2`i-+3TWY^ z@?ltulOsjO`o=nVAHRXBQmS;fFQLjirvN4LON`^ro6h`Yo#3sI21kqjhh^h7P%;#z&mHHm=1IWbC^;^}bn-FwttvZ))qwH>)!9 z4N1R#gf|`(Lo=2pTloze+fbR_V@M|E0MBwMj|Wp>Mrtgd7u!grWkaU>&_S zL2^h8D75-EAFn-H`Eb9r7(qd6T-}2VgRlJ3OB7seXki2eJA4z-K? zgM1+S$;>A>zx-u5k6ZIb{~WBFpiTCh@%)-L+S&LoczM2E4H`j2{x)WieJ|s|qBg3- zyPb)`A&>qAxX(+Q?APg{`dTv`iX7QDgZ7yRzn$^2uO$#RQiCv}KhbDgkN;#FsgLd_ z(d&J%tS^X+52*|XtkM;Jf;TF}TQ{1`8G6E_z`Y_cvxm$WQ7rv26U z@5Sfl5*5|ts-0EI{i#c_d$MwGb_-5;@g4jiQ})7_3{O91;l*!ayzCc#j{LiPcv=4^ z`(M8#lJ(xN&wW0;Ja3de9(%-X+#QDYFpfxn>3?0K(?qrK+)?e!pImdK4`_X#7cb8# zWl!tRyqjPCGd}#}Of6UT5j@xRZsI>edjSXJ@?vILuef8huE) z5#s*@EJ+f)tmE6w_*|_9IP{h)2fU}p*yQ_ym*>Cx#%SO{#!DIzy~Ph`J*HQF|4a?& zKU(i6vmDt8UiS2O+KV^Ojal)Xx*CC-_!ayhocH48x%SR+8Yp~Hfxk@4Nr)!xm*?5L z89!Noy!YdWvit%cpWr9>=vphSGo2dAcpsZ}faUw^6}<3INrE4CjOH9!E1Y`o$InZG zpLx0FJXs9G)%fv6N$_iF;VQP3vT!H~zJl@oc0O~b#+OT?_u=(fZAV{-E6$w9HAfCV vWIG1bFXF%SpHxfX?Q5dK7yMM?XUYOmMUC|v7qK!TF+Tb`jXy&aO@jYF;Cda# literal 0 HcmV?d00001 From c63455d2892e83c7167626ef2cb2852978689707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 3 Sep 2021 18:43:22 +0200 Subject: [PATCH 23/32] TOD: Add wrappers for SSM functions that are not compatible with 1.90 Expose new versioned symbols that work with previous API so that we can keep compatibility with old drivers without having to recompile them. We disable the GCancellable API in delayed SSM actions since that was something that wasn't really needed and prone to errors, instead of just re-implementing it as it was in the TOD case. --- libfprint/fpi-ssm.c | 4 ++ libfprint/tod/libfprint-tod.ver.in | 4 ++ libfprint/tod/meson.build | 9 +++- libfprint/tod/tod-fpi-ssm.c | 67 ++++++++++++++++++++++++++++++ libfprint/tod/tod-symbols.h | 45 ++++++++++++++++++++ libfprint/tod/tod-wrappers.c | 31 ++++++++++++++ libfprint/tod/tod-wrappers.h | 39 +++++++++++++++++ tests/meson.build | 5 --- 8 files changed, 198 insertions(+), 6 deletions(-) create mode 100644 libfprint/tod/tod-fpi-ssm.c create mode 100644 libfprint/tod/tod-symbols.h create mode 100644 libfprint/tod/tod-wrappers.c create mode 100644 libfprint/tod/tod-wrappers.h diff --git a/libfprint/fpi-ssm.c b/libfprint/fpi-ssm.c index 8ceab674..8080f550 100644 --- a/libfprint/fpi-ssm.c +++ b/libfprint/fpi-ssm.c @@ -747,3 +747,7 @@ fpi_ssm_spi_transfer_with_weak_pointer_cb (FpiSpiTransfer *transfer, fpi_ssm_spi_transfer_cb (transfer, device, weak_ptr, error); } + +#ifdef TOD_LIBRARY +#include "tod/tod-fpi-ssm.c" +#endif diff --git a/libfprint/tod/libfprint-tod.ver.in b/libfprint/tod/libfprint-tod.ver.in index 0027338f..c0de483b 100644 --- a/libfprint/tod/libfprint-tod.ver.in +++ b/libfprint/tod/libfprint-tod.ver.in @@ -1,6 +1,10 @@ LIBFPRINT_TOD_@tod_soversion@.0.0 { global: fpi_*; + fpi_ssm_new_full; + fpi_ssm_jump_to_state_delayed; + fpi_ssm_mark_completed_delayed; + fpi_ssm_next_state_delayed; local: *; }; diff --git a/libfprint/tod/meson.build b/libfprint/tod/meson.build index d7c6d872..ba395c16 100644 --- a/libfprint/tod/meson.build +++ b/libfprint/tod/meson.build @@ -26,12 +26,19 @@ libfprint_tod_private = static_library('fprint-tod-private', install: false, ) -tod_sources = [] +tod_sources = [ + 'tod-wrappers.c', + 'tod-symbols.h', +] foreach source: libfprint_private_sources tod_sources += '..' / source endforeach libfprint_tod = library(versioned_libname.split('lib')[1] + '-tod', + c_args: [ + '-DTOD_LIBRARY=1', + '-include', '@0@'.format(files('tod-symbols.h')[0]), + ], sources: [ tod_sources, ], diff --git a/libfprint/tod/tod-fpi-ssm.c b/libfprint/tod/tod-fpi-ssm.c new file mode 100644 index 00000000..32e282f7 --- /dev/null +++ b/libfprint/tod/tod-fpi-ssm.c @@ -0,0 +1,67 @@ +/* + * Shared library loader for libfprint + * Copyright (C) 2021 Marco Trevisan + * + * 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 "tod-wrappers.h" +#include "fpi-ssm.h" + +static gboolean +check_delayed_cancellable (FpiSsm *machine, + GCancellable *cancellable) +{ + if (g_cancellable_is_cancelled (cancellable)) + { + fpi_ssm_mark_failed (machine, g_error_new (G_IO_ERROR, + G_IO_ERROR_CANCELLED, + "Action cancelled")); + return FALSE; + } + + if (cancellable) + fp_err ("GCancellable in SSM Delayed actions is ignored as per libfprint 1.92"); + + return TRUE; +} + +void +fpi_ssm_next_state_delayed_1_90 (FpiSsm *machine, + int delay, + GCancellable *cancellable) +{ + if (check_delayed_cancellable (machine, cancellable)) + fpi_ssm_next_state_delayed (machine, delay); +} + +void +fpi_ssm_jump_to_state_delayed_1_90 (FpiSsm *machine, + int state, + int delay, + GCancellable *cancellable) +{ + if (check_delayed_cancellable (machine, cancellable)) + fpi_ssm_jump_to_state_delayed (machine, state, delay); +} + +void +fpi_ssm_mark_completed_delayed_1_90 (FpiSsm *machine, + int delay, + GCancellable *cancellable) +{ + if (check_delayed_cancellable (machine, cancellable)) + fpi_ssm_mark_completed_delayed (machine, delay); +} diff --git a/libfprint/tod/tod-symbols.h b/libfprint/tod/tod-symbols.h new file mode 100644 index 00000000..d4f497bc --- /dev/null +++ b/libfprint/tod/tod-symbols.h @@ -0,0 +1,45 @@ +/* + * Shared library loader for libfprint + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +#define TOD_1_SYMBOL_VERSION_1_90 "LIBFPRINT_TOD_1.0.0" +#define TOD_1_SYMBOL_VERSION_1_92 "LIBFPRINT_TOD_1_1.92" +#define TOD_1_SYMBOL_VERSION_1_94 "LIBFPRINT_TOD_1_1.94" +#define TOD_1_SYMBOL_VERSION(major, minor) \ + TOD_1_SYMBOL_VERSION_ ## major ## _ ## minor + +#define TOD_DEFAULT_VERSION_SYMBOL(symbol, major, minor) \ + __asm__ (".symver " # symbol "," # symbol "@@@" \ + TOD_1_SYMBOL_VERSION (major, minor)); +#define TOD_VERSIONED_SYMBOL(symbol, major, minor) \ + __asm__ (".symver " # symbol "_" # major "_" #minor "," # symbol "@" \ + TOD_1_SYMBOL_VERSION (major, minor)); + +TOD_DEFAULT_VERSION_SYMBOL (fpi_ssm_new_full, 1, 92) +TOD_VERSIONED_SYMBOL (fpi_ssm_new_full, 1, 90) + +TOD_DEFAULT_VERSION_SYMBOL (fpi_ssm_next_state_delayed, 1, 92) +TOD_VERSIONED_SYMBOL (fpi_ssm_next_state_delayed, 1, 90) + +TOD_DEFAULT_VERSION_SYMBOL (fpi_ssm_jump_to_state_delayed, 1, 92) +TOD_VERSIONED_SYMBOL (fpi_ssm_jump_to_state_delayed, 1, 90) + +TOD_DEFAULT_VERSION_SYMBOL (fpi_ssm_mark_completed_delayed, 1, 92) +TOD_VERSIONED_SYMBOL (fpi_ssm_mark_completed_delayed, 1, 90) diff --git a/libfprint/tod/tod-wrappers.c b/libfprint/tod/tod-wrappers.c new file mode 100644 index 00000000..181dbb13 --- /dev/null +++ b/libfprint/tod/tod-wrappers.c @@ -0,0 +1,31 @@ +/* + * Shared library loader for libfprint + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#define FP_COMPONENT "tod" + +#include "tod-wrappers.h" + +FpiSsm * +fpi_ssm_new_full_1_90 (FpDevice *dev, + FpiSsmHandlerCallback handler, + int nr_states, + const char *machine_name) +{ + return fpi_ssm_new_full (dev, handler, nr_states, nr_states, machine_name); +} diff --git a/libfprint/tod/tod-wrappers.h b/libfprint/tod/tod-wrappers.h new file mode 100644 index 00000000..b01aad44 --- /dev/null +++ b/libfprint/tod/tod-wrappers.h @@ -0,0 +1,39 @@ +/* + * Shared library loader for libfprint + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +#include "drivers_api.h" +#include "tod-symbols.h" + +extern FpiSsm *fpi_ssm_new_full_1_90 (FpDevice *dev, + FpiSsmHandlerCallback handler, + int nr_states, + const char *machine_name); + +extern void fpi_ssm_next_state_delayed_1_90 (FpiSsm *machine, + int delay, + GCancellable *cancellable); +extern void fpi_ssm_jump_to_state_delayed_1_90 (FpiSsm *machine, + int state, + int delay, + GCancellable *cancellable); +extern void fpi_ssm_mark_completed_delayed_1_90 (FpiSsm *machine, + int delay, + GCancellable *cancellable); diff --git a/tests/meson.build b/tests/meson.build index 0ec194df..5a93b345 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -326,11 +326,6 @@ if get_option('tod') } } - if tod_version != 'v1+1.94' - # TODO: Adapt symbols to new ABI - continue - endif - tod_driver_infos += { tod_ssm_test_driver_name + '_' + tod_version: { 'tod-driver': tod_ssm_test_driver_name, From 9c37ffa4beed8c06289ec34a7d224bad5b6e7240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 3 Sep 2021 20:07:36 +0200 Subject: [PATCH 24/32] tests: Run TOD driver-independent tests alone --- tests/meson.build | 24 ++++++++++++++++++------ tests/test-fp-todv1-types.c | 3 --- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tests/meson.build b/tests/meson.build index 5a93b345..0ac78620 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -293,18 +293,21 @@ if get_option('tod') dependencies: libfprint_private_dep, install: false) - tod_unit_tests = [ + tod_standalone_tests = [ + 'fp-todv1-types', + ] + + tod_drivers_tests = [ 'fp-context-tod', 'fp-device-tod', 'fpi-device', - 'fp-todv1-types', ] tod_driver_infos = { tod_test_driver_name + '_current': { 'tod-driver': tod_test_driver_name, 'tod-dir': meson.current_build_dir(), - 'supported-tests': tod_unit_tests, + 'supported-tests': tod_drivers_tests, } } @@ -322,7 +325,7 @@ if get_option('tod') tod_test_driver_name + '_' + tod_version: { 'tod-driver': tod_test_driver_name, 'tod-dir': tod_dir, - 'supported-tests': tod_unit_tests, + 'supported-tests': tod_drivers_tests, } } @@ -338,10 +341,11 @@ if get_option('tod') endforeach endif - foreach test_name: tod_unit_tests + foreach test_name: tod_drivers_tests + tod_standalone_tests basename = 'test-' + test_name sufix = test_name.endswith('-tod') ? '' : '-tod' tod_test_name = test_name + sufix + tod_suites = ['unit-tests', 'tod'] test_exe = executable(basename + sufix, sources: basename + '.c', dependencies: libfprint_private_dep, @@ -363,10 +367,18 @@ if get_option('tod') test(tod_test_name + '-' + tod_driver, test_exe, - suite: ['unit-tests', 'tod', tod_driver], + suite: tod_suites + [tod_driver], env: tod_test_envs, depends: fake_driver, ) endforeach + + if test_name in tod_standalone_tests + test(tod_test_name, + test_exe, + suite: tod_suites, + env: tod_envs, + ) + endif endforeach endif diff --git a/tests/test-fp-todv1-types.c b/tests/test-fp-todv1-types.c index 654b0d6b..267f19d3 100644 --- a/tests/test-fp-todv1-types.c +++ b/tests/test-fp-todv1-types.c @@ -231,9 +231,6 @@ test_usb_enums (void) int main (int argc, char *argv[]) { - if (!strstr (g_getenv ("FP_TOD_TEST_DRIVER_NAME"), "v1")) - return 77; - g_test_init (&argc, &argv, NULL); g_test_add_func ("/type/device/private", test_device_type); From 4a337393a68c520695229b1272f80d57e6e86c2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 3 Sep 2021 20:41:52 +0200 Subject: [PATCH 25/32] tests: Use more versioned types for fpi types tests Also move images into its own header --- tests/meson.build | 1 + tests/test-fp-todv1-types.c | 248 ++++++++++++++-------- tests/tod-drivers/base-fp-device.h | 98 +++++++-- tests/tod-drivers/base-fp-print.h | 52 ++--- tests/tod-drivers/base-fpi-device.h | 222 ++++++++++++++++--- tests/tod-drivers/base-fpi-image-device.h | 68 ++---- tests/tod-drivers/base-fpi-image.h | 62 ++++++ tests/tod-drivers/base-fpi-spi.h | 18 +- tests/tod-drivers/base-fpi-usb.h | 32 +-- 9 files changed, 564 insertions(+), 237 deletions(-) create mode 100644 tests/tod-drivers/base-fpi-image.h diff --git a/tests/meson.build b/tests/meson.build index 0ac78620..6febfb5f 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -277,6 +277,7 @@ if get_option('tod') 'tod-drivers/base-fp-device.h', 'tod-drivers/base-fp-print.h', 'tod-drivers/base-fpi-device.h', + 'tod-drivers/base-fpi-image.h', 'tod-drivers/base-fpi-image-device.h', 'tod-drivers/base-fpi-spi.h', 'tod-drivers/base-fpi-usb.h', diff --git a/tests/test-fp-todv1-types.c b/tests/test-fp-todv1-types.c index 267f19d3..1317bb36 100644 --- a/tests/test-fp-todv1-types.c +++ b/tests/test-fp-todv1-types.c @@ -25,6 +25,7 @@ #include "tod-drivers/base-fp-device.h" #include "tod-drivers/base-fp-print.h" #include "tod-drivers/base-fpi-device.h" +#include "tod-drivers/base-fpi-image.h" #include "tod-drivers/base-fpi-image-device.h" #include "tod-drivers/base-fpi-spi.h" #include "tod-drivers/base-fpi-usb.h" @@ -38,6 +39,9 @@ check_enum_compatibility (GType old_type, GType current_type) g_debug ("Checking Enum %s", g_type_name (current_type)); + g_assert_true (G_TYPE_IS_ENUM (old_type)); + g_assert_true (G_TYPE_IS_ENUM (current_type)); + for (i = 0; g_enum_get_value (old_class, i); ++i) { GEnumValue *old_value = g_enum_get_value (old_class, i); @@ -59,6 +63,9 @@ check_flags_compatibility (GType old_type, GType current_type) g_debug ("Checking Flags %s", g_type_name (current_type)); + g_assert_true (G_TYPE_IS_FLAGS (old_type)); + g_assert_true (G_TYPE_IS_FLAGS (current_type)); + for (i = 0; i < old_class->n_values; ++i) { GFlagsValue *old_value = &old_class->values[i]; @@ -83,149 +90,220 @@ check_compatiblity_auto (GType old_type, GType current_type) g_assert_not_reached (); } -#define check_type_compatibility(type) \ - check_compatiblity_auto (type ## _TOD_V1, type) +#define check_type_compatibility(type, major, minor, micro) \ + g_debug ("Checking " # type " @ " G_STRLOC); \ + check_compatiblity_auto (type ## _TOD_V ## major ## _ ## minor ## _ ## micro, type); -#define check_struct_size(type) \ - g_debug ("Checking " # type " size"); \ - g_assert_cmpuint (sizeof (type ## TODV1), ==, sizeof (type)) +#define tod_versioned_type(type, major, minor, micro) \ + type ## TODV ## major ## _ ## minor ## _ ## micro -#define check_struct_member(type, member) \ - g_debug ("Checking " # type "'s " # member " offset"); \ - g_assert_cmpuint (G_STRUCT_OFFSET (type ## TODV1, member), ==, G_STRUCT_OFFSET (type, member)) +#define check_struct_size(type, major, minor, micro) \ + g_debug ("Checking " # type " size @ " G_STRLOC); \ + g_assert_cmpuint (sizeof (tod_versioned_type (type, major, minor, micro)), \ + ==, \ + sizeof (type)) + +#define check_struct_member(type, major, minor, micro, member) \ + g_debug ("Checking " # type "'s " # member " offset @ " G_STRLOC); \ + g_assert_cmpuint (G_STRUCT_OFFSET (tod_versioned_type (type, major, minor, micro), member), \ + ==, \ + G_STRUCT_OFFSET (type, member)) static void test_device_type (void) { - check_struct_size (FpIdEntry); - check_struct_size (FpDeviceClass); + check_struct_size (FpIdEntry, 1, 90, 1); + check_struct_size (FpIdEntry, 1, 92, 0); + check_struct_size (FpDeviceClass, 1, 90, 1); + check_struct_size (FpDeviceClass, 1, 92, 0); + check_struct_size (FpDeviceClass, 1, 94, 0); - check_struct_member (FpIdEntry, virtual_envvar); - check_struct_member (FpIdEntry, driver_data); + check_struct_member (FpIdEntry, 1, 90, 1, virtual_envvar); + check_struct_member (FpIdEntry, 1, 90, 1, driver_data); - check_struct_member (FpDeviceClass, id); - check_struct_member (FpDeviceClass, full_name); - check_struct_member (FpDeviceClass, type); - check_struct_member (FpDeviceClass, id_table); + check_struct_member (FpDeviceClass, 1, 90, 1, id); + check_struct_member (FpDeviceClass, 1, 90, 1, full_name); + check_struct_member (FpDeviceClass, 1, 90, 1, type); + check_struct_member (FpDeviceClass, 1, 90, 1, id_table); - check_struct_member (FpDeviceClass, nr_enroll_stages); - check_struct_member (FpDeviceClass, scan_type); + check_struct_member (FpDeviceClass, 1, 90, 1, nr_enroll_stages); + check_struct_member (FpDeviceClass, 1, 90, 1, scan_type); - check_struct_member (FpDeviceClass, usb_discover); - check_struct_member (FpDeviceClass, probe); - check_struct_member (FpDeviceClass, open); - check_struct_member (FpDeviceClass, close); - check_struct_member (FpDeviceClass, enroll); - check_struct_member (FpDeviceClass, verify); - check_struct_member (FpDeviceClass, identify); - check_struct_member (FpDeviceClass, capture); - check_struct_member (FpDeviceClass, list); - check_struct_member (FpDeviceClass, delete); - check_struct_member (FpDeviceClass, cancel); + check_struct_member (FpDeviceClass, 1, 90, 1, usb_discover); + check_struct_member (FpDeviceClass, 1, 90, 1, probe); + check_struct_member (FpDeviceClass, 1, 90, 1, open); + check_struct_member (FpDeviceClass, 1, 90, 1, close); + check_struct_member (FpDeviceClass, 1, 90, 1, enroll); + check_struct_member (FpDeviceClass, 1, 90, 1, verify); + check_struct_member (FpDeviceClass, 1, 90, 1, identify); + check_struct_member (FpDeviceClass, 1, 90, 1, capture); + check_struct_member (FpDeviceClass, 1, 90, 1, list); + check_struct_member (FpDeviceClass, 1, 90, 1, delete); + check_struct_member (FpDeviceClass, 1, 90, 1, cancel); + + /* Version 1.92 */ + check_struct_member (FpIdEntry, 1, 92, 0, virtual_envvar); + check_struct_member (FpIdEntry, 1, 92, 0, driver_data); + check_struct_member (FpIdEntry, 1, 92, 0, udev_types); + check_struct_member (FpIdEntry, 1, 92, 0, spi_acpi_id); + check_struct_member (FpIdEntry, 1, 92, 0, hid_id); + + check_struct_member (FpDeviceClass, 1, 92, 0, usb_discover); + check_struct_member (FpDeviceClass, 1, 92, 0, probe); + check_struct_member (FpDeviceClass, 1, 92, 0, open); + check_struct_member (FpDeviceClass, 1, 92, 0, close); + check_struct_member (FpDeviceClass, 1, 92, 0, enroll); + check_struct_member (FpDeviceClass, 1, 92, 0, verify); + check_struct_member (FpDeviceClass, 1, 92, 0, identify); + check_struct_member (FpDeviceClass, 1, 92, 0, capture); + check_struct_member (FpDeviceClass, 1, 92, 0, list); + check_struct_member (FpDeviceClass, 1, 92, 0, delete); + check_struct_member (FpDeviceClass, 1, 92, 0, cancel); + + check_struct_member (FpDeviceClass, 1, 92, 0, id); + check_struct_member (FpDeviceClass, 1, 92, 0, full_name); + check_struct_member (FpDeviceClass, 1, 92, 0, type); + check_struct_member (FpDeviceClass, 1, 92, 0, id_table); + + check_struct_member (FpDeviceClass, 1, 92, 0, nr_enroll_stages); + check_struct_member (FpDeviceClass, 1, 92, 0, scan_type); + + check_struct_member (FpDeviceClass, 1, 92, 0, features); + + /* Version 1.94 */ + check_struct_member (FpDeviceClass, 1, 94, 0, usb_discover); + check_struct_member (FpDeviceClass, 1, 94, 0, probe); + check_struct_member (FpDeviceClass, 1, 94, 0, open); + check_struct_member (FpDeviceClass, 1, 94, 0, close); + check_struct_member (FpDeviceClass, 1, 94, 0, enroll); + check_struct_member (FpDeviceClass, 1, 94, 0, verify); + check_struct_member (FpDeviceClass, 1, 94, 0, identify); + check_struct_member (FpDeviceClass, 1, 94, 0, capture); + check_struct_member (FpDeviceClass, 1, 94, 0, list); + check_struct_member (FpDeviceClass, 1, 94, 0, delete); + check_struct_member (FpDeviceClass, 1, 94, 0, cancel); + + check_struct_member (FpDeviceClass, 1, 94, 0, id); + check_struct_member (FpDeviceClass, 1, 94, 0, full_name); + check_struct_member (FpDeviceClass, 1, 94, 0, type); + check_struct_member (FpDeviceClass, 1, 94, 0, id_table); + + check_struct_member (FpDeviceClass, 1, 94, 0, nr_enroll_stages); + check_struct_member (FpDeviceClass, 1, 94, 0, scan_type); + + check_struct_member (FpDeviceClass, 1, 94, 0, features); } static void test_image_device_private (void) { - check_struct_size (FpImage); - check_struct_size (FpImageDeviceClass); + check_struct_size (FpImage, 1, 90, 1); + check_struct_size (FpImageDeviceClass, 1, 90, 1); - check_struct_member (FpImageDeviceClass, bz3_threshold); - check_struct_member (FpImageDeviceClass, img_width); - check_struct_member (FpImageDeviceClass, img_height); - check_struct_member (FpImageDeviceClass, img_open); - check_struct_member (FpImageDeviceClass, img_close); - check_struct_member (FpImageDeviceClass, activate); - check_struct_member (FpImageDeviceClass, change_state); - check_struct_member (FpImageDeviceClass, deactivate); + check_struct_member (FpImageDeviceClass, 1, 90, 1, bz3_threshold); + check_struct_member (FpImageDeviceClass, 1, 90, 1, img_width); + check_struct_member (FpImageDeviceClass, 1, 90, 1, img_height); + check_struct_member (FpImageDeviceClass, 1, 90, 1, img_open); + check_struct_member (FpImageDeviceClass, 1, 90, 1, img_close); + check_struct_member (FpImageDeviceClass, 1, 90, 1, activate); + check_struct_member (FpImageDeviceClass, 1, 90, 1, change_state); + check_struct_member (FpImageDeviceClass, 1, 90, 1, deactivate); } static void test_usb_private (void) { - check_struct_size (FpiUsbTransfer); + check_struct_size (FpiUsbTransfer, 1, 90, 1); - check_struct_member (FpiUsbTransfer, device); - check_struct_member (FpiUsbTransfer, ssm); - check_struct_member (FpiUsbTransfer, length); - check_struct_member (FpiUsbTransfer, actual_length); - check_struct_member (FpiUsbTransfer, buffer); - check_struct_member (FpiUsbTransfer, ref_count); - check_struct_member (FpiUsbTransfer, type); - check_struct_member (FpiUsbTransfer, endpoint); - check_struct_member (FpiUsbTransfer, direction); - check_struct_member (FpiUsbTransfer, request_type); - check_struct_member (FpiUsbTransfer, recipient); - check_struct_member (FpiUsbTransfer, request); - check_struct_member (FpiUsbTransfer, value); - check_struct_member (FpiUsbTransfer, idx); - check_struct_member (FpiUsbTransfer, short_is_error); - check_struct_member (FpiUsbTransfer, user_data); - check_struct_member (FpiUsbTransfer, callback); - check_struct_member (FpiUsbTransfer, free_buffer); + check_struct_member (FpiUsbTransfer, 1, 90, 1, device); + check_struct_member (FpiUsbTransfer, 1, 90, 1, ssm); + check_struct_member (FpiUsbTransfer, 1, 90, 1, length); + check_struct_member (FpiUsbTransfer, 1, 90, 1, actual_length); + check_struct_member (FpiUsbTransfer, 1, 90, 1, buffer); + check_struct_member (FpiUsbTransfer, 1, 90, 1, ref_count); + check_struct_member (FpiUsbTransfer, 1, 90, 1, type); + check_struct_member (FpiUsbTransfer, 1, 90, 1, endpoint); + check_struct_member (FpiUsbTransfer, 1, 90, 1, direction); + check_struct_member (FpiUsbTransfer, 1, 90, 1, request_type); + check_struct_member (FpiUsbTransfer, 1, 90, 1, recipient); + check_struct_member (FpiUsbTransfer, 1, 90, 1, request); + check_struct_member (FpiUsbTransfer, 1, 90, 1, value); + check_struct_member (FpiUsbTransfer, 1, 90, 1, idx); + check_struct_member (FpiUsbTransfer, 1, 90, 1, short_is_error); + check_struct_member (FpiUsbTransfer, 1, 90, 1, user_data); + check_struct_member (FpiUsbTransfer, 1, 90, 1, callback); + check_struct_member (FpiUsbTransfer, 1, 90, 1, free_buffer); } static void test_spi_private (void) { - check_struct_size (FpiSpiTransfer); + check_struct_size (FpiSpiTransfer, 1, 92, 0); - check_struct_member (FpiSpiTransfer, device); - check_struct_member (FpiSpiTransfer, ssm); - check_struct_member (FpiSpiTransfer, length_wr); - check_struct_member (FpiSpiTransfer, length_rd); - check_struct_member (FpiSpiTransfer, buffer_wr); - check_struct_member (FpiSpiTransfer, buffer_rd); - check_struct_member (FpiSpiTransfer, ref_count); - check_struct_member (FpiSpiTransfer, spidev_fd); - check_struct_member (FpiSpiTransfer, user_data); - check_struct_member (FpiSpiTransfer, callback); - check_struct_member (FpiSpiTransfer, free_buffer_wr); - check_struct_member (FpiSpiTransfer, free_buffer_rd); + check_struct_member (FpiSpiTransfer, 1, 92, 0, device); + check_struct_member (FpiSpiTransfer, 1, 92, 0, ssm); + check_struct_member (FpiSpiTransfer, 1, 92, 0, length_wr); + check_struct_member (FpiSpiTransfer, 1, 92, 0, length_rd); + check_struct_member (FpiSpiTransfer, 1, 92, 0, buffer_wr); + check_struct_member (FpiSpiTransfer, 1, 92, 0, buffer_rd); + check_struct_member (FpiSpiTransfer, 1, 92, 0, ref_count); + check_struct_member (FpiSpiTransfer, 1, 92, 0, spidev_fd); + check_struct_member (FpiSpiTransfer, 1, 92, 0, user_data); + check_struct_member (FpiSpiTransfer, 1, 92, 0, callback); + check_struct_member (FpiSpiTransfer, 1, 92, 0, free_buffer_wr); + check_struct_member (FpiSpiTransfer, 1, 92, 0, free_buffer_rd); } static void test_device_public_enums (void) { - check_type_compatibility (FP_TYPE_DEVICE_TYPE); - check_type_compatibility (FP_TYPE_SCAN_TYPE); - check_type_compatibility (FP_TYPE_DEVICE_RETRY); - check_type_compatibility (FP_TYPE_DEVICE_ERROR); - check_type_compatibility (FP_TYPE_DEVICE_FEATURE); - check_type_compatibility (FPI_TYPE_DEVICE_UDEV_SUBTYPE_FLAGS); + check_type_compatibility (FP_TYPE_DEVICE_TYPE, 1, 90, 1); + check_type_compatibility (FP_TYPE_SCAN_TYPE, 1, 90, 1); + check_type_compatibility (FP_TYPE_DEVICE_RETRY, 1, 90, 1); + check_type_compatibility (FP_TYPE_DEVICE_ERROR, 1, 90, 1); + check_type_compatibility (FP_TYPE_DEVICE_ERROR, 1, 90, 3); + check_type_compatibility (FP_TYPE_DEVICE_ERROR, 1, 90, 4); + check_type_compatibility (FP_TYPE_DEVICE_ERROR, 1, 94, 0); + check_type_compatibility (FP_TYPE_DEVICE_FEATURE, 1, 92, 0); + check_type_compatibility (FP_TYPE_DEVICE_FEATURE, 1, 94, 0); + check_type_compatibility (FP_TYPE_TEMPERATURE, 1, 94, 0); + check_type_compatibility (FPI_TYPE_DEVICE_UDEV_SUBTYPE_FLAGS, 1, 92, 0); } static void test_device_private_enums (void) { - check_type_compatibility (FPI_TYPE_DEVICE_ACTION); + check_type_compatibility (FPI_TYPE_DEVICE_ACTION, 1, 90, 1); + check_type_compatibility (FPI_TYPE_DEVICE_ACTION, 1, 92, 0); } static void test_print_public_enums (void) { - check_type_compatibility (FP_TYPE_FINGER); - check_type_compatibility (FP_TYPE_FINGER_STATUS_FLAGS); + check_type_compatibility (FP_TYPE_FINGER, 1, 90, 1); + check_type_compatibility (FP_TYPE_FINGER_STATUS_FLAGS, 1, 90, 4); } static void test_print_private_enums (void) { - check_type_compatibility (FPI_TYPE_PRINT_TYPE); - check_type_compatibility (FPI_TYPE_MATCH_RESULT); + check_type_compatibility (FPI_TYPE_PRINT_TYPE, 1, 90, 1); + check_type_compatibility (FPI_TYPE_MATCH_RESULT, 1, 90, 1); } static void test_image_device_enums (void) { - check_type_compatibility (FPI_TYPE_IMAGE_FLAGS); - check_type_compatibility (FPI_TYPE_IMAGE_DEVICE_STATE); + check_type_compatibility (FPI_TYPE_IMAGE_FLAGS, 1, 90, 1); + check_type_compatibility (FPI_TYPE_IMAGE_FLAGS, 1, 90, 2); + check_type_compatibility (FPI_TYPE_IMAGE_DEVICE_STATE, 1, 90, 1); + check_type_compatibility (FPI_TYPE_IMAGE_DEVICE_STATE, 1, 90, 4); } static void test_usb_enums (void) { - check_type_compatibility (FPI_TYPE_TRANSFER_TYPE); + check_type_compatibility (FPI_TYPE_TRANSFER_TYPE, 1, 90, 3); } int diff --git a/tests/tod-drivers/base-fp-device.h b/tests/tod-drivers/base-fp-device.h index 2eaff419..600bdf9f 100644 --- a/tests/tod-drivers/base-fp-device.h +++ b/tests/tod-drivers/base-fp-device.h @@ -22,30 +22,86 @@ typedef struct _FpDevice FpDevice; typedef enum { - FP_DEVICE_TYPE_TODV1_VIRTUAL, - FP_DEVICE_TYPE_TODV1_USB, -} FpDeviceTypeTODV1; + FP_DEVICE_TYPE_TODV1_90_1_VIRTUAL, + FP_DEVICE_TYPE_TODV1_90_1_USB, +} FpDeviceTypeTODV1_90_1; typedef enum { - FP_SCAN_TYPE_TODV1_SWIPE, - FP_SCAN_TYPE_TODV1_PRESS, -} FpScanTypeTODV1; + FP_DEVICE_TYPE_TODV1_92_0_VIRTUAL, + FP_DEVICE_TYPE_TODV1_92_0_USB, + FP_DEVICE_TYPE_TODV1_92_0_UDEV, +} FpDeviceTypeTODV1_92_0; typedef enum { - FP_DEVICE_RETRY_TODV1_GENERAL, - FP_DEVICE_RETRY_TODV1_TOO_SHORT, - FP_DEVICE_RETRY_TODV1_CENTER_FINGER, - FP_DEVICE_RETRY_TODV1_REMOVE_FINGER, -} FpDeviceRetryTODV1; + FP_SCAN_TYPE_TODV1_90_1_SWIPE, + FP_SCAN_TYPE_TODV1_90_1_PRESS, +} FpScanTypeTODV1_90_1; typedef enum { - FP_DEVICE_ERROR_TODV1_GENERAL, - FP_DEVICE_ERROR_TODV1_NOT_SUPPORTED, - FP_DEVICE_ERROR_TODV1_NOT_OPEN, - FP_DEVICE_ERROR_TODV1_ALREADY_OPEN, - FP_DEVICE_ERROR_TODV1_BUSY, - FP_DEVICE_ERROR_TODV1_PROTO, - FP_DEVICE_ERROR_TODV1_DATA_INVALID, - FP_DEVICE_ERROR_TODV1_DATA_NOT_FOUND, - FP_DEVICE_ERROR_TODV1_DATA_FULL, -} FpDeviceErrorTODV1; + FP_DEVICE_RETRY_TODV1_90_1_GENERAL, + FP_DEVICE_RETRY_TODV1_90_1_TOO_SHORT, + FP_DEVICE_RETRY_TODV1_90_1_CENTER_FINGER, + FP_DEVICE_RETRY_TODV1_90_1_REMOVE_FINGER, +} FpDeviceRetryTODV1_90_1; + +typedef enum { + FP_DEVICE_ERROR_TODV1_90_1_GENERAL, + FP_DEVICE_ERROR_TODV1_90_1_NOT_SUPPORTED, + FP_DEVICE_ERROR_TODV1_90_1_NOT_OPEN, + FP_DEVICE_ERROR_TODV1_90_1_ALREADY_OPEN, + FP_DEVICE_ERROR_TODV1_90_1_BUSY, + FP_DEVICE_ERROR_TODV1_90_1_PROTO, + FP_DEVICE_ERROR_TODV1_90_1_DATA_INVALID, + FP_DEVICE_ERROR_TODV1_90_1_DATA_NOT_FOUND, + FP_DEVICE_ERROR_TODV1_90_1_DATA_FULL, +} FpDeviceErrorTODV1_90_1; + +typedef enum { + FP_DEVICE_ERROR_TODV1_90_3_GENERAL, + FP_DEVICE_ERROR_TODV1_90_3_NOT_SUPPORTED, + FP_DEVICE_ERROR_TODV1_90_3_NOT_OPEN, + FP_DEVICE_ERROR_TODV1_90_3_ALREADY_OPEN, + FP_DEVICE_ERROR_TODV1_90_3_BUSY, + FP_DEVICE_ERROR_TODV1_90_3_PROTO, + FP_DEVICE_ERROR_TODV1_90_3_DATA_INVALID, + FP_DEVICE_ERROR_TODV1_90_3_DATA_NOT_FOUND, + FP_DEVICE_ERROR_TODV1_90_3_DATA_FULL, + FP_DEVICE_ERROR_TODV1_90_3_DATA_DUPLICATE, +} FpDeviceErrorTODV1_90_3; + +typedef enum { + FP_DEVICE_ERROR_TODV1_90_4_GENERAL, + FP_DEVICE_ERROR_TODV1_90_4_NOT_SUPPORTED, + FP_DEVICE_ERROR_TODV1_90_4_NOT_OPEN, + FP_DEVICE_ERROR_TODV1_90_4_ALREADY_OPEN, + FP_DEVICE_ERROR_TODV1_90_4_BUSY, + FP_DEVICE_ERROR_TODV1_90_4_PROTO, + FP_DEVICE_ERROR_TODV1_90_4_DATA_INVALID, + FP_DEVICE_ERROR_TODV1_90_4_DATA_NOT_FOUND, + FP_DEVICE_ERROR_TODV1_90_4_DATA_FULL, + FP_DEVICE_ERROR_TODV1_90_4_DATA_DUPLICATE, + /* Leave some room to add more DATA related errors */ + FP_DEVICE_ERROR_TODV1_90_4_REMOVED = 0x100, +} FpDeviceErrorTODV1_90_4; + +typedef enum { + FP_DEVICE_ERROR_TODV1_94_0_GENERAL, + FP_DEVICE_ERROR_TODV1_94_0_NOT_SUPPORTED, + FP_DEVICE_ERROR_TODV1_94_0_NOT_OPEN, + FP_DEVICE_ERROR_TODV1_94_0_ALREADY_OPEN, + FP_DEVICE_ERROR_TODV1_94_0_BUSY, + FP_DEVICE_ERROR_TODV1_94_0_PROTO, + FP_DEVICE_ERROR_TODV1_94_0_DATA_INVALID, + FP_DEVICE_ERROR_TODV1_94_0_DATA_NOT_FOUND, + FP_DEVICE_ERROR_TODV1_94_0_DATA_FULL, + FP_DEVICE_ERROR_TODV1_94_0_DATA_DUPLICATE, + /* Leave some room to add more DATA related errors */ + FP_DEVICE_ERROR_TODV1_94_0_REMOVED = 0x100, + FP_DEVICE_ERROR_TODV1_94_0_TOO_HOT, +} FpDeviceErrorTODV1_94_0; + +typedef enum { + FP_TEMPERATURE_TODV1_94_0_COLD, + FP_TEMPERATURE_TODV1_94_0_WARM, + FP_TEMPERATURE_TODV1_94_0_HOT, +} FpTemperatureTODV1_94_0; diff --git a/tests/tod-drivers/base-fp-print.h b/tests/tod-drivers/base-fp-print.h index 787820c9..403631ae 100644 --- a/tests/tod-drivers/base-fp-print.h +++ b/tests/tod-drivers/base-fp-print.h @@ -20,38 +20,38 @@ #pragma once typedef enum { - FP_FINGER_TODV1_UNKNOWN = 0, - FP_FINGER_TODV1_LEFT_THUMB, - FP_FINGER_TODV1_LEFT_INDEX, - FP_FINGER_TODV1_LEFT_MIDDLE, - FP_FINGER_TODV1_LEFT_RING, - FP_FINGER_TODV1_LEFT_LITTLE, - FP_FINGER_TODV1_RIGHT_THUMB, - FP_FINGER_TODV1_RIGHT_INDEX, - FP_FINGER_TODV1_RIGHT_MIDDLE, - FP_FINGER_TODV1_RIGHT_RING, - FP_FINGER_TODV1_RIGHT_LITTLE, + FP_FINGER_TODV1_90_1_UNKNOWN = 0, + FP_FINGER_TODV1_90_1_LEFT_THUMB, + FP_FINGER_TODV1_90_1_LEFT_INDEX, + FP_FINGER_TODV1_90_1_LEFT_MIDDLE, + FP_FINGER_TODV1_90_1_LEFT_RING, + FP_FINGER_TODV1_90_1_LEFT_LITTLE, + FP_FINGER_TODV1_90_1_RIGHT_THUMB, + FP_FINGER_TODV1_90_1_RIGHT_INDEX, + FP_FINGER_TODV1_90_1_RIGHT_MIDDLE, + FP_FINGER_TODV1_90_1_RIGHT_RING, + FP_FINGER_TODV1_90_1_RIGHT_LITTLE, - FP_FINGER_TODV1_FIRST = FP_FINGER_TODV1_LEFT_THUMB, - FP_FINGER_TODV1_LAST = FP_FINGER_TODV1_RIGHT_LITTLE, -} FpFingerTODV1; + FP_FINGER_TODV1_90_1_FIRST = FP_FINGER_TODV1_90_1_LEFT_THUMB, + FP_FINGER_TODV1_90_1_LAST = FP_FINGER_TODV1_90_1_RIGHT_LITTLE, +} FpFingerTODV1_90_1; typedef enum { - FP_FINGER_STATUS_TODV1_NONE = 0, - FP_FINGER_STATUS_TODV1_NEEDED = 1 << 0, - FP_FINGER_STATUS_TODV1_PRESENT = 1 << 1, -} FpFingerStatusFlagsTODV1; + FP_FINGER_STATUS_TODV1_90_4_NONE = 0, + FP_FINGER_STATUS_TODV1_90_4_NEEDED = 1 << 0, + FP_FINGER_STATUS_TODV1_90_4_PRESENT = 1 << 1, +} FpFingerStatusFlagsTODV1_90_4; /* Private flags */ typedef enum { - FPI_PRINT_TODV1_UNDEFINED = 0, - FPI_PRINT_TODV1_RAW, - FPI_PRINT_TODV1_NBIS, -} FpiPrintTypeTODV1; + FPI_PRINT_TODV1_90_1_UNDEFINED = 0, + FPI_PRINT_TODV1_90_1_RAW, + FPI_PRINT_TODV1_90_1_NBIS, +} FpiPrintTypeTODV1_90_1; typedef enum { - FPI_MATCH_TODV1_ERROR = -1, - FPI_MATCH_TODV1_FAIL, - FPI_MATCH_TODV1_SUCCESS, -} FpiMatchResultTODV1; + FPI_MATCH_TODV1_90_1_ERROR = -1, + FPI_MATCH_TODV1_90_1_FAIL, + FPI_MATCH_TODV1_90_1_SUCCESS, +} FpiMatchResultTODV1_90_1; diff --git a/tests/tod-drivers/base-fpi-device.h b/tests/tod-drivers/base-fpi-device.h index ab296ff4..fe68e5bc 100644 --- a/tests/tod-drivers/base-fpi-device.h +++ b/tests/tod-drivers/base-fpi-device.h @@ -24,11 +24,11 @@ #include "base-fp-device.h" -typedef struct _GUsbDevice GUsbDevice; +typedef struct _GUsbDevice GUsbDevice; -typedef struct _FpIdEntryTODV1 FpIdEntryTODV1; +typedef struct _FpIdEntryTODV1_90_1 FpIdEntryTODV1_90_1; -struct _FpIdEntryTODV1 +struct _FpIdEntryTODV1_90_1 { union { @@ -46,21 +46,21 @@ struct _FpIdEntryTODV1 gpointer _padding_dummy[16]; }; -struct _FpDeviceClassTODV1 +struct _FpDeviceClassTODV1_90_1 { /*< private >*/ GObjectClass parent_class; /*< public >*/ /* Static information about the driver. */ - const gchar *id; - const gchar *full_name; - FpDeviceTypeTODV1 type; - const FpIdEntryTODV1 *id_table; + const gchar *id; + const gchar *full_name; + FpDeviceTypeTODV1_90_1 type; + const FpIdEntryTODV1_90_1 *id_table; /* Defaults for device properties */ - gint nr_enroll_stages; - FpScanTypeTODV1 scan_type; + gint nr_enroll_stages; + FpScanTypeTODV1_90_1 scan_type; /* Callbacks */ gint (*usb_discover) (GUsbDevice *usb_device); @@ -81,34 +81,186 @@ struct _FpDeviceClassTODV1 gpointer _padding_dummy[32]; }; -typedef struct _FpDeviceClassTODV1 FpDeviceClassTODV1; +typedef struct _FpDeviceClassTODV1_90_1 FpDeviceClassTODV1_90_1; typedef enum { - FPI_DEVICE_ACTION_TODV1_NONE = 0, - FPI_DEVICE_ACTION_TODV1_PROBE, - FPI_DEVICE_ACTION_TODV1_OPEN, - FPI_DEVICE_ACTION_TODV1_CLOSE, - FPI_DEVICE_ACTION_TODV1_ENROLL, - FPI_DEVICE_ACTION_TODV1_VERIFY, - FPI_DEVICE_ACTION_TODV1_IDENTIFY, - FPI_DEVICE_ACTION_TODV1_CAPTURE, - FPI_DEVICE_ACTION_TODV1_LIST, - FPI_DEVICE_ACTION_TODV1_DELETE, -} FpiDeviceActionTODV1; + FPI_DEVICE_ACTION_TODV1_90_1_NONE = 0, + FPI_DEVICE_ACTION_TODV1_90_1_PROBE, + FPI_DEVICE_ACTION_TODV1_90_1_OPEN, + FPI_DEVICE_ACTION_TODV1_90_1_CLOSE, + FPI_DEVICE_ACTION_TODV1_90_1_ENROLL, + FPI_DEVICE_ACTION_TODV1_90_1_VERIFY, + FPI_DEVICE_ACTION_TODV1_90_1_IDENTIFY, + FPI_DEVICE_ACTION_TODV1_90_1_CAPTURE, + FPI_DEVICE_ACTION_TODV1_90_1_LIST, + FPI_DEVICE_ACTION_TODV1_90_1_DELETE, +} FpiDeviceActionTODV1_90_1; + +typedef enum { + FPI_DEVICE_ACTION_TODV1_92_0_NONE = 0, + FPI_DEVICE_ACTION_TODV1_92_0_PROBE, + FPI_DEVICE_ACTION_TODV1_92_0_OPEN, + FPI_DEVICE_ACTION_TODV1_92_0_CLOSE, + FPI_DEVICE_ACTION_TODV1_92_0_ENROLL, + FPI_DEVICE_ACTION_TODV1_92_0_VERIFY, + FPI_DEVICE_ACTION_TODV1_92_0_IDENTIFY, + FPI_DEVICE_ACTION_TODV1_92_0_CAPTURE, + FPI_DEVICE_ACTION_TODV1_92_0_LIST, + FPI_DEVICE_ACTION_TODV1_92_0_DELETE, + FPI_DEVICE_ACTION_TODV1_92_0_CLEAR_STORAGE +} FpiDeviceActionTODV1_92_0; typedef enum /*< flags >*/ { - FP_DEVICE_FEATURE_TODV1_NONE = 0, - FP_DEVICE_FEATURE_TODV1_CAPTURE = 1 << 0, - FP_DEVICE_FEATURE_TODV1_IDENTIFY = 1 << 1, - FP_DEVICE_FEATURE_TODV1_VERIFY = 1 << 2, - FP_DEVICE_FEATURE_TODV1_STORAGE = 1 << 3, - FP_DEVICE_FEATURE_TODV1_STORAGE_LIST = 1 << 4, - FP_DEVICE_FEATURE_TODV1_STORAGE_DELETE = 1 << 5, - FP_DEVICE_FEATURE_TODV1_STORAGE_CLEAR = 1 << 6, - FP_DEVICE_FEATURE_TODV1_DUPLICATES_CHECK = 1 << 7, -} FpDeviceFeatureTODV1; + FP_DEVICE_FEATURE_TODV1_92_0_NONE = 0, + FP_DEVICE_FEATURE_TODV1_92_0_CAPTURE = 1 << 0, + FP_DEVICE_FEATURE_TODV1_92_0_IDENTIFY = 1 << 1, + FP_DEVICE_FEATURE_TODV1_92_0_VERIFY = 1 << 2, + FP_DEVICE_FEATURE_TODV1_92_0_STORAGE = 1 << 3, + FP_DEVICE_FEATURE_TODV1_92_0_STORAGE_LIST = 1 << 4, + FP_DEVICE_FEATURE_TODV1_92_0_STORAGE_DELETE = 1 << 5, + FP_DEVICE_FEATURE_TODV1_92_0_STORAGE_CLEAR = 1 << 6, + FP_DEVICE_FEATURE_TODV1_92_0_DUPLICATES_CHECK = 1 << 7, +} FpDeviceFeatureTODV1_92_0; + +typedef enum /*< flags >*/ { + FP_DEVICE_FEATURE_TODV1_94_0_NONE = 0, + FP_DEVICE_FEATURE_TODV1_94_0_CAPTURE = 1 << 0, + FP_DEVICE_FEATURE_TODV1_94_0_IDENTIFY = 1 << 1, + FP_DEVICE_FEATURE_TODV1_94_0_VERIFY = 1 << 2, + FP_DEVICE_FEATURE_TODV1_94_0_STORAGE = 1 << 3, + FP_DEVICE_FEATURE_TODV1_94_0_STORAGE_LIST = 1 << 4, + FP_DEVICE_FEATURE_TODV1_94_0_STORAGE_DELETE = 1 << 5, + FP_DEVICE_FEATURE_TODV1_94_0_STORAGE_CLEAR = 1 << 6, + FP_DEVICE_FEATURE_TODV1_94_0_DUPLICATES_CHECK = 1 << 7, + FP_DEVICE_FEATURE_TODV1_94_0_ALWAYS_ON = 1 << 8, +} FpDeviceFeatureTODV1_94_0; typedef enum { - FPI_DEVICE_UDEV_SUBTYPE_TODV1_SPIDEV = 1 << 0, - FPI_DEVICE_UDEV_SUBTYPE_TODV1_HIDRAW = 1 << 1, -} FpiDeviceUdevSubtypeFlagsTODV1; + FPI_DEVICE_UDEV_SUBTYPE_TODV1_92_0_SPIDEV = 1 << 0, + FPI_DEVICE_UDEV_SUBTYPE_TODV1_92_0_HIDRAW = 1 << 1, +} FpiDeviceUdevSubtypeFlagsTODV1_92_0; + +typedef struct _FpIdEntryTODV1_92_0 FpIdEntryTODV1_92_0; + +struct _FpIdEntryTODV1_92_0 +{ + union + { + struct + { + guint pid; + guint vid; + }; + const gchar *virtual_envvar; + }; + guint64 driver_data; + + /* Elements added after TODv1 */ + union + { + struct + { + FpiDeviceUdevSubtypeFlagsTODV1_92_0 udev_types; + const gchar *spi_acpi_id; + struct + { + guint pid; + guint vid; + } hid_id; + }; + }; + + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[13]; +}; + +typedef struct _FpIdEntryTODV1_92_0 FpIdEntryTODV1_92_0; + +struct _FpDeviceClassTODV1_92_0 +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* Static information about the driver. */ + const gchar *id; + const gchar *full_name; + FpDeviceTypeTODV1_92_0 type; + const FpIdEntryTODV1_92_0 *id_table; + + /* Defaults for device properties */ + gint nr_enroll_stages; + FpScanTypeTODV1_90_1 scan_type; + + /* Callbacks */ + gint (*usb_discover) (GUsbDevice *usb_device); + void (*probe) (FpDevice *device); + void (*open) (FpDevice *device); + void (*close) (FpDevice *device); + void (*enroll) (FpDevice *device); + void (*verify) (FpDevice *device); + void (*identify) (FpDevice *device); + void (*capture) (FpDevice *device); + void (*list) (FpDevice *device); + void (*delete) (FpDevice * device); + + void (*cancel) (FpDevice *device); + + FpDeviceFeatureTODV1_92_0 features; + + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[31]; +}; + +typedef struct _FpDeviceClassTODV1_92_0 FpDeviceClassTODV1_92_0; + + +struct _FpDeviceClassTODV1_94_0 +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* Static information about the driver. */ + const gchar *id; + const gchar *full_name; + FpDeviceTypeTODV1_92_0 type; + const FpIdEntryTODV1_92_0 *id_table; + + /* Defaults for device properties */ + gint nr_enroll_stages; + FpScanTypeTODV1_90_1 scan_type; + + /* Callbacks */ + gint (*usb_discover) (GUsbDevice *usb_device); + void (*probe) (FpDevice *device); + void (*open) (FpDevice *device); + void (*close) (FpDevice *device); + void (*enroll) (FpDevice *device); + void (*verify) (FpDevice *device); + void (*identify) (FpDevice *device); + void (*capture) (FpDevice *device); + void (*list) (FpDevice *device); + void (*delete) (FpDevice * device); + + void (*cancel) (FpDevice *device); + + /* Class elements added after tod-v1 */ + FpDeviceFeatureTODV1_94_0 features; + + /* Simple device temperature model constants */ + gint32 temp_hot_seconds; + gint32 temp_cold_seconds; + + void (*clear_storage) (FpDevice * device); + void (*suspend) (FpDevice *device); + void (*resume) (FpDevice *device); + + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[27]; +}; + +typedef struct _FpDeviceClassTODV1_94_0 FpDeviceClassTODV1_94_0; diff --git a/tests/tod-drivers/base-fpi-image-device.h b/tests/tod-drivers/base-fpi-image-device.h index f034dd14..5d83d1e0 100644 --- a/tests/tod-drivers/base-fpi-image-device.h +++ b/tests/tod-drivers/base-fpi-image-device.h @@ -24,60 +24,38 @@ typedef struct _FpImageDevice FpImageDevice; typedef enum { - FPI_IMAGE_DEVICE_STATE_TODV1_INACTIVE, - FPI_IMAGE_DEVICE_STATE_TODV1_AWAIT_FINGER_ON, - FPI_IMAGE_DEVICE_STATE_TODV1_CAPTURE, - FPI_IMAGE_DEVICE_STATE_TODV1_AWAIT_FINGER_OFF, -} FpiImageDeviceStateTODV1; + FPI_IMAGE_DEVICE_STATE_TODV1_90_1_INACTIVE, + FPI_IMAGE_DEVICE_STATE_TODV1_90_1_AWAIT_FINGER_ON, + FPI_IMAGE_DEVICE_STATE_TODV1_90_1_CAPTURE, + FPI_IMAGE_DEVICE_STATE_TODV1_90_1_AWAIT_FINGER_OFF, +} FpiImageDeviceStateTODV1_90_1; -typedef struct _FpImageDeviceClassTODV1 +typedef enum { + FPI_IMAGE_DEVICE_STATE_TODV1_92_0_INACTIVE, + FPI_IMAGE_DEVICE_STATE_TODV1_92_0_AWAIT_FINGER_ON, + FPI_IMAGE_DEVICE_STATE_TODV1_92_0_CAPTURE, + FPI_IMAGE_DEVICE_STATE_TODV1_92_0_AWAIT_FINGER_OFF, + FPI_IMAGE_DEVICE_STATE_TODV1_92_0_ACTIVATING, + FPI_IMAGE_DEVICE_STATE_TODV1_92_0_DEACTIVATING, + FPI_IMAGE_DEVICE_STATE_TODV1_92_0_IDLE, +} FpiImageDeviceStateTODV1_90_4; + +typedef struct _FpImageDeviceClassTODV1_90_1 { - FpDeviceClassTODV1 parent_class; + FpDeviceClassTODV1_90_1 parent_class; - gint bz3_threshold; - gint img_width; - gint img_height; + gint bz3_threshold; + gint img_width; + gint img_height; void (*img_open)(FpImageDevice *dev); void (*img_close)(FpImageDevice *dev); void (*activate)(FpImageDevice *dev); - void (*change_state)(FpImageDevice *dev, - FpiImageDeviceStateTODV1 state); + void (*change_state)(FpImageDevice *dev, + FpiImageDeviceStateTODV1_90_1 state); void (*deactivate)(FpImageDevice *dev); /*< private >*/ /* padding for future expansion */ gpointer _padding_dummy[32]; -} FpImageDeviceClassTODV1; - -/* fpi-image */ - -typedef enum { - FPI_IMAGE_TODV1_V_FLIPPED = 1 << 0, - FPI_IMAGE_TODV1_H_FLIPPED = 1 << 1, - FPI_IMAGE_TODV1_COLORS_INVERTED = 1 << 2, - FPI_IMAGE_TODV1_PARTIAL = 1 << 3, -} FpiImageFlagsTODV1; - -typedef struct _FpImageTODV1 -{ - /*< private >*/ - GObject parent; - - /*< public >*/ - guint width; - guint height; - - gdouble ppmm; - - FpiImageFlagsTODV1 flags; - - /*< private >*/ - guint8 *data; - guint8 *binarized; - - GPtrArray *minutiae; - guint ref_count; - - gpointer _padding_dummy[32]; -} FpImageTODV1; +} FpImageDeviceClassTODV1_90_1; diff --git a/tests/tod-drivers/base-fpi-image.h b/tests/tod-drivers/base-fpi-image.h new file mode 100644 index 00000000..22d0c779 --- /dev/null +++ b/tests/tod-drivers/base-fpi-image.h @@ -0,0 +1,62 @@ +/* + * FpImageDevice - An image based fingerprint reader device + * Copyright (C) 2021 Marco Trevisan + * + * 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 + */ + +#pragma once + +#include +#include + +typedef struct _FpImage FpImage; +typedef struct _FpImageTODV1_90_1 FpImageTODV1_90_1; + +typedef enum { + FPI_IMAGE_TODV1_90_1_V_FLIPPED = 1 << 0, + FPI_IMAGE_TODV1_90_1_H_FLIPPED = 1 << 1, + FPI_IMAGE_TODV1_90_1_COLORS_INVERTED = 1 << 2, +} FpiImageFlagsTODV1_90_1; + +typedef enum { + FPI_IMAGE_TODV1_90_2_V_FLIPPED = 1 << 0, + FPI_IMAGE_TODV1_90_2_H_FLIPPED = 1 << 1, + FPI_IMAGE_TODV1_90_2_COLORS_INVERTED = 1 << 2, + FPI_IMAGE_TODV1_90_2_PARTIAL = 1 << 3, +} FpiImageFlagsTODV1_90_2; + +struct _FpImageTODV1_90_1 +{ + /*< private >*/ + GObject parent; + + /*< public >*/ + guint width; + guint height; + + gdouble ppmm; + + FpiImageFlagsTODV1_90_1 flags; + + /*< private >*/ + guint8 *data; + guint8 *binarized; + + GPtrArray *minutiae; + guint ref_count; + + gpointer _padding_dummy[32]; +}; diff --git a/tests/tod-drivers/base-fpi-spi.h b/tests/tod-drivers/base-fpi-spi.h index 9045816e..73aa293f 100644 --- a/tests/tod-drivers/base-fpi-spi.h +++ b/tests/tod-drivers/base-fpi-spi.h @@ -21,15 +21,15 @@ #include "base-fpi-device.h" -typedef struct _FpiSpiTransferTODV1 FpiSpiTransferTODV1; -typedef struct _FpiSsm FpiSsm; +typedef struct _FpiSpiTransferTODV1_92_0 FpiSpiTransferTODV1_92_0; +typedef struct _FpiSsm FpiSsm; -typedef void (*FpiSpiTransferCallbackTODV1)(FpiSpiTransferTODV1 *transfer, - FpDevice *dev, - gpointer user_data, - GError *error); +typedef void (*FpiSpiTransferCallbackTODV1_92_0)(FpiSpiTransferTODV1_92_0 *transfer, + FpDevice *dev, + gpointer user_data, + GError *error); -struct _FpiSpiTransferTODV1 +struct _FpiSpiTransferTODV1_92_0 { /*< public >*/ FpDevice *device; @@ -48,8 +48,8 @@ struct _FpiSpiTransferTODV1 int spidev_fd; /* Callbacks */ - gpointer user_data; - FpiSpiTransferCallbackTODV1 callback; + gpointer user_data; + FpiSpiTransferCallbackTODV1_92_0 callback; /* Data free function */ GDestroyNotify free_buffer_wr; diff --git a/tests/tod-drivers/base-fpi-usb.h b/tests/tod-drivers/base-fpi-usb.h index c3d6862d..5542a102 100644 --- a/tests/tod-drivers/base-fpi-usb.h +++ b/tests/tod-drivers/base-fpi-usb.h @@ -23,22 +23,22 @@ #include "base-fpi-device.h" -typedef struct _FpiUsbTransferTODV1 FpiUsbTransferTODV1; -typedef struct _FpiSsm FpiSsm; +typedef struct _FpiUsbTransferTODV1_90_1 FpiUsbTransferTODV1_90_1; +typedef struct _FpiSsm FpiSsm; -typedef void (*FpiUsbTransferCallbackTODV1)(FpiUsbTransferTODV1 *transfer, - FpDevice *dev, - gpointer user_data, - GError *error); +typedef void (*FpiUsbTransferCallbackTODV1_90_1)(FpiUsbTransferTODV1_90_1 *transfer, + FpDevice *dev, + gpointer user_data, + GError *error); typedef enum { - FP_TRANSFER_TODV1_NONE = -1, - FP_TRANSFER_TODV1_CONTROL = 0, - FP_TRANSFER_TODV1_BULK = 2, - FP_TRANSFER_TODV1_INTERRUPT = 3, -} FpiTransferTypeTODV1; + FP_TRANSFER_TODV1_90_1_NONE = -1, + FP_TRANSFER_TODV1_90_1_CONTROL = 0, + FP_TRANSFER_TODV1_90_1_BULK = 2, + FP_TRANSFER_TODV1_90_1_INTERRUPT = 3, +} FpiTransferTypeTODV1_90_3; -struct _FpiUsbTransferTODV1 +struct _FpiUsbTransferTODV1_90_1 { /*< public >*/ FpDevice *device; @@ -54,8 +54,8 @@ struct _FpiUsbTransferTODV1 guint ref_count; /* USB Transfer information */ - FpiTransferTypeTODV1 type; - guint8 endpoint; + FpiTransferTypeTODV1_90_3 type; + guint8 endpoint; /* Control Transfer options */ GUsbDeviceDirection direction; @@ -69,8 +69,8 @@ struct _FpiUsbTransferTODV1 gboolean short_is_error; /* Callbacks */ - gpointer user_data; - FpiUsbTransferCallbackTODV1 callback; + gpointer user_data; + FpiUsbTransferCallbackTODV1_90_1 callback; /* Data free function */ GDestroyNotify free_buffer; From 125d6e276f53e1dac5461f4a39d5d4a482b67f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 4 Sep 2021 03:10:08 +0200 Subject: [PATCH 26/32] tests: Repeat tests for TOD drivers compiled for each supported version --- tests/meson.build | 13 +-- tests/test-fpi-device.c | 85 +++++++++--------- ...vice-fake-tod-ssm-test-v1+1.90.1-x86_64.so | Bin 0 -> 123280 bytes ...e-fake-tod-test-driver-v1+1.90.1-x86_64.so | Bin 0 -> 40768 bytes ...vice-fake-tod-ssm-test-v1+1.90.2-x86_64.so | Bin 0 -> 123280 bytes ...e-fake-tod-test-driver-v1+1.90.2-x86_64.so | Bin 0 -> 40792 bytes ...vice-fake-tod-ssm-test-v1+1.90.3-x86_64.so | Bin 0 -> 123320 bytes ...e-fake-tod-test-driver-v1+1.90.3-x86_64.so | Bin 0 -> 40792 bytes ...vice-fake-tod-ssm-test-v1+1.90.5-x86_64.so | Bin 0 -> 123360 bytes ...e-fake-tod-test-driver-v1+1.90.5-x86_64.so | Bin 0 -> 40792 bytes ...device-fake-tod-ssm-test-v1+1.90-x86_64.so | Bin 128072 -> 0 bytes ...ice-fake-tod-test-driver-v1+1.90-x86_64.so | Bin 44720 -> 0 bytes ...vice-fake-tod-ssm-test-v1+1.94.0-x86_64.so | Bin 0 -> 125168 bytes ...e-fake-tod-test-driver-v1+1.94.0-x86_64.so | Bin 0 -> 42912 bytes ...device-fake-tod-ssm-test-v1+1.94-x86_64.so | Bin 125120 -> 0 bytes ...ice-fake-tod-test-driver-v1+1.94-x86_64.so | Bin 42784 -> 0 bytes 16 files changed, 49 insertions(+), 49 deletions(-) create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.1/libdevice-fake-tod-ssm-test-v1+1.90.1-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.1/libdevice-fake-tod-test-driver-v1+1.90.1-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.2/libdevice-fake-tod-ssm-test-v1+1.90.2-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.2/libdevice-fake-tod-test-driver-v1+1.90.2-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.3/libdevice-fake-tod-ssm-test-v1+1.90.3-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.3/libdevice-fake-tod-test-driver-v1+1.90.3-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.5/libdevice-fake-tod-ssm-test-v1+1.90.5-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90.5/libdevice-fake-tod-test-driver-v1+1.90.5-x86_64.so delete mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-ssm-test-v1+1.90-x86_64.so delete mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.94.0/libdevice-fake-tod-ssm-test-v1+1.94.0-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.94.0/libdevice-fake-tod-test-driver-v1+1.94.0-x86_64.so delete mode 100755 tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-ssm-test-v1+1.94-x86_64.so delete mode 100755 tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so diff --git a/tests/meson.build b/tests/meson.build index 6febfb5f..f49028dc 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -248,13 +248,11 @@ if get_option('tod') tod_envs.prepend('LD_LIBRARY_PATH', meson.build_root() / 'libfprint', meson.build_root() / 'libfprint' / 'tod') + tod_subversion = meson.project_version().split('+tod')[0] tod_c_args = [ '-DTEST_TOD_DRIVER=1', '-DTOD_CURRENT_VERSION=@0@'.format(tod_soversion), - '-DTOD_CURRENT_SUBVERSION="@0@.@1@"'.format( - meson.project_version().split('.')[0], - meson.project_version().split('.')[1], - ), + '-DTOD_CURRENT_SUBVERSION="@0@"'.format(tod_subversion), ] fake_driver = shared_module('device-fake-tod-driver', @@ -314,8 +312,11 @@ if get_option('tod') if host_machine.cpu_family() == 'x86_64' tod_test_versions = [ - 'v1+1.90', - 'v1+1.94', + 'v1+1.90.1', + 'v1+1.90.2', + 'v1+1.90.3', + 'v1+1.90.5', + 'v1+1.94.0', ] foreach tod_version: tod_test_versions diff --git a/tests/test-fpi-device.c b/tests/test-fpi-device.c index deea3f16..6e2021c2 100644 --- a/tests/test-fpi-device.c +++ b/tests/test-fpi-device.c @@ -116,19 +116,18 @@ tod_check_version (FpDeviceClass *device_class, return TRUE; versions = g_strsplit (sub_version, ".", -1); - g_assert_cmpuint (g_strv_length (versions), ==, 2); + g_assert_cmpuint (g_strv_length (versions), ==, 3); wanted_versions = g_strsplit (tod_subversion, ".", -1); - g_assert_cmpuint (g_strv_length (wanted_versions), ==, 2); + g_assert_cmpuint (g_strv_length (wanted_versions), ==, 3); - if (atoi (wanted_versions[0]) > atoi (versions[0])) - return FALSE; - - if (atoi (wanted_versions[1]) > atoi (versions[1])) - return FALSE; - - return TRUE; + if (atoi (versions[0]) >= atoi (wanted_versions[0]) && + atoi (versions[1]) > atoi (wanted_versions[1])) + return TRUE; + return atoi (versions[0]) == atoi (wanted_versions[0]) && + atoi (versions[1]) == atoi (wanted_versions[1]) && + atoi (versions[2]) >= atoi (wanted_versions[2]); #endif return TRUE; } @@ -634,9 +633,9 @@ test_driver_features_probe_updates (void) FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device); FpiDeviceFake *fake_dev; - if (!tod_check_device_version (device, 1, "1.92")) + if (!tod_check_device_version (device, 1, "1.92.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.92"); + g_test_skip ("Feature not supported by TODv1 versions before 1.92.0"); return; } @@ -693,7 +692,7 @@ test_driver_initial_features (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (tod_check_device_version (device, 1, "1.92")) + if (tod_check_device_version (device, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -710,7 +709,7 @@ test_driver_initial_features (void) g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE)); g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_LIST)); g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_DELETE)); - if (tod_check_device_version (device, 1, "1.92")) + if (tod_check_device_version (device, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -723,7 +722,7 @@ test_driver_initial_features (void) FP_DEVICE_FEATURE_STORAGE | FP_DEVICE_FEATURE_STORAGE_LIST | FP_DEVICE_FEATURE_STORAGE_DELETE | - (tod_check_device_version (device, 1, "1.92") ? + (tod_check_device_version (device, 1, "1.92.0") ? FP_DEVICE_FEATURE_STORAGE_CLEAR : 0)); } @@ -771,7 +770,7 @@ test_driver_initial_features_no_capture (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (tod_check_version (dev_class, 1, "1.92")) + if (tod_check_version (dev_class, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -795,7 +794,7 @@ test_driver_initial_features_no_verify (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (tod_check_version (dev_class, 1, "1.92")) + if (tod_check_version (dev_class, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -819,7 +818,7 @@ test_driver_initial_features_no_identify (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (tod_check_version (dev_class, 1, "1.92")) + if (tod_check_version (dev_class, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -843,7 +842,7 @@ test_driver_initial_features_no_storage (void) g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (tod_check_version (dev_class, 1, "1.92")) + if (tod_check_version (dev_class, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -864,13 +863,13 @@ test_driver_initial_features_no_list (void) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_IDENTIFY); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_VERIFY); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_DUPLICATES_CHECK); - if (tod_check_version (dev_class, 1, "1.92")) + if (tod_check_version (dev_class, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (tod_check_version (dev_class, 1, "1.92")) + if (tod_check_version (dev_class, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -894,7 +893,7 @@ test_driver_initial_features_no_delete (void) g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE); g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST); g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE); - if (tod_check_version (dev_class, 1, "1.92")) + if (tod_check_version (dev_class, 1, "1.92.0")) g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); else g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR); @@ -2134,9 +2133,9 @@ test_driver_identify_suspend_continues (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; - if (!tod_check_version (dev_class, 1, "1.94")) + if (!tod_check_version (dev_class, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -2206,9 +2205,9 @@ test_driver_identify_suspend_succeeds (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; - if (!tod_check_version (dev_class, 1, "1.94")) + if (!tod_check_version (dev_class, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -2274,9 +2273,9 @@ test_driver_identify_suspend_busy_error (void) FpiDeviceFake *fake_dev; FpPrint *expected_matched; - if (!tod_check_version (dev_class, 1, "1.94")) + if (!tod_check_version (dev_class, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -2337,9 +2336,9 @@ test_driver_identify_suspend_while_idle (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; - if (!tod_check_version (dev_class, 1, "1.94")) + if (!tod_check_version (dev_class, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -2387,9 +2386,9 @@ test_driver_identify_warmup_cooldown (void) FpiDeviceFake *fake_dev; gint64 start_time; - if (!tod_check_version (dev_class, 1, "1.94")) + if (!tod_check_version (dev_class, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -2691,9 +2690,9 @@ test_driver_clear_storage (void) FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); gboolean ret; - if (!tod_check_device_version (device, 1, "1.92")) + if (!tod_check_device_version (device, 1, "1.92.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.92"); + g_test_skip ("Feature not supported by TODv1 versions before 1.92.0"); return; } @@ -2712,9 +2711,9 @@ test_driver_clear_storage_error (void) FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); gboolean ret; - if (!tod_check_device_version (device, 1, "1.92")) + if (!tod_check_device_version (device, 1, "1.92.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.92"); + g_test_skip ("Feature not supported by TODv1 versions before 1.92.0"); return; } @@ -2824,9 +2823,9 @@ test_driver_critical (void) void (*orig_verify) (FpDevice *device) = dev_class->verify; FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); - if (!tod_check_device_version (device, 1, "1.94")) + if (!tod_check_device_version (device, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -3038,9 +3037,9 @@ test_driver_action_is_cancelled_open (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; - if (!tod_check_version (dev_class, 1, "1.94")) + if (!tod_check_version (dev_class, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -3064,9 +3063,9 @@ test_driver_action_internally_cancelled_open (void) g_autoptr(GError) error = NULL; FpiDeviceFake *fake_dev; - if (!tod_check_version (dev_class, 1, "1.94")) + if (!tod_check_version (dev_class, 1, "1.94.0")) { - g_test_skip ("Feature not supported by TODv1 versions before 1.94"); + g_test_skip ("Feature not supported by TODv1 versions before 1.94.0"); return; } @@ -3219,7 +3218,7 @@ test_driver_action_error_all (void) g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID); g_clear_error (&error); - if (tod_check_device_version (device, 1, "1.92")) + if (tod_check_device_version (device, 1, "1.92.0")) { fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID); g_assert_false (fp_device_clear_storage_sync (device, NULL, &error)); @@ -3333,7 +3332,7 @@ test_driver_action_error_fallback_all (void) g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); g_clear_error (&error); - if (tod_check_device_version (device, 1, "1.92")) + if (tod_check_device_version (device, 1, "1.92.0")) { g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*Device failed to pass an error to generic action " diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90.1/libdevice-fake-tod-ssm-test-v1+1.90.1-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90.1/libdevice-fake-tod-ssm-test-v1+1.90.1-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..094bb567e718fd1ff4bf3c10ff754f16cd90362c GIT binary patch literal 123280 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®#9TG?n%$-WMs{1=HTZek0oNzL_%M z_LRNZJ5}c5p;U*>&=E#ZPbQwxgqmv9qKYoJsHROI*3*k!(@K=wMpL`f-=2iko&Jxa zN2q)mfsDaDf@QhPXyJv^!Qz?9dC`XQWOVZJ{GY`*z^-5&mom48zfzv*p##AUf;_Taw> zNeL$Ywd@}>m8(|C>@;6%xXWkETWCC$V=t9Pdp^$|$rJH4b`YIj%E8yz!I7`AgW_xK zct5~b3FluWF>#&*fUyDfpxH=mP!}yI1bc&6Z5Kh8T?nE-B8n$$MB?m;WS}4gv2h3o zUttG_I7so8M!X*YhoLwg6QxEE;`o>1xb{lH@f?Wtz`ZVxH1y|$=R&XwFI;l~KuQGkT`)LVkZxDf@Td6Z(_ zGD9%eB<3GbZ}@Cy(n#*z%q5FBihy6|5MtTvd4z%&T7}a?IJ75Qwl6310QOu11i&^` z?fEV8q}fEVwO4H8L9AgxZ1ih~MNm(_E`S2ySPWw05Ka%_5C>bfFDLT=IJzi~w?(Nj zjyResjz^}8jXndhw)_XWG`{?P-3Ye$b*W-m0b=`AI6Y>Q)9?nYA))Qd`5C??5#K(C zAfj*O)Z#TH;@d^SkKx;yfCc-Fg$I$69!GUyHdEX`Tp_qy5%*Cx?!ZFQjzQ}B)ZR=; zgLY@;t|HK~+3P^;(Fmu9aA;Y!Y+p|10WAA5Z~)+*YC%MPYm zcz6(HAso(Jw!ph2;@xcsC3;s*D_%n)-d!jB7~Z`PkYKx? zH7Z|6ZD5|Hm>VhPG-B@JVW#bZGuNVFT`!A0EkZ1tT@GT~Q#d_@LwmAi`*Jc5V9#2L ztz4#u(UI6rRcu8?V$WqD*4+ze4*6{iVxwQD5fS~mkBqX}A=G*{4&n3=4soz$`*Jc5 zfa5BtfsGa@jz_Npj<$;9yF$Uyk~kW9IQ)J+0&MYXJX8To0*LKb;q(xWGjrJr-;#)L z|0-7B%BjU`NW`~0g&)JW8-NbD8!PS~X94$Vio1*A&H=GT-9?pA+kl01xa-s6eKiWd z@D9bajfqr$k;op7a1QbpiINoJcQQ|nL4?>*A>LLXrhNs(dhSkz2nddgZ>P2C;?|0z z1Bi`7I0yNQL<^t>rkbxfUcMGMPFEa9D2~3w(ayu+ckwA;i;KG{mJ|>ObLtAG>R%)} z9x=_SE2sH>ktk01G2FXzs$f1&G5?F0J1OQ1(Sm{{3}Rh5KVZAy)J>-ET{nw8({v1j zJ$nl0Ab*=EO|d0P4l$;ot~9$VHuG}9_9KY(*&P9FoVw4`#PsV(#WBXiA)JH!ZK8Eh z1HZ1p1jXX@J!(6%hvGP0aby$6g&q#SUoQY#{5nyw{PM6`N z&a%fMht>Yci##ZXMcr$zozLCvJTdVF-#D3Otv}*lPl8$i` zsvq-wd;GaNernx2&mF&ij(rQZ_(paPY~RS

sFP`}v|D;CA}QdtClg;l%LI3qS#@ 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 RJ$}{;7Jr`I340&={T~v>v1b4P literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90.2/libdevice-fake-tod-test-driver-v1+1.90.2-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90.2/libdevice-fake-tod-test-driver-v1+1.90.2-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..ead8c9752b0ae58f90f55438f6071162b0ba6c81 GIT binary patch literal 40792 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 G`~4pmd*OBf literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90.3/libdevice-fake-tod-test-driver-v1+1.90.3-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90.3/libdevice-fake-tod-test-driver-v1+1.90.3-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..281bb0968d93465195d346ba91d5b6945a07e8b1 GIT binary patch literal 40792 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 I1`DYCZ-=EJRR910 literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90.5/libdevice-fake-tod-ssm-test-v1+1.90.5-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90.5/libdevice-fake-tod-ssm-test-v1+1.90.5-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..0001228a8c3453d0d44c3773b715eafd8d937562 GIT binary patch literal 123360 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%0DqN|4)wX0|NMY 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 JVee^fGiOd_ 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 F{|yU(BVGUi literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-ssm-test-v1+1.90-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-ssm-test-v1+1.90-x86_64.so deleted file mode 100755 index 9b1c3ff070aeeddd77c85436c68d7d83534c43ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128072 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�yV~;0IGmCm?}--v?QF{6;6AFb1LDS6NE$kovGhV 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 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so deleted file mode 100755 index b7cc06e59f127a4bb54c9af3702189fe091aae27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44720 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 bupPQxjS3*6ZAasnc78@eS7cSl0*(I(YH<)# diff --git a/tests/tod-drivers/tod-x86_64-v1+1.94.0/libdevice-fake-tod-ssm-test-v1+1.94.0-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.94.0/libdevice-fake-tod-ssm-test-v1+1.94.0-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..49e3104aa3636c1abdc0849d8fc6087979f5b0f7 GIT binary patch literal 125168 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 RIuZWb-)PP=eE?t4`aiCizvKV_ literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.94.0/libdevice-fake-tod-test-driver-v1+1.94.0-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.94.0/libdevice-fake-tod-test-driver-v1+1.94.0-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..8c64885eb8be3ad14574933039d61eee19a42811 GIT binary patch literal 42912 zcmeHwdwf*Ywf{NuNG41k!^wm2k|DejAVY$nAfkCqm`F%s9tyR3G9;5^N|K3_34+y{ zg0@mF_lCAst=Q6gwY5H4^x9jBw#92zY^%loY>O6cY_$zl+Z63j>MOtR+K)45PG-P+ z{o{UqpUZ*F-fQi()?Rz%E-(8v!tz26%TO`#vHU6oy(N4&gX3jr=1W7; zfqI^P;FFe66ym5XjL6RhGU6NE!0AV?Obo}VAh=}c;-Ere=;@K|Zstp-q8#4wEi|oTcXpn9>KPta+mG>D51f_{rtxXD{e`WAVNU<{4zxrT8Pc zOn*YSZpIJC|M{iw|KRBhpSg-5lKd0z^CveUj1JQpoqE zpwCM||7;5SXOO?FBePoHNg*dUg&YSeB$@tyO@ZH>0{>)+d>>AsC&(4AS#c4sOrhs9 zDf0dI6!h6C=pRaf??L{_?0F#+O@<#$QQp^~Pcr(irqHuCg+3)I@V7(HWcBr#6!Z-# z^8G{#{r`~ye`AVrQQP$5&w9Dh*pum53&J8RG2mNM=)W+9oG+!&vkkJ6*}sX&$yV}K z@yv6C4#NmFC0qH$LXP;7z$?1m-52TC2V=o#OxG2?u62Xn8H$Fw!-KI0rB`XP_;NLftEKq$0D9|%T6{V^jGmJsax)X-o|ABcvx24f*T z($zH>B9aKn3HOI%I#@!{1Wa!zxE19jYmk~fTlB7AxECa0B4t*Jg*%WO4fl7;?4(7A zi=~G924F2y$;b*FLs8OE4|c@Dk$&*P1feL!^}f*HV6Yp7>l^4F>N7JA4Rn(3U7=uX zC>k0xCviD?C>o7K&G><6WHUrXNQYR07LkEaf6|1G-pF8b7E(OaAC2_(>QE%e@_|87 z4A@duY-IDNLLD(Z8tO9ZA=r{BLQ=PeqT#OXQmS-;Xebulu3tSAjBYW@62#HaKqQ*r zG9n>WCgDz4+?);9o$~Jt4R%Ds1EMZap)h`#IZuOka;`>Fs(d?w15{tKbcTmZd@{aX zw6~I`SGa!o6 zSZFX-%Egp!EniaZTfM?pR=RD~dHQ)Pz@)6JudAxom;09cRvPgY3Xru;&2#u+CWL;N|pVyDL0~Tr#`<7e?v3E7&oRV zj|p5}IGjbJ&SwDAr6L{?X#`ijay`%u6o1(IZA3TqU=MXvm zA74OH6y=}=e?Z_5TkzQxj9l3m6X6=m3j zmtzM?zS)E~k2^+8_^CuFuG`vqgvy&Ma1`us=K$g9xkz63wDTC@^Cc4Dfp!iMzJN#B z@4h6!h1~kA``yQgr8@^drkQHCVa68Uuwdanebxh$Wm9C z@Wm$j3KPD>gb$eTi%s|@6Ml&ae>Qs70%t97)&gfOaMl86EpXNXXDx8n0%t97)&gfO z@V~$wk zp19h8X=3N(iJ$?~gwDwmml`llYc+P-nLJj3NV49dYdE!9>rU@C8-+*Z%2IV(knt(z1 z4VWfgP<{iZ2^W;#fN7!yZAVK*Jm?lP0egmcn5tQG6X`&J3H(;6oLHP}M5reOmFubvJ zEqP;&!u%2N1`F)Bz-uk=N(*e2x4@D<+XClX;4BO5w7?%+n5ggHE%2Kb_%#dsk_G;i z1%Ac?KVgA?Xo0_HfgiBIcU#~)E$}TCc#j3X$pT+*frl(`p9KzC;43X~n+4urf&CVE ztp#3bflDp$0t-Cb0_RIOuxIUb!~=Vr8U?FQ#q!aWZoPnar5O{WIdg{Ly~^Vv1pSFM zM8ER)6qI}z*fkz_>@ODw9y?_Zs80r-`!JRV0e&ICH8I-7{9N)=e>=SPZtyBYOWFcE z*A{_N3G8|;mKoT+_H)3Gz3~3T#8@XfuP2??16HpDuaQ6TpST8zZQu#)x_&IM+dmfA z#4CLXqZoPA`q~I z-HL@PHi^py%+rsPK4$S;>{DZTkQvzJd;+E0?R*NqxH09j#62qyl5vplFbXQ^e}O)F zBte|FGqBsSfaXl8Oy!4BMW1JkC@+r;LViJo~%E>JcnGklLmIZOobh!!tVSD>Oks$<*B%E z$S6bY97A!A5p{%_8$}cF0EcZc!94X_0HU3kv ztAE#bDzNkVQ_6PNZ%ci%73Jl}e%Ch+%(${W^S7n580LkiU$?#RG%H9ru%~nW_-`+q zFGCdUQQW}l_c#wCK*@H^RFp$B2aQJXCPS@VNH(c_mzA&#S&!`=xsfX|w)^H`9y_+{ zSt{8UUg=}IE4-+d=|mjZ-9$_%ICIDCkn{Rto)Dk}SYc#@3qkY%GqAABouEx^#S54d z3VZL#|CPmR1E|Ef)o9Rz%#v8`6bhVZwLdb<8Laj>3%}*{STAXQraX0s@JD+n1hqHnv5+SZn6O)V2&GrMtR8%@D6lOG{9>Na|Q$4 zgmDoJu$`4Q>x&rW9BSqU_z$GO0Dna=Hs#buF+eA%k{aLR6&=a&e^-u%CYagOp9GmERv zoB(>V7PIc1iHQ?m;2Itc>}eVRjZ9mEG=N8_lPu@F6=ejVfwxiFC7~t=f5f^E*y=&b zo7rh2wL+2*o5~_ctRd=MkG<~v0kS2_K+KB)-o#y0qiEOYOL+&5zBI;!nY+9*Rn_&d zKdR@WRMoejOuVY-X$09Psj6kLa$;4@W|%Wn)erGJfU2rw^^!FO?fK9!<*{ewUyy>T zT7(CLv8umA-<>}pQ=O)&_JQiex4DMas`8QqQB__N0}o|Ym20W0civ`%GM(L68L+!> z>=77x_2Wa!IY0HEtd@`N9tZ%1T6$`%kXP)%A3+UvBfb?Gv&ID>36Av{u2Diw-pew# z*5pPsx_c%!x_c_80Wg6>yg$W_O_h9;t{@-AGO+3%w`*$#}oak`Eyd z<|1Qok#U+@0OJ_?<#BQmF|vV+RH3<&i;TfV#+ZwgG0YiUh&sA_;Fq~hP)T{*zG?axQ!3O zQE|+5Brn216DMcmrTZu+jMdGZ=_26b_dM&^v4)%^^-Z7ZgV~Rb6=^C4;**SeY$!U} zFFsZrhugjU*ct3Mg2@=z?|o*hthHb{^a{7%V@QGh-bFB$KW^A>EN;IsVZUR-ei2Z; zJ_qW_1cZT&fI+~F^UtR>#2WI()P}ek%yC1|98_{c`~!VLq9OjoFlR8t=P^qKL#*M3 zXa&omliUyokpe^f4Z&FEUq6Z=xE8k7AdG zzle@VI*2sD_mGg<07cZMQX60+tQR)`%5NB8DB)>p6jhsOfM*%z3$qWR7aQ( zIA(+!{?t>$w^1G7LNO@)2<98Xv0q@G8omcHG3o>L{eWOkNqsvj(a6C#<{4J~BZuRd zM_G#)ITFX*$NG+uqj5|PyDg0zi(}rWan!Dn(Ku!X8?%m##W9!T5eqcqaZCey1Q|IM z$F#A>)Dcozl(33Dw~Z9WF{e0TR zVjo9NeO*f{*XHBtQ{%7qw~7k99)}9&~8~n`n zdJ6ZyEF6su1$(``ReHN3QA9Tnb$8Ql+QiFLF4myfwpJ5~HJvuMnv%`+&G^|KR}+Di zpKn)<6Ij#vPSe!sa!;tFu=0zopE7xpezg75NJPZS&$oKUDXi%U`#qEJchL6f-Z;OA z4PRWrW9m%%n&XIK{YyFU;=}|!##OvDF+mSzO$b*Z+%-Be(S-1O2nP_ph;Rhq>j)1Z z^t>`LaTKABa2(-DgdQwEHvWEMVgcpPs>_y8WXhY`l`1iT;N5rl^k&cgHWD8eNO zX;a}{c>49y0v9e!k+Ms@wpmfPdDNMi=`PZJKCrX!ci;t-1$iskp4#lfOLE-TxQ3OB zXI!xO-1$YsNc=VUD?E-e5kg#q|0MoAzz-9@xJV{dX!-9ZCYBPeGTZYxTXj}iH!=oD z>0id*TBI*PXr#Bt(;o)93h9_)i>KGe)1L?W+|%&Cjr3JWZzO)d$lq4W1W^9;Esk!a ze<>mT3oP9W+zO<>i1aJX>HeK|TVq^@jiAXz{nsKi^02Q}iGuRj2K;LH0sEAXp~ERd zhue@o1OAaL-3$JMNPiFM_nGBG2m75Y3x#NoBW(wK>ZewkN8>cK*|YeM6BA`rM^X=x zQ)DxAnUAy;W3ZQ5j=k0>OAXRH;G-D{>57rwiS+tEPfQdhq~{pv^lgb6_;#|glCADS z`U3bod&NcSX#0_&-%pVKbELO|)+mE*y^;PZ(iOCoROt@1jTK18%v_wGy92AM`ADCK z^z8}y4;cE_ApJVD!DRd-^6Yii0{>erAos`1{qWfp|648b(aKF-3|;h%0=gtj-#DNP zt0?UHX944NE_UTRd6+3+#mggDbYR!~RXoJ2D(sTqF~EyW?4o-wT{O<2OMcIQ`d_+a z`rkjCh!8wZeJU=ItRVYG1rYP+kA;c;)ZlNoW z2W-DTMe#BQyDEesM7GMXD5%u)u%M%5KDuOnm_%p#dj$Q2fMvcIGO_fBg&{G)&tPG0 zF6@8sSANgVszRBUV=6@0B*JzP4v27Agd-x{FTw*NJS@VaA{-UrxCoWG3cEZa^op=d zgcTxe5@EXt2Shk5!VwYf7vTXB9v0zI5sr#*T!ixDQJx~MhgXDUBCHT$lL*^II3U7d z5srv(zX;{`H`Y~GU*Iin+dR}C8}gQy`Od{hRmz7LSY9F!?1OYRmOpp5f3T6NqRhnV zce0BHx;AAh+8(F3euT=(lLboda4z+`h-B`7w|;=(b+U|XE@v-Vna!1cFWQ*h;lyW% z6q}mX3VO%w(8yUbt&J2=UClt*Y|a8mv)R%M;Np%a!Q(tPZw&|>FW|?yqF@IRJJP?4 z6vtI)U(U7prIfslNH3bUg5p=9c{&?d-04DQS3q*wcPVAwRK$E9il;q7hHWdlzR4&ME6|$WcYYV-SqH~vCKpHlK6WNq6WKp4c<*Q|2@hyW&Yd@cv#jeRK5}< zx)&7A0Aflp;vV-RR}}#F5}3zbl1XYQ?g#MeUhJj>5}b`N-SrKmq`N+#OgxSf2upWe z1|a)eNX;BpODH|N9hl4;)e?G6OY6ta6djnttX>y=4bxqQT(Tllf{61hv#xXg0XUbE zy&b5`&#NWhLt4%@0Itm2RM#&7d5A0X4mE?ZDcSUVk-1AP`5jR%!;dTTUsc!pL>Wb+ z$h=$4A%GO5OtZ(JYvzz$yMVOqCIxS^YqKCT-Bm<+FUL;?`(dR|XPHh-ckCdI{$^KO zk*@ivO0>%%%By5oQp($Q`zj`cika^EG=6hkSy4NcC+~6CHfwMSd1T)GaI>tKo4g=z zF5!pVKd1OQw4JQ2nd1~+Pc+v|-9_AO}~)^xa??#`i_&U(phv$YNcFNZf z4`lzs^$!5wRP(qGA+PLTxv63c-FE?%{c8qz z-B*x+7c}ziV)xsW<%laQ1KA^fkg&Zu+KT_Hm7DTj72W{YCam%+NKckt-q3 zu@nS3hZnn{!jvV57v{X1Q3-%)nDf5Ski_InFflF+O*;Y!x!SX6x_R0IpwHK?A@#K1 z!PL_<>cR@OhoJOyjoS4LEg$V}ruGCA|0hP54aj&+_wHbi>064UAH`Tb}UI~HPio)$kC`5gbX&v82 zhFa-@7~)y?AfE2(L6lXYP?7S^|nJdbu>+H5<`s{N8U{noYLUu7Hgc?FRUes@(t=vMG)xFx$%PD@?=}&myI@ zTVN?P6#S~%7vQQk?Iu)x6)blWY32aA^a?gi zRx-B|u#y1|45$jq>@R@EOM>%mCucjK4J3%YDxF^U$JugY-y%#kh)_Y~bJ%T{bpmszp zCgXaT1jrV|UF3)v)LMb)L7eq`yAWZ#GYr!n&wdd|EeJwIyBG8rn~^tZpMZPYwO6PI z(z;M}PR$F#G);w?>Dn3?*rjbjFPxz@z!j%RfqC z&gcM0mrzK8)8?gBWGy*QV=FW@eM z>h_Xc>hPP~e?pn;i*u=4-soNf{p?Gbw03t3T7|uo0X=S-Gq*2e>I}FqA<<$kQvsEf{ zhP@|9w7}koA7H7%GwcHbn@>*A0VYOTp7(6LM1_ZQ-) zB_Sj)oXPlmlzGp<&mASIx=PTu8uUIGd;U_GAIbB`Pbt4!$lI2vn!$fAEaI4>s;{o( zjB);cgMW@XKY@R)i9bU6=Besz!T*$zKkc94`RB>}13do%$-i;Y^HjU|%dl7YIcIUb zkVO3mT?=U7=a{bA31QpYzTnLSxCbroKafIFSp5_zX_WOmHi4k3>MVLl!bQ!Bh5Pn^ zlxwD{i+Ra}X7)tQ?qr&IrDp4eq(sfqESedx)QqGs&1NfUlywQ!q~lH1aV}SgEo~vH z?khrTTgDY`u^vwGMkrxKWNUH?;3Pcmvn!r$VcyqFs>S_*v$wV6g42XI^zV*w8Mel7AL* z6P0{cD7ldvNrLUdr$`1O86B?F-0q_Pw_WCGTKL zGNnsV`Hp>=)MeWD9=L(2*#gE4`+lM3lBa}Zspj91E3eP53soz)suBz+#Sbmx+HB>4 zQdC5p%zYYlv-Z9B+^{sPIPTBefmHk6yKX3cR*+Xp^2@0`J(Ndk+4eR8%i0qu#>!r( zq*3Wgen{G1t3I@p^ZnFlPA81AU(39f^5hkCov5ISB9_PXqUZ;C(RsTcmNoQ&5G;$% zi#;rg9pJ^5Ak-|mi@Khx)bu4>q5BMluFaQ~ag{}(_C$q($rNgr3N;JCi3)WlDkMQt zh@M#;8`QMLT%mY}^RA)LhN6Ua)hP7g?RrW9>j-83D}|iI{F_Do?c5*|li8~a5GO7X_-l}fD;auSuQOjJsO)Y)8$(ST!t`r}1B zfA&rTqUyeLupGnlUtk!8-3}LtyI~V|qT&Q~xQ!I4&WA#5qB=_w)sZ07Dg94)Id1SY z6R}zFvR5&fN=;Cy=%~w}z#UWZokM*K=dd31pzc!(!SOWb_y%NT*tZ3FL6`h_A&=11 z99_>sc(FvvrLv-a2a`^`XnaK%W3+QkS362Gm@^~T%$8r*=KF1`;bqmowz;nt529P+Di{H4E z^i%&2n}NshU@4uMpgzwgwn<&(afouTHAk@^@;g*0Er?iGQZ}VQ%hN1~BwYkC7CX?) zY9lHWH?#E zlw8%G?RIlM!n?CfVpc&yCJ-(umk?RGptumrP1zzxC(kj*5CsH@!g?vwh@}(fREK(z zoAiJSN&^2}=B)}*R+xg@h-F4SHI`e`OvC^DrLGFhn2=_~^0n?a@J zj5C>b&Uis*nR8g>#0(tcLgbt*C&^vnhB|>3a&{R@=K6eo=m1F%<>dzXafIj ze@}GAG@p_}Yvj=eAF(T6LnBnx_p-C_%kJ6e=+tFHgVAN-{*K+W~`g}c@ufm(QrTl$lfUxeQm-~BQ_Q}`|!crkRBK=+AZt&vf*iA=AL=Z-A3@1T;u50gE_ELKH2#duy2$wjw z1d*sXRVBkF?}PT|RMnZa)0uvg)AfLJ%6FXVdWX&a3nF>Iy1W+8=qD?l;PGr8673rN^AJ%A9#ne#Ta3&LL;^tIqs-XUu^nHxWX!mmk%Pf|q`{XK=UF!AS{GhyoKJDm2NDB^Ei zpZrLk@S8Jw!pd?O;WdctUh$D6CL@E-UY%Pd*o*%NZGBGlwF-e)BoS4QRFJbzecM^+ zn(NHP-?ZO2=O8HjjWh2UL*xO|F{1xDj$T((}YaTH32|^C@o$8}DJ8mN{qtV)x zAJT2idSm$?xe-k2YuQ0j9n@7P^tb4_SbvLd2wgGncjQ>qK3#QAK|OD>;Y1^Ko!(U0 zT)9ENyt%HmvZ~&X!`E=OU9eXlh_G|rl#WPe!bxdj#|Rx#M+e0z>srwp*Y*ax2NfJG zhhw^ey}dZxs%xm9ALcfBYZ==Lqcgs0I*m@LHScG$9!j@PuWQu(&CQL?*xpuG@2}AV zl?^orsqd9%qY0%<$9kcwhW_U+S31Lk131D>kp=Z{Y^txTu4~mB8rgoR$@cs(X%m^fppRUzhc{zA4qdSzcu1=iNR|lKb z!ZylQy{k78g#F^>3pBR0>TM0p{>thAs|%8~p|Z6)zzv}Ehqfg!T;AALU!ynstJ|8f zX{|e6WymZ#)Dgo5FIjA;bXg@fM#V*vHBkf{#?~(m-V+Dr#Y@moRo9}h8`z+-g;f== zHdz?6@^uZDRo2(l=#|au+BRUXnX;~l?#J9SNF?8vDEAkNeQnshDDbVDn*4ej0JG4B zM!lt}61y3hx0q94q#C`kp?;GYiA{?eH&MmvmG$+Fm%~R))@`lZ0Ox6JYgP2ky+hH> z%oMz)+8S#7wRH_ie2Q(I62}R$Q~vn*ij#bgHHB_oqp&Fs{G&tSl%e8-+E+HleFK^*w(;Wqh1S-pOl%{k41;yVe8ibPDfTK-XoD@>XrOTfU zFJXF1`(i`=p|#y15QIAb2BRH4YjOHq>3J)>rQP1r!C2?o4$zl&HPuz)H#oSxzoRD_ z>5mKzmJan_6Yj?;dNlYOL?S!c663c>3}-e*qF@Fggop$>-LFR`<7`SKbaa_uG->K{ z&Rc<2U(M>34J*y|A`{o5a%*_^1k%Y>B=;QRfdyM+QD}6mqz3yL>K_bu_lG*Y^nz#C z5YC?L50anpzRubs3NOSkoc9OPUBZy5*ACRMZMwVx&-XR58v)KO?JuXF<;peT&R9=^5Y}t(n~Sm;=d?!A zXsPEkZakt@kVQl}Oo_Y`-r#S>K2d4YT7D=gs~6@EZG)S+wIP~Cp-kLhi=%gRvzZ#MA`Ef|aRg&|M0DjF48 z>y4jStMo_Zxv|i>8%;4`{KMs5&2BdFdb-T0CmPQLV;w!Fwv5AggZbki}76KE)alq%*sElt?Jo-i_~ z!H`UhidetHSov6~rLDRe6-Lg}g3d)}5}K$E;d^8W;eeA{o#=YuXxRKcxu}!M#x^Ef z3R6>u@ffy^W4zcO?${!;42$s}3~BTQP5k&}r6&~b?unbW#t&ub9$f=s)|6V3dn*4% zgSFSAVF4>89p&a!bctJl_7uA@fU=GQB$;4k>NM9Ml2)YZ_4*c` z!O)>6LPsp)riSqpN@e~QhMC#lP*c~i4koOj)0x+?c4ZoUi=u#k12v~+?(Mt~3NJso zs>vh8mobblDbRgR9288qe%4H^mBFkbPsrxaOQzus8|42N9wd`}UBgsl**oK0-$uP2 zy}cZHiq1q1wRt}Z)4>4~TcfxMcC)gWB+LH4rn0qiQpHOfq;5~*qYRUb!;gYi`Xh7@ zwbB{s3x@j>n{CVGbxj!k$M0`OZ&hE{u%35R{FrZJkb@(?yLn}p*r=On_OENJ$44F5 znA()K0X+lV3z^mM_>zzxzq?n}H{v#J)!+E8!8+c@FmF%h=fZRNw?(!ZkJfa6d63$8 zELuquqDGG+#|Ct#)z|siG3Ibo)_!?6&Kg2Tq!))tiMX^U5jq&9MK(h z`ulODxw7t3cBc7c_c2=9S`fJkWY|)t2)%H->vKM@$8w*4{@wg}F$S9eY@VrG{{1JwJtf5Z&mc zfmwsU_43B%^_J&**(BxjS!Mm@m77{{PgS<^?}1>buyrf4Pk5w|Hx8>qiVtza@% zA$>-0v&t>1B&#`rjku$dwAY zVt-KJt!w{B1m5}GJ3p`Al_=hi#hCi zSl1N^zDKkuNttcQqWsp z0oy3(hb{CSg5LVN+;xI}zo5q}1nl~}ptrsQ_;o>lSkPmknqBt_dh3gfKNj?(f?nF^ zr-I)4;^ixXUcON&%ln3)x4uC-1#{zMPx)f#IYOU&;K`oWcVU+b`U*cMl=A6aU!u3Z zd)p}R)^~clfKS%$Q0+%Q`D0gsnFlmSs*$#qD`k^PdyKgsZ@)pm*DA-&OOqptvX6Y|n89v*Q z9Pb6*J4p(@m6U>h3&UqmdOPO}Dd_j5z(1Y>|8fd^j+3@3Oum)_pRBxBrNHk=fxk5c z{zwY^sTBBySQt;H=f%J$vvULR$@HgPfXVQ*r7#)(u@w066!( z)-n3Ye!Cs`qRD9G%PHs|Pl30gYe;5?<-jM?U+IX(24h2AUHG_UXDAx##>5mY5cFa4 zA<|EC+j?h2$3yI9tYda!CVx;54sF9qX5T<>2#aFAvg8yr^u$CrJ&Ix2O^+sB7$Jwm z^aw`Pafq#bCXh~gH>LwqKZ#4J@y8hc1RjUuvzw-eD)ty>9f2pzvecR{f@*4!JCJ~6`GK1p$NfegnCf|9JD2zvaL(0lYG#z3(!ys8PiG)3Z8tLaw zN*B-L2F3D86p7z5GzceG3x8;Wqti;fuEXc8)h*|3ta!0%WOZoqIHc>fcwfM;V|oow zn5@ZAYZ{E`n1t@c(vDuU2}=ZZ)xcu4PWNN-jxhvknt^KFP%T;4)i+jQ?WVD|wgr>> ze7zHG1`mTFEJ+Iw#KIMQ0JB@ik^vSvvFxUc<#)ZKZvd}#A&DH1H%PQvT92q}-GF5P z*)bqX>K0mQna^wla$H{X?6JL~zOJg4uLrj_*68KFGGVjRJYJgf#+=AjE*}lCpQb4J zJZw_AI+d?u3uf-O=v~2ZZ^b&~Uac?pCHM?!C_OK=j^;^iJ=poFA-si=x-Srm*=*7* zscI&7p!|93IbH6kB2-0!e+k#Z+Y!9WwPpnCu1+YaXgetxjLN|5br`kHSHx0@XVeL1 z83={8V7i-TsNsa&eQ+aGKr{vyMjf)(IDj9#lr^mb@$OL8daBNlcls&w z%V#sIMxV9ZmvA%WK0za`)V+quMBGDzL$L_!!^2FrF4wKB=9<*r_@e3= z>7~UCt0=y~?R{7+MHq|nut&zQAQAF)_Ye7unPQ)T;&a4UlxGAzcqK&fb#Cv6FdkwP z3rm6f4^oRT13J>8q23@dh}Zy@Sbc1e4M< z3v)u2KkIC!@U;%14W!rhLTRO8_&2B z|5XeBVZkrM;WOm_Zx(*J4k5!oSRS@zzEYoWTlnQXq6|fKN^({Y27t(S1;3$Yg-8|Q z06C87vgZGNq>=q4znp)RA+0NzFKhihfkZQZQ!S^KA${?|d`bV2xL+VbE+@(4y2*ih zPGO~&und0-GHk;%_~kmy!H>xQC-9Q~GJm=La9HqrDbaL!O>v68jX&~z$uH-1M>kL^ zzS}DJWi?2>Wj)ZkkU9UOI%89gHuBKR1LIfn%kTrFnE91$Wvix$Mx?S*lC7}qd@}`RX%Pe$~e}M&0y3!@X8G@f<+EC0$A{6E~n8R)x+=F7@ooq~UAgmbN-o2%)v^3yjT z2xqllJuO7yD#DgU^CkJsp=|qRx`ACB8o@jwT}Aj?jXzm`^8P`|mLdX!>q|WFV_wmG X$$TYlDk91F{daPTPgoc%pz{9!qOtsw literal 0 HcmV?d00001 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-ssm-test-v1+1.94-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-ssm-test-v1+1.94-x86_64.so deleted file mode 100755 index 0ad3be4b463e0c37fb436b56fce5f815b5b87af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125120 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 diff --git a/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so deleted file mode 100755 index c370fc2128bbe37b3b1692e7da5ed2642bf3eb55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42784 zcmeHw33MFA)o%AJ(#WG_+*&Mecr0&{ZOO8+!3GT4Mw-F0q-X(|0Ijh!k_Jl}A&rbp zLQrfV7{^2o*&t3rUP2%N{uq9EF@}JF00u(hs#mr!`~q z!aL`kcb;2EQ+03Md+XM%Th-N7U0qlEYO8Iks>sW(oU0I2wt!>GM1uFbB7&eyS*^J7 zJ71Z{XdSVnNwLwX93?}=!(qz9Nl`ET;PSFxBV3-(VHukFSbk-K-V#RBI9`Tkz7!x)^FSdlD5Qk)8gq}8#5#Q)~PCt4{d^k=8!6ic%2Ne=S|96mp1fiEUV6 zGFy@i@|l{t76s-xK)MKWmYySEN)LXx`~A1i`e4f+t|%IOw{QKkFTC*<^C&XwQv8!# zravKE*W-ud-+1X~4?KO&bC)tif}aIo)DqygB*Bk^HW59Q#hXA*82TilwMh15sU9^g#1^y(2Ub>Ix4=Lj%q0D|;e+q2}Pm zo)Aw3-tExQ2Qpmy(c(0sJ90P zqaY1S+RosnWDMax=+_5%j7Q31Qu;%oO?rQDAk-H%GGPh9j?0Dyqk8{9cylls(j%Rn zgCQb`keqN|II4psG!TdB2?aN!oMa7BvwM@?84UM;Buu2tO3`pTk_W8JDgTbpVEaJ0U(^LE6vi(#=V|ax&ecdtmT!BopXy7N&hT)FPsG=Q z_Li`AxVBW8ljL=T7&?)-cDV8YJTfxCJS%}a3=R##AvzM~311uPP3#i9?FNUU5!Q&p zti{KBXf)EH4|bzTcIX{weW8I^H_#K_*vTrPcttVDN(Lh(%M~EoDRu_Mc*jvpodHo4 zM?-_rVlJk5^YSIjOV+F`-m>}({fw1hQEF-f6_xsmk`*PZjQC0g$m)j1KwY!mTwkRx z*TJ+R5poh`Noh%`vMkacT?RFl)zsCm_br1?vadvl+XMdXA|%LxIE8dMS)4=Vx)62DjA4_NS-WsF>D4f0UZ zOZbq^@idkdSu(_76W)B^95vxZmW+PPgkQu(vfunR4x}QGHYALj$7xJui2l<28OR63z(i$ zc$EFNnec8CzT1RPH{ttDcsPJ@Z87094XmOJoA7dMK*`se@aA#FhzTzqnTcHamIzBUdJej1Om-vezNAiQ`KXNZF){B%yj zeh-=OGfeoyCj3kje$<4YWx|h{@Uu<$aTESD6aKgfKgWbuM0+9qy(YZNgr94|drbHO z6F%RBpJ&2*P5AjHe4zaLNLwEO5#Krz~*F0;eo+$^vA8cd|}<-@pAWmw%`8>GKrDf9-*& zZQ_uB`!8INGXqVm`V-K{CKmh|LDn2b-%TmUj=nlEF)>2?-715BW56^abnNJ(25e{W zJqAn@RmYBg-+*aC=-AQS222w{$Bur{faxLr*wM=km?nOX9Ss^VP52x;`WXYJiJoIe z%MIAg;N=EP6FbL_&NX0~&^dN=ssYnP&atDa0n-G|v7`U^SeBP2Zcu&$rU{#4M}K3$ zG~tHw8!%1W96NfC0n>yH%5T6lQG@auFip^){02-DGbq0S(}WDlZ@@GWgYp|NO~9c1 z222w#$Br&HV4842`3;yRT2OuirU@35-+*ai1?B%pmfy?ZR}FYBgMVYdG=YNh8!%0r zp!^0*6DBCX0n}{DcMmxdp!80^eTieF-UeP}Xi1BI``Q9fD*hd>N7MZ~*Iozw*zZ4_m>BCo z=k=uXD!}R`;5G6m{-akQu?0N-9aoL{clyTsJAC5^@efJ9<1G3VX{{i7{F28R?e@1k zpg%tLKDq_}j>jm)zvBh}j;F>BqG3MGi9o;-b}AOG=p-&1Fi$^D`k2LYu}_WVK&F3( z^9hu0r}HWN;>MKC5_hfIN5(~1P1Zoii)wYxGt#C@lH-}RKw zu8cp!Jo{a^llphOOobh!!fyWs>Oks$$?=$Q$S6ha97b^t6Lo}{8$}avKZkkAcjZ0- z2k`G`$d}1Kg76&&AbQ;Yl-m%q|`+`s**3=Lf!Z5#o`c2#KpJoLK`*(HBAOGVy^JR#FJ%k%r?Jnm&1SnZxrlRbpIchY5 zzcSR?|3)xY{yr;VDY72hIdTnGVr=L2!#s9)$FHbln|P&o5#})ok2qr_X@Z$|;XstL{MxJm~;}G55brR!eG=5UAdq#%&U3tfeP3 zz#1~Pbhya|h=4g}02<{bHo(uId%OW|W0;c|;987}V1NKCZAK$TIr|&A0rnyV26zO) z*p%a+!~h+jN@#!wVVRf*P$TuDA?-7F9%JY{cKY^__Z6~s>pKJ(|7ELToP#XBEBAqz zcQDdM2xi7Pj5ak&LtYRbMw=R?HZ_VCG|Jl4EhrZm=P)pbS)00^VNPP4ZVVz}oG7zI zMhiNX{TdkN#Kh4XxQ2)PyBhjIBh$`C z8o-0pNiOHSWu*k5fwxfEC7~t=A7~1FO4!`<}UAKRdp5YkLvj(RdqX*iB%OnjUf93RrPl?#rUdv ziD6DsRX@k`0IF&#tCx&t;LiJpDUV&N#*l)l`X_?1iua)J_Fs^xPEb{QKy~!TTtjPB zc}aq(DldtFhq9{5wp7(W-(`d{o!wX&urq(`K^S_?<3lSrKlPuimJjXh_XCAmdTK16 zSM0urp$5AVe-jzA#swj9j`anuQCv;_gk^56$yPMFJ0>@}J1D>ZWWK^08XT^y47GZI zl{2oacxZyAV1cLbsk;21_!o18WH-ccB3usfbctLry0Py({<0Sij7Y_ahJHB4cooahh5H;~4toadHtcvVn`(&|Jwy z#^54j%tglW9RKp8CvlNO7{tLvegRLxSZ6j^_Wz3V*tO~dq`*a{V5BF<7a5A!AY^=DKVNPPd5lqIwe!qm3V84&h zp7y`W?e`#3V83S&jOC6S_8W`YZ%o+lu&`eQRBz6KdNKi_zZEbDm~n1Ap&`yDZ%l58 z%fTEo1kFJuHpBxcL%bnwXPA>1;!BvNf+5`85IJOsW84t;A_azc6v0^f-#>{VIzjbj z2{Q!0yGsjwM0SkXN231%`s5BWk6L7MyKI2Wm|bWtF0oy{k0ugtm#;9)N$e8AY#!`# zHfv28v%s=Hg?iClt8PIG?DAs-WADEGN$gVhH_;JE2ayK29|_3~P(W=exdB>Xy_f+| ze!~DmaZgjXqH5y}a3jNa3%P+chm5nqvVS@^z|Al=3~&d6v3K6$2CzI7qu)eX z(IC)KewHeqKkpy+$Bpjs#CM>LNM0cK+CdNd;9%X)IvDl@GE+||vzugYnG#>=+SGb%c4AV@9~)k3Tj1Evf@tClp<1tJfdjuId9>cV-$J7y0T4-3op4&$9W0>Qd#v8+& z#ij&C3MB?LGXbA5)x+2$fG>GGwnkvA3Lx)O*C`8}vcM?|oU*_v3!JjR|FagT?hjY7 zEriwB2&7au=obVUn_J3j_3H9v7VDE)Hp zf%-bVp|QTgr<9Z|<9m!)c5LHONjvRC5*wA+wnU#rZ4%p%m~B5z{`C#MI$1%V zMowjIeUncJ`ZRKUb&d74wOr7rk#m8sF;KnX)5{4|`RbZU659;M_WFfGG?|R+)96=O z-q76A$SwA1B;HS~2vesALs5dp&H z>g#;W_Ig71zaTsi9SZh%c^mU~Mg|bwIMmfedt*)IU=4_EOO?io*Ndgo=2TPiB!0F> z)kI*G&$pY#2(0ORr)ctYxu;W7Soy`)O_@ANKia-&BqCzv=UX*n6xQ^({hA5*+iClA zPmEv0hR-YGF?FW>>?4R`{Yn}C!^8wVh7G?oF+mSjBM4U`e0p?Zq5TJvcomOT z2$vw-i?9LVA%x#UIF4||pC%?eSU&s;!j%Yr_veX;W`r-iHZc)J_~Ppm6JJBP?XMFP z`w-S1otQX+@bhm@Owb1~p2cID7vb}GG%rK=79OYD5WbBE*YNb}r3ETnnDk_qdS#=cZtPlm$*%;NP==+&?e(%V(DTdvgAN;i4{zF8YQ6 zT@t2mAkc+X6n5Px;MoGscJfHNfE6!~V9|kH^H=i_ud1+1e&+x$HnEHD-E`47i7xrQ z1M0u&lIib#JP{#y9DOofB3q@K7G`nL5n{v7Az+y=hF&cFMv;yQ zeg+G3b7B7%f93b=tSXdxIi^g64I*q4VZR86MK~hDTSd56ga<@;NQ9#z92cQ7S7Db& zgkBMrim*(C4I*q4VZR86MK~hDTSd56ga<@;NQ9#z92cSdc$BAr>){n)sR+wN*dW3- z5%!C4ScD@Yyj6tq`y4fum1lViTQ&~$MTfl0OG{2KDJ@<;#K7f60>M5=XJh$ucl#F` z=_<-hESM*{mI7&0^3nDLNuuK>=jD6ow<9%uL@lE9%r;=szor(^b6!dxex~TaEBd~?nheI767jFJ5<+i0eOfk{Z2KFu_>AKe3E{%TJ#E0F2j#2 z{a)4eAyIarQKa9mW)VONQl^=Ig|6u%cI_v?H4{aJO?7<^zuB&gAv={S=P^`8 z#^x#HmpOOA*)pzhlP}~H5`K&OmlUr?Eo5v>AE)>_qPcSF4vN>J{xUu{_3IR;r;Uuy zr@Ij3{5Mp{xGG~N#e1Ms#uqY~+PQq^J=4z?A0zuYc11`0yCU{6moEtO}_yw!??C6j*C#x z%scFqq2s$iXFfKU#u-z-gSbEQH!k`JlDmx({!61uRNRlEK$*YOs6Dyd>+qZTf<~%& z+!<)+nJ>Djdh^{s1S<0|1HA5wNWdR8^6*0UyOiY-29&zLj5^4C$xYuRT?mVzMb;l)#-!jvV5=VyJG<_Ewu%=(yX=piv#s>sHg>Lt3liI19C$_1NNRfU?$5 zjb{z2F3R2WcS;#jv)HGrJolmQvo@<)T~LtPzaJ#7jrd7pKV;@KN=swpsV*mqoa*W$ zD$>G4)oY@BXM zSAfW+7U4uGSX*!^qA`0kTjna1RC^YULDAZwwyKrF(l)Ihzjm!0?&i>*N8G8sK=%=? z5=|ymyN(Q@?EqJr=7E4I+V_y^)^394>DsyY&Cp!PH&cs}FKC6RXODI|w4AD40=%Xj zgoJGEIkepz?QYQLYF7ZCr#%lPr)kuaFF9Z>={}X8s1E8KT>CDXX1CZMm2hx z_AzR7j+P4zy;?frbG843oC597&~2V}7jmDkeGw8CXid;zq4rz+F4B&JrcfI}?nPPz z`Y+ZVLyk+dr6}D}Z3g5c25pPAV<=aN;;}GjggkNwnYn0g3i!UI%p=pfYLdxE#3L z{CPeomC=v5qZ6`nr_a6sh$$h&y}8%8z93c3y)H9ml-w^(qXaU_8ic8?^YQDbLG9SQ z>NgOdQjK^%fO`Niqax1u703IqEufzxW#+#SciHm3>dJ=#?f~qa_jM0-TuOSlL&>{2 zhkDcN-46kicMAhX+}W^t-nVlu2FJJDk3mY_o}6YF^;UN`0pH7{+tD5F0Fm9A`A3l5 z1=U#en0pt|n>!!2m^_^$OA5lYJio zmpbciD))U;E~8?rv+g13_cO?&&UzNeyq~3$via&PH)XbuL0)y%OJtS@7*wdvqB_p| zdHOIYOI6g#4X{S4iz>kJIB?TutEHgGcntAW*L*~$@gab1X(riHYk-Xu?P~ats$C5i zvMCPo4O^-GY!mT$vq)*}>#!6W3Vv1X7L?PbT?>zKXv0*Y+Wo+Iv}`Er)!v7-%e0qJ z{NdRHu%e=vyAV!v-mFc2J`2qA(w9mjf zRE<8@Y?H%*{F#|WAejCgBwekI<5$rRa%mI5=g+YdzbJX0H?x7H?IHs0azs()XUU1? z*;fH_?4TN4I{YI&BpI4{L3Cwdqv= z3Y9soycJF&P46d{UdcwwO8RC3Rx!YV5mjEPoyM{VIR zpar{+0S;wOe%`rG%G!Mkc|_Slp17Mx6eO@*- z4aHrHANzuAx|im=C-7@unEe`XUia6Lzr8S$0Joc_=#TJQ1h%4hw80 zmN_aFI@OiKeu=7J4b*eYR;kQs_U<6j0(%X9fTapgv-b;ZE;+$vU}80^Dk&F{fDUNs zn3GTVG`sww=e&g^;4D@B_8ExaV#@~z)jdyuaDEYrj^yQq0BpNk7yJX}bDX1Ury;cM z?p79_Nm5s->X!vS=-8$1d5`#MWeLd(3mAX5GVeL~xuZx`R}1=PgMJl^J%1_8kK}pe zrPP5WFa}R^OjqrMu=X z%wWf)y$YDUBnYL7mXgyQQ9oGD^Jgn~EdL)H`5&1p?85VZIWGSPs8h1vD)V2wg3F1| z|JC^XB`A$TGMG_vloZOgXeFAaYoa*(;9efPerxmM2ztr`lx z011v~(_aIFZFep6s!PF^W*?SHz9HnsEBPy-WGgq41lxp9kqoBfG$n=9C|XE0ceDEW z60Rg$KV?dupCgsLc>!6@zWZB3$!{|ynbHNQe8--2>N4%S_g>A^ya*Po%i0qu#>$?rq)_RK?j`N7RPSBN`JOSF)3{OgE1B0)p1guS zFDj_4faP(ODEdBLbl&dEWDR{J1k0lHVh@XA`+2b?2sMj-NL|mRYU&cM(4B@tU(A)2 zaj8Y2ws?hti4^img&Kw6c!fIR6_Ow+^h+}2dNpM+S18uusCiPM^#yV5s$S^B+x1kC zp(B*}uM%?N^KTUSw{e3=P_`?Q!Ky7+Nug|uvdBv3sLmp*Qr|F?Iw!udpBtwXZ|tL$ zoV{?RkQ1*|dAw2*q|T-RqXEYP^^rwf0DCn8QFYG(tjh3qy}&REyB#hPcf$tmM1^tc za2p+v>U=E3#;da=UL6TSo#IE~<+#DqOvFaP%iic0)wL)9Hsry0ivLh5^*fQ3B|=@D-BuB7aZss*ro2dMRI^baunYSjRePnNqPJ- z0mljws6NLe$mI*sJ-~BH`}>hNlZ$U%O8Tk4W)txk9xSD!6VyX&ew)-)9)~CgTY41h zBG02jXZC-ejAvxZURh1tB6zo|vcDGtY9L?Ox*! zz$=_tAcFLT3PGs^QN)$2E}E_)lICOyQ?gZirrXW=2=C4?iCGN^=|H%oTtZ}IgW?>l zI%SF+ojk`ZLlh7s$|FRvbmE-qP|tOf9uOyJv_c4*g|zHxs#%R3vl_THscImbWaiC< z+RH$XX?sH!icD$wOcrW$I*Y*hW>9H4<4mTVGgi=9<{VaII6a$jA#z#<@*sWZWXI{` zB|K*2fHlb}SZOkt4Ng6;1SaJrTr{2PtStW<70l-Iot%^zgh&?%UIVdkGVeDz?;;`% zWUrh~e1&efg_eqLR?x!&mb?~=yqG%>&l1iZu1P8Ki<7xLkxWsT6-m;l_5Zv69`B4PB}x*lk;fwVh+P>#BUIH7Fdd1f1$1(l za8XptxfS8Q_MV}R(6TPP%3i#pq?ARhhg(RZ*z4{q@It(m3aK$Mg2hTBCB?Gi=fa$v zE*wclW729FodvQy8DZDZ;Kt(R%P3HkuHH~@NjI6Kv%i?XoD2{aoAjE0H%vJh+fG<2 zMth{MGu#DU-0-^S6r({dwktR=5Zo%_?64XUXNU2KIGvY+LvjQ(Nbd)WI7vbjt+i`& zuxCidafVTl^d>wvodCj-5RL_+yixaE;fU0PApTl#4;|0M(^2GbFOGZxgc9Q|V*^B! zV`efef{vHc4HyLAW~Z~nxFv{0#i=T3HhFKeKc}kBjP1_UYn`sUom2k9sjhR_?9Y6m zWWQ_MHi!Ky`yCF~@G&fBt0}Ji2<)zsl-DStrr1g}LQtXuOZbkIR{W%%kDoNxU9Q%Y z=s|m$twD93_KtJ*JI;c4o%Yv}2EO@PitX}TXO^uX*O?M^rq;T;oc85T)wVci#UxT^ z7Kn4==v-Z&l+2|$XTR>8^^P-ro3o(Sq<~qfbERvq)4t7_`WI))`OX=nW2-Zh0^lxk zEpyskxy}XKo%Vop(FP~ZjB%(F__3w5I$@M~uCIOST$~%69#^R|Wt(#m&wT~Y{agx4 zoU=F*c6!mZ!l}BtWtQnM>qALO1)Hw^EEOx|FT6~58D+Y}nTgy|qt02S&KxK|W3w}B zzcceSXKt-CYrC@q+1cz{OPtx1@A+8cVgadUZ)LLVQK!eA-uej?eqAbjj4Gnwy(G%Q z#Me1z!qn5ZIqlm~#1~x`e&(Xgv=^Oo5ahq;%sI>uIe>Cqb14b`dH5$Xj+y0}2h4ne zki&eZ`jE|z8^b;{S-bL0x;t2J75|63_(^>zJKL$9y5P8e6g?8_N722Yi{<@^95>ph ztIjE?!3{PW^sUhw${Wkq>lZc#n#(I{eK;=-$I%6Q^!^AticM*cbi^HQ#x{}gv#IE8 zH>IW-y=-+)uxn7kX>d4ME7;S6^Qbz9`uO>4lXru$-7Y%gtE2(r?CUB@1UhGl^Lp?Z?jTwRD@guPs%P$1a z1$5_8Y69Y5y#Q=h4cjQ2_0FD15cZ3e&tKovthdxP`pPT)tS(5_`ts&VKR1BV7upiX zaAAE*ZI#~Wt88h+zO=4bl_9f%q4p^DaLHmrr3=cj_bDcltcfDv{IouCR-QQHE>?oN zia?XXZcKy9CRSCv+GJtO$_MH$D6b7v>E(?zE$gwJOsQ$0`z-ei63Mp`$}NFn>l*eO z3Vid12A|#nz$~<`UTW<}rFGc>S~nS$3;OI?+(I#8Fur`T>OaRMMan2#TcILY@|Q|RI~3Y+4LK04P; z=^CU{8pYXc;f}a-1-Z}i-9{!gN&EHnEp@Cl>ecZ0NtuZ)Sae<;c6;^XaKo+Uf>xH- zRr+eFg~Y5|?JK99czRU}c|RPXNw4(#D%Y9$DCf%hx;kHFGkAN$eM8Z3Fhnk*vyqO% z2QX%q@>;5g4P0TCp|zglx5{+|`(eOPZ@=Cbx&mV|lZL$hn<^ll_edm}dL^F{xuOq8 z+tFxD!O6bf$~9}mdz0Sc-sn(YXl+*r1mSjo!GZSfwK%n|_>7g_;x2FTV6R14GwPYYwsS2^hJgSi--EI2>0ROI~vptB9R?NiE&vZienZd17HRrgop&{^txp- zj*~<}d#4FTlcqlBjFo8hm8@RbaM5fpGI2F3w~BX9Ae~%Aa$6xDDX#RMZ@Inl)d4C|?B@CH*b$=Dxh|Bw6lLt2V8rKJ! znrP!L_Jsyet%K-kgYEdia_nSnFH4%9WEU0aLKw=%LD0gf8&TTVYKlqW-7iA-kRvkd2rJmEc@rYJI77^tzCGt*qy|1wby{oWkH9tp`)eG~7mcfnO+7Qd# zyQ#UnIZ&zB1<(j5+f;Oq-QfsD6uerPinFRE} zdTdzL{d#q6prJvuSB?{wG)t8|I`u(y?%q@s)}X~^ za*Qh2kijfobk;s}%H=K1e!l+|K5r6HzdmN}`l9}-)x`*9R!J2OT6?TGCVH`%Scs;be~)C9-UTX1WYw|?GMV!c=}8tDx~ zo~U*j3Rx?QpDe5N4aoCdp>r47U)-RF%e|c4VPf@kfl*I1hzUm9yG;!khvo+Ry5Og9 z5!QpnB(}hcO+y>0@8GxJ8l6=}b!~YK?kIKTwMu`-P;YPCU8A|a9%GHV4LX^E-FKQ; zOQt@gCyKs}`X8en&?1_e8(S)y`90X^OeVEKz8yK%flAD^YdiMos8jc+nfEHsOV26XA-J8=dHR z;d0pCJ-Mip%Eq=LTMAPZz;Fy3!!ca!3%75QS%$^%51wRn1r7YbWTiV4?&>D1@Q$I% z2W9CNT?Jy+sG1V{EdQ#4wbP?f0V^dPzpThUgSz_wO;^xOTo?d{Id^nm3%SmHp}M~b zlN`*22fK0nuQ%>q!)j1;-ss#nPcjB(Rp``Z+00`OhvwSi)5|O1FZdip(mM7Bs%XG$ zGAHjKsBaJ>e?0wQV$!*B|vGJn0o%&fPM%VzJ6yL1G&8$nbS>r|~yY#B^=JH83C<~LkVTkW1 zOe!Tmg<0u~&>7ImGEy^krmy(A2Td!|kk@?9@G^blP`IZ<>4@|O!+r5Bw&}t^1IGQa zo3PPA)duR;@xF$UPKNRwJnVmlgcGNo?tQ&nJ-Wmpix%fB6LZn zBws5&%YjaHV(^nJ&|qn!WSXW8>nrN!ef68~jbx0&jgevR%lL?@mbhUl8=xH#KO79Lcx7BzX^$ldH(LF};B4dPvY) zUqbmUqxUHCbrQT0!>*SFz4fJ;cLeK$J#x+z9i_aFW-Gn&<_iG ztPr#7CxYJk2H_)u{#HRR?emPFx4!ZCs-Qn$(f=($Z+&%h3MRVAo}+@EjyreSedM61!(~+3o3%qxd6h%2F3H>I9&z$sH%neEC_awnTo&^7L5`31E_6SVA zRsf&K4woju?@EIIW)l3tB>3Y=@C&heok-8~fKO!SI^YxO|Jfw?uO`7ingldHfhF1`v!o@JwF=hr%y^357P$4ib)jl-y$>!Cszx97=okIvbwIr=dIN(CvU8Hu>@pw zXz@Ix>(yBN_vx4{!;>RxGSr#|BRVFRJFrfpS8c%5f1narEWPPIOvNzA zYfWu^1r}oJtE-zZY0nog(Pr?F7sC3o@Ib6W(I+drbgcSg)e>uHx>!rs+k5-*?iG^A z@pywotEF{@K=XP`@5_z>SyH#qOlx*#Baq|rnrDyWWwn8dYQDJJTwkRxFDVr^JHcb4 zId4p8Z07RO5c_DtkZN9vfOgy8GGfRIcvMr?zR9A`J1#%0+Ud570#C$?Ra5?SyugF2F1yr-HaK zOjSUg^2v&8yf!47!wIuB$!6sm8er=jyycy&WbAf!GIiujOqgsO*s8PFT+OCu?}<>> zw5r3qLs{#|Iz!&+C(V~PSY2=55~MDlO^X_R){2t2n<4iJ8fhi(HB2Vr9vU2qMpz#n zX0mm;3S~9dr1r)aOHWEKEoN9nDH+__i&apB(E%QI%NSNALM2^&LnX#EZ;63o%MZm^ zFlGeZc)vp_>Dbx_VLZg{5tah?AEXvx26UtignEL+AY%PkC@o=wq!L6+x*`B6f|+`y zBuX!DmC&dZ)DgA-P!j4ETWgHev@IdgtiJA#|JW65C zfM4wUIEc#7EATSF<4@d0n;y;l2ZbOR&X1#}IhXjW93YO_iOBrNMMQ>$f?V=h^IwN_ zZ1XVmm){|jVS`}A>?TF>$3ppn}Sk*`5i$S zUMz^E{*q3H-AJcz6iRrUCbV(Mu%CnUHayc&>MzjB6^M{*$=`-8Gjz%D0E1$7m;AE) zUqm|bR|q;UO`PMB;Q=xZE}|hGEB{X5$R?OJ;FmW(B>ysB(hd@L9U^9aua~FDa6}eN zFvw?A8Sb|5?=9ejGL&?J-FU{8_**Re2L!(ihfk9K4=nt09YThGwmfXhe5F1=w(!e& zL>Y?el;o4z&rb!vp=OyN6(RQY#9h|>e}+`DzvP$mk20in1@mRCzbBAr=J!-{Y8ld} z7R;CQABp=lBII(COs<>kt>qL}dI`($k08VTM}uFk)9m|%{C@>6=`Zt_>kkJ6zn2nC zm)8`h=)3qQ-V!Z From 312b75fe6692917a0d4bd71e7bca2a315837e722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 4 Sep 2021 04:08:10 +0200 Subject: [PATCH 27/32] test-fp-todv1-types: Ensure we check all the enum values We were ignoring enum values when there were gaps, so let's check that all the values in the old version enums are present in the current one. --- tests/test-fp-todv1-types.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/tests/test-fp-todv1-types.c b/tests/test-fp-todv1-types.c index 1317bb36..6846faa8 100644 --- a/tests/test-fp-todv1-types.c +++ b/tests/test-fp-todv1-types.c @@ -37,18 +37,26 @@ check_enum_compatibility (GType old_type, GType current_type) g_autoptr(GEnumClass) current_class = g_type_class_ref (current_type); int i; - g_debug ("Checking Enum %s", g_type_name (current_type)); + g_debug ("Checking Enum %s vs %s", + g_type_name (current_type), + g_type_name (old_type)); g_assert_true (G_TYPE_IS_ENUM (old_type)); g_assert_true (G_TYPE_IS_ENUM (current_type)); + g_assert_cmpuint (old_class->n_values, <=, current_class->n_values); - for (i = 0; g_enum_get_value (old_class, i); ++i) + for (i = old_class->minimum; i <= old_class->maximum; i++) { GEnumValue *old_value = g_enum_get_value (old_class, i); - GEnumValue *current_value = g_enum_get_value_by_nick (current_class, - old_value->value_nick); + GEnumValue *current_value; - g_debug (" .. %s", old_value->value_nick); + if (!old_value) + continue; + + current_value = g_enum_get_value_by_nick (current_class, + old_value->value_nick); + + g_debug (" .. %s (%d)", old_value->value_nick, old_value->value); g_assert_nonnull (current_value); g_assert_cmpuint (old_value->value, ==, current_value->value); } @@ -61,10 +69,13 @@ check_flags_compatibility (GType old_type, GType current_type) g_autoptr(GFlagsClass) current_class = g_type_class_ref (current_type); int i; - g_debug ("Checking Flags %s", g_type_name (current_type)); + g_debug ("Checking Flags %s vs %s", + g_type_name (current_type), + g_type_name (old_type)); g_assert_true (G_TYPE_IS_FLAGS (old_type)); g_assert_true (G_TYPE_IS_FLAGS (current_type)); + g_assert_cmpuint (old_class->n_values, <=, current_class->n_values); for (i = 0; i < old_class->n_values; ++i) { @@ -72,7 +83,7 @@ check_flags_compatibility (GType old_type, GType current_type) GFlagsValue *current_value = g_flags_get_value_by_nick (current_class, old_value->value_nick); - g_debug (" .. %s", old_value->value_nick); + g_debug (" .. %s (%d)", old_value->value_nick, old_value->value); g_assert_nonnull (current_value); g_assert_cmpuint (old_value->value, ==, current_value->value); } From 5d0a3eab5c3defb4b8ff173085beea79c5e97800 Mon Sep 17 00:00:00 2001 From: hermanlin Date: Tue, 12 Oct 2021 14:02:48 +0800 Subject: [PATCH 28/32] elanmoc: add PID 0x0c7d Signed-off-by: hermanlin --- data/autosuspend.hwdb | 1 + libfprint/drivers/elanmoc/elanmoc.c | 1 + 2 files changed, 2 insertions(+) diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb index f3ee8fc6..b7700a5e 100644 --- a/data/autosuspend.hwdb +++ b/data/autosuspend.hwdb @@ -142,6 +142,7 @@ usb:v04F3p0C58* ID_PERSIST=0 # Supported by libfprint driver elanmoc +usb:v04F3p0C7D* usb:v04F3p0C7E* ID_AUTOSUSPEND=1 ID_PERSIST=0 diff --git a/libfprint/drivers/elanmoc/elanmoc.c b/libfprint/drivers/elanmoc/elanmoc.c index aef386c1..69700a0c 100644 --- a/libfprint/drivers/elanmoc/elanmoc.c +++ b/libfprint/drivers/elanmoc/elanmoc.c @@ -25,6 +25,7 @@ G_DEFINE_TYPE (FpiDeviceElanmoc, fpi_device_elanmoc, FP_TYPE_DEVICE) static const FpIdEntry id_table[] = { + { .vid = 0x04f3, .pid = 0x0c7d, }, { .vid = 0x04f3, .pid = 0x0c7e, }, { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ }; From 5e934a4fa0c25be4572925f96af44f409697f1ae Mon Sep 17 00:00:00 2001 From: boger Date: Wed, 20 Oct 2021 20:11:05 +0800 Subject: [PATCH 29/32] goodixmoc: add PID 63CC 63CC: Dell Latitude series fingerprint sensor --- data/autosuspend.hwdb | 1 + libfprint/drivers/goodixmoc/goodix.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb index b7700a5e..42d22ca7 100644 --- a/data/autosuspend.hwdb +++ b/data/autosuspend.hwdb @@ -159,6 +159,7 @@ usb:v27C6p60A2* usb:v27C6p639C* usb:v27C6p63AC* usb:v27C6p63BC* +usb:v27C6p63CC* usb:v27C6p6496* usb:v27C6p6584* usb:v27C6p658C* diff --git a/libfprint/drivers/goodixmoc/goodix.c b/libfprint/drivers/goodixmoc/goodix.c index eb5e67a6..15a85323 100644 --- a/libfprint/drivers/goodixmoc/goodix.c +++ b/libfprint/drivers/goodixmoc/goodix.c @@ -1282,6 +1282,7 @@ gx_fp_probe (FpDevice *device) case 0x639C: case 0x63AC: case 0x63BC: + case 0x63CC: case 0x6A94: self->max_enroll_stage = 12; break; @@ -1505,6 +1506,7 @@ static const FpIdEntry id_table[] = { { .vid = 0x27c6, .pid = 0x639C, }, { .vid = 0x27c6, .pid = 0x63AC, }, { .vid = 0x27c6, .pid = 0x63BC, }, + { .vid = 0x27c6, .pid = 0x63CC, }, { .vid = 0x27c6, .pid = 0x6496, }, { .vid = 0x27c6, .pid = 0x6584, }, { .vid = 0x27c6, .pid = 0x658C, }, From de46e1e4b862ff266a68faca826116dab203f23d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 27 Oct 2021 01:59:14 +0200 Subject: [PATCH 30/32] tests: Add missing trailing new lines on devices attributes This as per the same reasons of commit 63bfaf4, and without trailing new lines such attributes aren't picked by umockdev in ubuntu and debian. --- tests/egis0570/device | 298 ++++++++++++++++++++--------------------- tests/elanmoc/device | 296 ++++++++++++++++++++-------------------- tests/goodixmoc/device | 278 +++++++++++++++++++------------------- 3 files changed, 436 insertions(+), 436 deletions(-) diff --git a/tests/egis0570/device b/tests/egis0570/device index e22dcf1e..5247b785 100644 --- a/tests/egis0570/device +++ b/tests/egis0570/device @@ -25,63 +25,63 @@ E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc. E: ID_PATH=pci-0000:00:14.0-usb-0:9 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9 E: LIBFPRINT_DRIVER=Hardcoded whitelist -A: authorized=1 -A: avoid_reset_quirk=0 -A: bConfigurationValue=1 -A: bDeviceClass=00 -A: bDeviceProtocol=00 -A: bDeviceSubClass=00 -A: bMaxPacketSize0=8 -A: bMaxPower=100mA -A: bNumConfigurations=1 -A: bNumInterfaces= 1 -A: bcdDevice=1041 -A: bmAttributes=a0 -A: busnum=1 -A: configuration= +A: authorized=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=00\n +A: bDeviceProtocol=00\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=8\n +A: bMaxPower=100mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=1041\n +A: bmAttributes=a0\n +A: busnum=1\n +A: configuration=\n H: descriptors=12011001000000087A1C700541100102030109022000010100A0320904000002FF0000000705830240000007050402400003 -A: dev=189:4 -A: devnum=5 -A: devpath=9 +A: dev=189:4\n +A: devnum=5\n +A: devpath=9\n L: driver=../../../../../bus/usb/drivers/usb -A: idProduct=0570 -A: idVendor=1c7a -A: ltm_capable=no -A: manufacturer=EgisTec -A: maxchild=0 +A: idProduct=0570\n +A: idVendor=1c7a\n +A: ltm_capable=no\n +A: manufacturer=EgisTec\n +A: maxchild=0\n L: port=../1-0:1.0/usb1-port9 -A: power/active_duration=362352 -A: power/async=enabled -A: power/autosuspend=2 -A: power/autosuspend_delay_ms=2000 -A: power/connected_duration=5526124 -A: power/control=auto -A: power/level=auto -A: power/persist=1 -A: power/runtime_active_kids=0 -A: power/runtime_active_time=365097 -A: power/runtime_enabled=enabled -A: power/runtime_status=active -A: power/runtime_suspended_time=5160752 -A: power/runtime_usage=0 -A: power/wakeup=disabled -A: power/wakeup_abort_count= -A: power/wakeup_active= -A: power/wakeup_active_count= -A: power/wakeup_count= -A: power/wakeup_expire_count= -A: power/wakeup_last_time_ms= -A: power/wakeup_max_time_ms= -A: power/wakeup_total_time_ms= -A: product=EgisTec Touch Fingerprint Sensor -A: quirks=0x0 -A: removable=fixed -A: rx_lanes=1 -A: serial=W700B41B -A: speed=12 -A: tx_lanes=1 -A: urbnum=8040 -A: version= 1.10 +A: power/active_duration=362352\n +A: power/async=enabled\n +A: power/autosuspend=2\n +A: power/autosuspend_delay_ms=2000\n +A: power/connected_duration=5526124\n +A: power/control=auto\n +A: power/level=auto\n +A: power/persist=1\n +A: power/runtime_active_kids=0\n +A: power/runtime_active_time=365097\n +A: power/runtime_enabled=enabled\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=5160752\n +A: power/runtime_usage=0\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=EgisTec Touch Fingerprint Sensor\n +A: quirks=0x0\n +A: removable=fixed\n +A: rx_lanes=1\n +A: serial=W700B41B\n +A: speed=12\n +A: tx_lanes=1\n +A: urbnum=8040\n +A: version= 1.10\n P: /devices/pci0000:00/0000:00:14.0/usb1 N: bus/usb/001/001=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C @@ -112,63 +112,63 @@ E: ID_PATH=pci-0000:00:14.0 E: ID_PATH_TAG=pci-0000_00_14_0 E: ID_FOR_SEAT=usb-pci-0000_00_14_0 E: TAGS=:seat: -A: authorized=1 -A: authorized_default=1 -A: avoid_reset_quirk=0 -A: bConfigurationValue=1 -A: bDeviceClass=09 -A: bDeviceProtocol=01 -A: bDeviceSubClass=00 -A: bMaxPacketSize0=64 -A: bMaxPower=0mA -A: bNumConfigurations=1 -A: bNumInterfaces= 1 -A: bcdDevice=0508 -A: bmAttributes=e0 -A: busnum=1 -A: configuration= +A: authorized=1\n +A: authorized_default=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=09\n +A: bDeviceProtocol=01\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=0mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0508\n +A: bmAttributes=e0\n +A: busnum=1\n +A: configuration=\n H: descriptors=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C -A: dev=189:0 -A: devnum=1 -A: devpath=0 +A: dev=189:0\n +A: devnum=1\n +A: devpath=0\n L: driver=../../../../bus/usb/drivers/usb -A: idProduct=0002 -A: idVendor=1d6b -A: interface_authorized_default=1 -A: ltm_capable=no -A: manufacturer=Linux 5.8.0-59-generic xhci-hcd -A: maxchild=12 -A: power/active_duration=378024 -A: power/async=enabled -A: power/autosuspend=0 -A: power/autosuspend_delay_ms=0 -A: power/connected_duration=5527220 -A: power/control=auto -A: power/level=auto -A: power/runtime_active_kids=1 -A: power/runtime_active_time=377962 -A: power/runtime_enabled=enabled -A: power/runtime_status=active -A: power/runtime_suspended_time=5149253 -A: power/runtime_usage=0 -A: power/wakeup=disabled -A: power/wakeup_abort_count= -A: power/wakeup_active= -A: power/wakeup_active_count= -A: power/wakeup_count= -A: power/wakeup_expire_count= -A: power/wakeup_last_time_ms= -A: power/wakeup_max_time_ms= -A: power/wakeup_total_time_ms= -A: product=xHCI Host Controller -A: quirks=0x0 -A: removable=unknown -A: rx_lanes=1 -A: serial=0000:00:14.0 -A: speed=480 -A: tx_lanes=1 -A: urbnum=956 -A: version= 2.00 +A: idProduct=0002\n +A: idVendor=1d6b\n +A: interface_authorized_default=1\n +A: ltm_capable=no\n +A: manufacturer=Linux 5.8.0-59-generic xhci-hcd\n +A: maxchild=12\n +A: power/active_duration=378024\n +A: power/async=enabled\n +A: power/autosuspend=0\n +A: power/autosuspend_delay_ms=0\n +A: power/connected_duration=5527220\n +A: power/control=auto\n +A: power/level=auto\n +A: power/runtime_active_kids=1\n +A: power/runtime_active_time=377962\n +A: power/runtime_enabled=enabled\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=5149253\n +A: power/runtime_usage=0\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=xHCI Host Controller\n +A: quirks=0x0\n +A: removable=unknown\n +A: rx_lanes=1\n +A: serial=0000:00:14.0\n +A: speed=480\n +A: tx_lanes=1\n +A: urbnum=956\n +A: version= 2.00\n P: /devices/pci0000:00/0000:00:14.0 E: DRIVER=xhci_hcd @@ -183,46 +183,46 @@ E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller -A: ari_enabled=0 -A: broken_parity_status=0 -A: class=0x0c0330 +A: ari_enabled=0\n +A: broken_parity_status=0\n +A: class=0x0c0330\n H: config=86802F9D060490022130030C00008000040021A400000000000000000000000000000000000000000000000025108E11000000007000000000000000FF010000 -A: consistent_dma_mask_bits=64 -A: d3cold_allowed=1 -A: dbc=disabled -A: device=0x9d2f -A: dma_mask_bits=64 +A: consistent_dma_mask_bits=64\n +A: d3cold_allowed=1\n +A: dbc=disabled\n +A: device=0x9d2f\n +A: dma_mask_bits=64\n L: driver=../../../bus/pci/drivers/xhci_hcd -A: driver_override=(null) -A: enable=1 -A: irq=127 -A: local_cpulist=0-7 -A: local_cpus=ff -A: modalias=pci:v00008086d00009D2Fsv00001025sd0000118Ebc0Csc03i30 -A: msi_bus=1 -A: msi_irqs/127=msi -A: numa_node=-1 -A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 9 10 2112 10\nxHCI ring segments 32 36 4096 36\nbuffer-2048 1 2 2048 1\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0 -A: power/async=enabled -A: power/control=on -A: power/runtime_active_kids=1 -A: power/runtime_active_time=5524703 -A: power/runtime_enabled=forbidden -A: power/runtime_status=active -A: power/runtime_suspended_time=3373 -A: power/runtime_usage=1 -A: power/wakeup=enabled -A: power/wakeup_abort_count=0 -A: power/wakeup_active=0 -A: power/wakeup_active_count=0 -A: power/wakeup_count=0 -A: power/wakeup_expire_count=0 -A: power/wakeup_last_time_ms=0 -A: power/wakeup_max_time_ms=0 -A: power/wakeup_total_time_ms=0 -A: resource=0x00000000a4210000 0x00000000a421ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000 -A: revision=0x21 -A: subsystem_device=0x118e -A: subsystem_vendor=0x1025 -A: vendor=0x8086 +A: driver_override=(null)\n +A: enable=1\n +A: irq=127\n +A: local_cpulist=0-7\n +A: local_cpus=ff\n +A: modalias=pci:v00008086d00009D2Fsv00001025sd0000118Ebc0Csc03i30\n +A: msi_bus=1\n +A: msi_irqs/127=msi\n +A: numa_node=-1\n +A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 9 10 2112 10\nxHCI ring segments 32 36 4096 36\nbuffer-2048 1 2 2048 1\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\n +A: power/async=enabled\n +A: power/control=on\n +A: power/runtime_active_kids=1\n +A: power/runtime_active_time=5524703\n +A: power/runtime_enabled=forbidden\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=3373\n +A: power/runtime_usage=1\n +A: power/wakeup=enabled\n +A: power/wakeup_abort_count=0\n +A: power/wakeup_active=0\n +A: power/wakeup_active_count=0\n +A: power/wakeup_count=0\n +A: power/wakeup_expire_count=0\n +A: power/wakeup_last_time_ms=0\n +A: power/wakeup_max_time_ms=0\n +A: power/wakeup_total_time_ms=0\n +A: resource=0x00000000a4210000 0x00000000a421ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n +A: revision=0x21\n +A: subsystem_device=0x118e\n +A: subsystem_vendor=0x1025\n +A: vendor=0x8086\n diff --git a/tests/elanmoc/device b/tests/elanmoc/device index 8d47c2da..ef3400dd 100644 --- a/tests/elanmoc/device +++ b/tests/elanmoc/device @@ -23,62 +23,62 @@ E: ID_USB_INTERFACES=:ff0000: E: ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp. E: ID_PATH=pci-0000:00:14.0-usb-0:1 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_1 -A: authorized=1 -A: avoid_reset_quirk=0 -A: bConfigurationValue=1 -A: bDeviceClass=00 -A: bDeviceProtocol=00 -A: bDeviceSubClass=00 -A: bMaxPacketSize0=64 -A: bMaxPower=100mA -A: bNumConfigurations=1 -A: bNumInterfaces= 1 -A: bcdDevice=0305 -A: bmAttributes=a0 -A: busnum=1 -A: configuration=add909c9-e67e-4126-a6f7-1e31179e27d9 +A: authorized=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=00\n +A: bDeviceProtocol=00\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=100mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0305\n +A: bmAttributes=a0\n +A: busnum=1\n +A: configuration=add909c9-e67e-4126-a6f7-1e31179e27d9\n H: descriptors=1201000200000040F3047E0C05030102000109025300010103A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001 -A: dev=189:9 -A: devnum=10 -A: devpath=1 +A: dev=189:9\n +A: devnum=10\n +A: devpath=1\n L: driver=../../../../../bus/usb/drivers/usb -A: idProduct=0c7e -A: idVendor=04f3 -A: ltm_capable=no -A: manufacturer=ELAN -A: maxchild=0 +A: idProduct=0c7e\n +A: idVendor=04f3\n +A: ltm_capable=no\n +A: manufacturer=ELAN\n +A: maxchild=0\n L: port=../1-0:1.0/usb1-port1 -A: power/active_duration=94712 -A: power/async=enabled -A: power/autosuspend=2 -A: power/autosuspend_delay_ms=2000 -A: power/connected_duration=94712 -A: power/control=on -A: power/level=on -A: power/persist=1 -A: power/runtime_active_kids=0 -A: power/runtime_active_time=94436 -A: power/runtime_enabled=forbidden -A: power/runtime_status=active -A: power/runtime_suspended_time=0 -A: power/runtime_usage=1 -A: power/wakeup=disabled -A: power/wakeup_abort_count= -A: power/wakeup_active= -A: power/wakeup_active_count= -A: power/wakeup_count= -A: power/wakeup_expire_count= -A: power/wakeup_last_time_ms= -A: power/wakeup_max_time_ms= -A: power/wakeup_total_time_ms= -A: product=ELAN:ARM-M4 -A: quirks=0x0 -A: removable=removable -A: rx_lanes=1 -A: speed=12 -A: tx_lanes=1 -A: urbnum=12 -A: version= 2.00 +A: power/active_duration=94712\n +A: power/async=enabled\n +A: power/autosuspend=2\n +A: power/autosuspend_delay_ms=2000\n +A: power/connected_duration=94712\n +A: power/control=on\n +A: power/level=on\n +A: power/persist=1\n +A: power/runtime_active_kids=0\n +A: power/runtime_active_time=94436\n +A: power/runtime_enabled=forbidden\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=0\n +A: power/runtime_usage=1\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=ELAN:ARM-M4\n +A: quirks=0x0\n +A: removable=removable\n +A: rx_lanes=1\n +A: speed=12\n +A: tx_lanes=1\n +A: urbnum=12\n +A: version= 2.00\n P: /devices/pci0000:00/0000:00:14.0/usb1 N: bus/usb/001/001=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C @@ -109,63 +109,63 @@ E: ID_PATH=pci-0000:00:14.0 E: ID_PATH_TAG=pci-0000_00_14_0 E: ID_FOR_SEAT=usb-pci-0000_00_14_0 E: TAGS=:seat: -A: authorized=1 -A: authorized_default=1 -A: avoid_reset_quirk=0 -A: bConfigurationValue=1 -A: bDeviceClass=09 -A: bDeviceProtocol=01 -A: bDeviceSubClass=00 -A: bMaxPacketSize0=64 -A: bMaxPower=0mA -A: bNumConfigurations=1 -A: bNumInterfaces= 1 -A: bcdDevice=0504 -A: bmAttributes=e0 -A: busnum=1 -A: configuration= +A: authorized=1\n +A: authorized_default=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=09\n +A: bDeviceProtocol=01\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=0mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0504\n +A: bmAttributes=e0\n +A: busnum=1\n +A: configuration=\n H: descriptors=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C -A: dev=189:0 -A: devnum=1 -A: devpath=0 +A: dev=189:0\n +A: devnum=1\n +A: devpath=0\n L: driver=../../../../bus/usb/drivers/usb -A: idProduct=0002 -A: idVendor=1d6b -A: interface_authorized_default=1 -A: ltm_capable=no -A: manufacturer=Linux 5.4.0-42-generic xhci-hcd -A: maxchild=12 -A: power/active_duration=74604360 -A: power/async=enabled -A: power/autosuspend=0 -A: power/autosuspend_delay_ms=0 -A: power/connected_duration=74606456 -A: power/control=auto -A: power/level=auto -A: power/runtime_active_kids=4 -A: power/runtime_active_time=74605838 -A: power/runtime_enabled=enabled -A: power/runtime_status=active -A: power/runtime_suspended_time=0 -A: power/runtime_usage=0 -A: power/wakeup=disabled -A: power/wakeup_abort_count= -A: power/wakeup_active= -A: power/wakeup_active_count= -A: power/wakeup_count= -A: power/wakeup_expire_count= -A: power/wakeup_last_time_ms= -A: power/wakeup_max_time_ms= -A: power/wakeup_total_time_ms= -A: product=xHCI Host Controller -A: quirks=0x0 -A: removable=unknown -A: rx_lanes=1 -A: serial=0000:00:14.0 -A: speed=480 -A: tx_lanes=1 -A: urbnum=490 -A: version= 2.00 +A: idProduct=0002\n +A: idVendor=1d6b\n +A: interface_authorized_default=1\n +A: ltm_capable=no\n +A: manufacturer=Linux 5.4.0-42-generic xhci-hcd\n +A: maxchild=12\n +A: power/active_duration=74604360\n +A: power/async=enabled\n +A: power/autosuspend=0\n +A: power/autosuspend_delay_ms=0\n +A: power/connected_duration=74606456\n +A: power/control=auto\n +A: power/level=auto\n +A: power/runtime_active_kids=4\n +A: power/runtime_active_time=74605838\n +A: power/runtime_enabled=enabled\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=0\n +A: power/runtime_usage=0\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=xHCI Host Controller\n +A: quirks=0x0\n +A: removable=unknown\n +A: rx_lanes=1\n +A: serial=0000:00:14.0\n +A: speed=480\n +A: tx_lanes=1\n +A: urbnum=490\n +A: version= 2.00\n P: /devices/pci0000:00/0000:00:14.0 E: DRIVER=xhci_hcd @@ -180,46 +180,46 @@ E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller -A: ari_enabled=0 -A: broken_parity_status=0 -A: class=0x0c0330 +A: ari_enabled=0\n +A: broken_parity_status=0\n +A: class=0x0c0330\n H: config=8680ED9D060490023030030C00008000040030A10000000000000000000000000000000000000000000000003C10EF85000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F00000000181C030400000000316000000000000000000000000000000180C2C1080000000000000000000000059087007802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000B50F300112000000 -A: consistent_dma_mask_bits=64 -A: d3cold_allowed=1 -A: dbc=disabled -A: device=0x9ded -A: dma_mask_bits=64 +A: consistent_dma_mask_bits=64\n +A: d3cold_allowed=1\n +A: dbc=disabled\n +A: device=0x9ded\n +A: dma_mask_bits=64\n L: driver=../../../bus/pci/drivers/xhci_hcd -A: driver_override=(null) -A: enable=1 -A: irq=124 -A: local_cpulist=0-3 -A: local_cpus=f -A: modalias=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30 -A: msi_bus=1 -A: msi_irqs/124=msi -A: numa_node=-1 -A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 32 128 1\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 54 54 4096 54\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 9 32 128 1\nbuffer-32 0 0 32 0 -A: power/async=enabled -A: power/control=auto -A: power/runtime_active_kids=1 -A: power/runtime_active_time=74606194 -A: power/runtime_enabled=enabled -A: power/runtime_status=active -A: power/runtime_suspended_time=0 -A: power/runtime_usage=0 -A: power/wakeup=enabled -A: power/wakeup_abort_count=0 -A: power/wakeup_active=0 -A: power/wakeup_active_count=0 -A: power/wakeup_count=0 -A: power/wakeup_expire_count=0 -A: power/wakeup_last_time_ms=0 -A: power/wakeup_max_time_ms=0 -A: power/wakeup_total_time_ms=0 -A: resource=0x00000000a1300000 0x00000000a130ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000 -A: revision=0x30 -A: subsystem_device=0x85ef -A: subsystem_vendor=0x103c -A: vendor=0x8086 +A: driver_override=(null)\n +A: enable=1\n +A: irq=124\n +A: local_cpulist=0-3\n +A: local_cpus=f\n +A: modalias=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30\n +A: msi_bus=1\n +A: msi_irqs/124=msi\n +A: numa_node=-1\n +A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 32 128 1\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 54 54 4096 54\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 9 32 128 1\nbuffer-32 0 0 32 0\n +A: power/async=enabled\n +A: power/control=auto\n +A: power/runtime_active_kids=1\n +A: power/runtime_active_time=74606194\n +A: power/runtime_enabled=enabled\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=0\n +A: power/runtime_usage=0\n +A: power/wakeup=enabled\n +A: power/wakeup_abort_count=0\n +A: power/wakeup_active=0\n +A: power/wakeup_active_count=0\n +A: power/wakeup_count=0\n +A: power/wakeup_expire_count=0\n +A: power/wakeup_last_time_ms=0\n +A: power/wakeup_max_time_ms=0\n +A: power/wakeup_total_time_ms=0\n +A: resource=0x00000000a1300000 0x00000000a130ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n +A: revision=0x30\n +A: subsystem_device=0x85ef\n +A: subsystem_vendor=0x103c\n +A: vendor=0x8086\n diff --git a/tests/goodixmoc/device b/tests/goodixmoc/device index e92ffbb4..9fb39e59 100644 --- a/tests/goodixmoc/device +++ b/tests/goodixmoc/device @@ -25,60 +25,60 @@ E: ID_VENDOR_FROM_DATABASE=Shenzhen Goodix Technology Co.,Ltd. E: ID_AUTOSUSPEND=1 E: ID_PATH=pci-0000:00:14.0-usb-0:3 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_3 -A: authorized=1 -A: avoid_reset_quirk=0 -A: bConfigurationValue=1 -A: bDeviceClass=ef -A: bDeviceProtocol=00 -A: bDeviceSubClass=00 -A: bMaxPacketSize0=64 -A: bMaxPower=100mA -A: bNumConfigurations=1 -A: bNumInterfaces= 1 -A: bcdDevice=0100 -A: bmAttributes=a0 -A: busnum=1 -A: configuration=XXXX_MOC_B0 +A: authorized=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=ef\n +A: bDeviceProtocol=00\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=100mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0100\n +A: bmAttributes=a0\n +A: busnum=1\n +A: configuration=XXXX_MOC_B0\n H: descriptors=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000 -A: dev=189:52 -A: devnum=53 -A: devpath=3 +A: dev=189:52\n +A: devnum=53\n +A: devpath=3\n L: driver=../../../../../bus/usb/drivers/usb L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:20 -A: idProduct=6496 -A: idVendor=27c6 -A: ltm_capable=no -A: manufacturer=Goodix Technology Co., Ltd. -A: maxchild=0 +A: idProduct=6496\n +A: idVendor=27c6\n +A: ltm_capable=no\n +A: manufacturer=Goodix Technology Co., Ltd.\n +A: maxchild=0\n L: port=../1-0:1.0/usb1-port3 -A: power/active_duration=29262 -A: power/autosuspend=2 -A: power/autosuspend_delay_ms=2000 -A: power/connected_duration=57399 -A: power/control=auto -A: power/level=auto -A: power/persist=1 -A: power/runtime_active_time=29308 -A: power/runtime_status=active -A: power/runtime_suspended_time=27850 -A: power/wakeup=disabled -A: power/wakeup_abort_count= -A: power/wakeup_active= -A: power/wakeup_active_count= -A: power/wakeup_count= -A: power/wakeup_expire_count= -A: power/wakeup_last_time_ms= -A: power/wakeup_max_time_ms= -A: power/wakeup_total_time_ms= -A: product=Goodix USB2.0 MISC -A: quirks=0x0 -A: removable=removable -A: rx_lanes=1 -A: serial=XXXX_MOC_B0 -A: speed=12 -A: tx_lanes=1 -A: urbnum=394 -A: version= 2.00 +A: power/active_duration=29262\n +A: power/autosuspend=2\n +A: power/autosuspend_delay_ms=2000\n +A: power/connected_duration=57399\n +A: power/control=auto\n +A: power/level=auto\n +A: power/persist=1\n +A: power/runtime_active_time=29308\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=27850\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=Goodix USB2.0 MISC\n +A: quirks=0x0\n +A: removable=removable\n +A: rx_lanes=1\n +A: serial=XXXX_MOC_B0\n +A: speed=12\n +A: tx_lanes=1\n +A: urbnum=394\n +A: version= 2.00\n P: /devices/pci0000:00/0000:00:14.0/usb1 N: bus/usb/001/001=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C @@ -111,66 +111,66 @@ E: ID_PATH_TAG=pci-0000_00_14_0 E: ID_FOR_SEAT=usb-pci-0000_00_14_0 E: TAGS=:seat: E: CURRENT_TAGS=:seat: -A: authorized=1 -A: authorized_default=1 -A: avoid_reset_quirk=0 -A: bConfigurationValue=1 -A: bDeviceClass=09 -A: bDeviceProtocol=01 -A: bDeviceSubClass=00 -A: bMaxPacketSize0=64 -A: bMaxPower=0mA -A: bNumConfigurations=1 -A: bNumInterfaces= 1 -A: bcdDevice=0513 -A: bmAttributes=e0 -A: busnum=1 -A: configuration= +A: authorized=1\n +A: authorized_default=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=09\n +A: bDeviceProtocol=01\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=0mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0513\n +A: bmAttributes=e0\n +A: busnum=1\n +A: configuration=\n H: descriptors=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C -A: dev=189:0 -A: devnum=1 -A: devpath=0 +A: dev=189:0\n +A: devnum=1\n +A: devpath=0\n L: driver=../../../../bus/usb/drivers/usb L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d -A: idProduct=0002 -A: idVendor=1d6b -A: interface_authorized_default=1 -A: ltm_capable=no -A: manufacturer=Linux 5.13.15-200.fc34.x86_64 xhci-hcd -A: maxchild=12 -A: power/active_duration=219578717 -A: power/autosuspend=0 -A: power/autosuspend_delay_ms=0 -A: power/connected_duration=219649620 -A: power/control=auto -A: power/level=auto -A: power/runtime_active_time=219589127 -A: power/runtime_status=active -A: power/runtime_suspended_time=0 -A: power/wakeup=disabled -A: power/wakeup_abort_count= -A: power/wakeup_active= -A: power/wakeup_active_count= -A: power/wakeup_count= -A: power/wakeup_expire_count= -A: power/wakeup_last_time_ms= -A: power/wakeup_max_time_ms= -A: power/wakeup_total_time_ms= -A: product=xHCI Host Controller -A: quirks=0x0 -A: removable=unknown -A: rx_lanes=1 -A: serial=0000:00:14.0 -A: speed=480 -A: tx_lanes=1 -A: urbnum=4325 -A: version= 2.00 +A: idProduct=0002\n +A: idVendor=1d6b\n +A: interface_authorized_default=1\n +A: ltm_capable=no\n +A: manufacturer=Linux 5.13.15-200.fc34.x86_64 xhci-hcd\n +A: maxchild=12\n +A: power/active_duration=219578717\n +A: power/autosuspend=0\n +A: power/autosuspend_delay_ms=0\n +A: power/connected_duration=219649620\n +A: power/control=auto\n +A: power/level=auto\n +A: power/runtime_active_time=219589127\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=0\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=xHCI Host Controller\n +A: quirks=0x0\n +A: removable=unknown\n +A: rx_lanes=1\n +A: serial=0000:00:14.0\n +A: speed=480\n +A: tx_lanes=1\n +A: urbnum=4325\n +A: version= 2.00\n P: /devices/pci0000:00/0000:00:14.0 E: DRIVER=xhci_hcd E: PCI_CLASS=C0330 E: PCI_ID=8086:9DED -E: PCI_SUBSYS_ID=17AA:2292 +E: PCI_SUBSYS_ID=17AA:2292\n E: PCI_SLOT_NAME=0000:00:14.0 E: MODALIAS=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30 E: SUBSYSTEM=pci @@ -180,44 +180,44 @@ E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_AUTOSUSPEND=1 E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller -A: ari_enabled=0 -A: broken_parity_status=0 -A: class=0x0c0330 +A: ari_enabled=0\n +A: broken_parity_status=0\n +A: class=0x0c0330\n H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004C084B0100000000316000000000000000000000000000000180C2C1080000000000000000000000059087001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000 -A: consistent_dma_mask_bits=64 -A: d3cold_allowed=1 -A: dbc=disabled -A: device=0x9ded -A: dma_mask_bits=64 +A: consistent_dma_mask_bits=64\n +A: d3cold_allowed=1\n +A: dbc=disabled\n +A: device=0x9ded\n +A: dma_mask_bits=64\n L: driver=../../../bus/pci/drivers/xhci_hcd -A: driver_override=(null) -A: enable=1 +A: driver_override=(null)\n +A: enable=1\n L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c -A: irq=128 -A: local_cpulist=0-7 -A: local_cpus=ff -A: modalias=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30 -A: msi_bus=1 -A: msi_irqs/128=msi -A: numa_node=-1 -A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 46 50 4096 50\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0 -A: power/control=on -A: power/runtime_active_time=219589302 -A: power/runtime_status=active -A: power/runtime_suspended_time=0 -A: power/wakeup=enabled -A: power/wakeup_abort_count=0 -A: power/wakeup_active=0 -A: power/wakeup_active_count=0 -A: power/wakeup_count=0 -A: power/wakeup_expire_count=0 -A: power/wakeup_last_time_ms=0 -A: power/wakeup_max_time_ms=0 -A: power/wakeup_total_time_ms=0 -A: power_state=D0 -A: resource=0x00000000ea220000 0x00000000ea22ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000 -A: revision=0x11 -A: subsystem_device=0x2292 -A: subsystem_vendor=0x17aa -A: vendor=0x8086 +A: irq=128\n +A: local_cpulist=0-7\n +A: local_cpus=ff\n +A: modalias=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30\n +A: msi_bus=1\n +A: msi_irqs/128=msi\n +A: numa_node=-1\n +A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 46 50 4096 50\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0\n +A: power/control=on\n +A: power/runtime_active_time=219589302\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=0\n +A: power/wakeup=enabled\n +A: power/wakeup_abort_count=0\n +A: power/wakeup_active=0\n +A: power/wakeup_active_count=0\n +A: power/wakeup_count=0\n +A: power/wakeup_expire_count=0\n +A: power/wakeup_last_time_ms=0\n +A: power/wakeup_max_time_ms=0\n +A: power/wakeup_total_time_ms=0\n +A: power_state=D0\n +A: resource=0x00000000ea220000 0x00000000ea22ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n +A: revision=0x11\n +A: subsystem_device=0x2292\n +A: subsystem_vendor=0x17aa\n +A: vendor=0x8086\n From 17ff49f85cb29b2545c5cc193f84a2931dc203d4 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Mon, 25 Oct 2021 18:38:38 +0200 Subject: [PATCH 31/32] goodixmoc: Fix template struct for required length calculation The length is only a single byte in the transfer. However, the struct had a uint32_t in that place, breaking the sizeof() calculation and seemingly creating issues for certain lengths of user id strings (which depend on the username). Fix this by changing the type to uint8_t. Also add the initial 0x43 prefix byte and a byte of apparent padding that the struct contains. Leave the two reserved bytes at the end, as they seem to actually have a meaning (i.e. they are seemingly send in listings). This effectively makes the struct one byte smaller, bringing it down to 127 bytes from 128 bytes. Closes: #428, #404 --- libfprint/drivers/goodixmoc/goodix_proto.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libfprint/drivers/goodixmoc/goodix_proto.h b/libfprint/drivers/goodixmoc/goodix_proto.h index bcd1cdd0..000be2fe 100644 --- a/libfprint/drivers/goodixmoc/goodix_proto.h +++ b/libfprint/drivers/goodixmoc/goodix_proto.h @@ -113,14 +113,16 @@ typedef struct _gxfp_enroll_init #pragma pack(push, 1) typedef struct _template_format { + uint8_t _0x43_byte; uint8_t type; uint8_t finger_index; + uint8_t pad0; uint8_t accountid[32]; uint8_t tid[32]; struct { - uint32_t size; - uint8_t data[56]; + uint8_t size; + uint8_t data[56]; } payload; uint8_t reserve[2]; } template_format_t, *ptemplate_format_t; From 77ff30e19d356f8850aacf7f4f5fe9da26b233cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 28 Oct 2021 19:08:00 +0200 Subject: [PATCH 32/32] tod: Mark symbols that were added in 1.90 series as part of TOD 1.0.0 Otherwise we'd cause the symbols to disappear on such versions --- libfprint/tod/libfprint-tod.ver.in | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libfprint/tod/libfprint-tod.ver.in b/libfprint/tod/libfprint-tod.ver.in index c0de483b..8166f164 100644 --- a/libfprint/tod/libfprint-tod.ver.in +++ b/libfprint/tod/libfprint-tod.ver.in @@ -14,12 +14,7 @@ global: fpi_device_class_auto_initialize_features; fpi_device_clear_storage_complete; fpi_device_get_udev_data; - fpi_device_remove; - fpi_device_report_finger_status; - fpi_device_report_finger_status_changes; fpi_device_update_features; - fpi_print_fill_from_user_id; - fpi_print_generate_user_id; fpi_spi_*; fpi_ssm_get_device; fpi_ssm_jump_to_state_delayed;