From: Jakub Jirutka <jakub@jirutka.cz>
Date: Sat, 11 Sep 2021 22:52:03 +0200
Subject: [PATCH] Hack fprint-list-udev-hwdb to generate udev rules
hwdb is systemd/udev specific, it's not widely supported. Let me quote
author of libudev-zero:
> Udev hwdb is yet another illustration of systemd-like approach. What the
> hell "userspace /dev" has to do with parsing hardware
> database(pci.ids, usb.ids) and setting/remapping buttons? Udev smells
> like systemd by trying to implement all possible functionality in the
> single daemon/code base. Standalone UNIX-way programs much better
> suited for such purposes.
This patch adds hacky support for generating classic udev rules (same as
in the older versions) into fprint-list-udev-hwdb program - if environment
variable HACK_GEN_RULES is present, it outputs udev rules instead of hwdb
entries.
See https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/336
diff --git a/libfprint/fprint-list-udev-hwdb.c b/libfprint/fprint-list-udev-hwdb.c
index dadb303..d2c4ada 100644
--- a/libfprint/fprint-list-udev-hwdb.c
+++ b/libfprint/fprint-list-udev-hwdb.c
@@ -20,6 +20,7 @@
*/
#include <config.h>
+#include <stdlib.h>
#include "fpi-context.h"
#include "fpi-device.h"
@@ -119,6 +120,8 @@
GHashTable *printed = NULL;
+static int HACK_gen_rules = 0;
+
static void
print_driver (const FpDeviceClass *cls)
{
@@ -161,12 +164,19 @@
g_print ("\n# Known unsupported devices\n");
}
+ if (!HACK_gen_rules) {
g_print ("usb:v%04Xp%04X*\n",
entry->vid, entry->pid);
+ } else {
+ g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n",
+ entry->vid, entry->pid);
+ g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ENV{LIBFPRINT_DRIVER}=\"%s\"\n",
+ entry->vid, entry->pid, cls->full_name);
+ }
num_printed++;
}
- if (num_printed > 0)
+ if (num_printed > 0 && !HACK_gen_rules)
{
g_print (" ID_AUTOSUSPEND=1\n");
g_print (" ID_PERSIST=0\n");
@@ -190,6 +200,7 @@
guint i;
program_name = g_path_get_basename (argv[0]);
+ HACK_gen_rules = getenv ("HACK_GEN_RULES") != NULL;
g_print ("# SPDX-License-Identifier: LGPL-2.1-or-later\n");
g_print ("# This file has been generated using %s with all drivers enabled\n",