From 994cf812fc642d3e0a31eb39a78e152844ca2e1e Mon Sep 17 00:00:00 2001 From: Peter Kling Date: Sun, 14 Jul 2024 20:15:37 +0200 Subject: [PATCH 1/4] maintainers: add pitkling --- maintainers/maintainer-list.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index ec92f8cba451..3dfe66345892 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -15887,6 +15887,11 @@ githubId = 1830959; name = "Piper McCorkle"; }; + pitkling = { + github = "pitkling"; + githubId = 1018801; + name = "Peter Kling"; + }; piturnah = { email = "peterhebden6@gmail.com"; github = "Piturnah"; From 25e042c3d418bf36ea7f662bc3947bb082566fb8 Mon Sep 17 00:00:00 2001 From: Peter Kling Date: Tue, 9 Jul 2024 21:39:22 +0200 Subject: [PATCH 2/4] libfprint-2-tod1-broadcom: init at 5.12.018 --- .../li/libfprint-2-tod1-broadcom/package.nix | 85 +++++++++++++++++++ .../libfprint-2-tod1-broadcom/wrapper-lib.c | 23 +++++ 2 files changed, 108 insertions(+) create mode 100644 pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix create mode 100644 pkgs/by-name/li/libfprint-2-tod1-broadcom/wrapper-lib.c diff --git a/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix b/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix new file mode 100644 index 000000000000..0a9da8a0cb1a --- /dev/null +++ b/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix @@ -0,0 +1,85 @@ +{ + autoPatchelfHook, + fetchzip, + lib, + libfprint-tod, + openssl, + patchelfUnstable, # have to use patchelfUnstable to support --rename-dynamic-symbols + stdenv, +}: + +# Based on ideas from (using a wrapper library to redirect fopen() calls to firmware files): +# * https://tapesoftware.net/replace-symbol/ +# * https://github.com/NixOS/nixpkgs/pull/260715 +let + pname = "libfprint-2-tod1-broadcom"; + version = "5.12.018"; + + src = fetchzip { + url = "http://dell.archive.canonical.com/updates/pool/public/libf/${pname}/${pname}_${version}.orig.tar.gz"; + hash = "sha256-0C2PpYpEJNrU+8NT95w4QV0J5nHQisMY94Czw3jQOzw="; + pname = "${pname}-unpacked"; + inherit version; + }; + + # wraps `fopen()` for finding firmware files + wrapperLibName = "wrapper-lib.so"; + wrapperLib = stdenv.mkDerivation { + pname = "${pname}-wrapper-lib"; + inherit version; + + src = ./.; + + postPatch = '' + substitute wrapper-lib.c lib.c \ + --subst-var-by to "${src}/var/lib/fprint/fw" + cc -fPIC -shared lib.c -o ${wrapperLibName} + ''; + + installPhase = '' + runHook preInstall + install -D -t $out/lib ${wrapperLibName} + runHook postInstall + ''; + }; +in +stdenv.mkDerivation { + inherit src pname version; + + buildInputs = [ + libfprint-tod + openssl + wrapperLib + ]; + + nativeBuildInputs = [ + autoPatchelfHook + patchelfUnstable + ]; + + installPhase = '' + runHook preInstall + install -D -t "$out/lib/libfprint-2/tod-1/" -m 644 -v usr/lib/x86_64-linux-gnu/libfprint-2/tod-1/libfprint-2-tod-1-broadcom.so + install -D -t "$out/lib/udev/rules.d/" -m 644 -v lib/udev/rules.d/60-libfprint-2-device-broadcom.rules + runHook postInstall + ''; + + postFixup = '' + echo fopen64 fopen_wrapper > fopen_name_map + patchelf \ + --rename-dynamic-symbols fopen_name_map \ + --add-needed ${wrapperLibName} \ + "$out/lib/libfprint-2/tod-1/libfprint-2-tod-1-broadcom.so" + ''; + + passthru.driverPath = "/lib/libfprint-2/tod-1"; + + meta = with lib; { + description = "Broadcom driver module for libfprint-2-tod Touch OEM Driver (from Dell)"; + homepage = "http://dell.archive.canonical.com/updates/pool/public/libf/libfprint-2-tod1-broadcom/"; + license = licenses.unfree; + maintainers = with maintainers; [ pitkling ]; + platforms = [ "x86_64-linux" ]; + sourceProvenance = with sourceTypes; [ binaryNativeCode ]; + }; +} diff --git a/pkgs/by-name/li/libfprint-2-tod1-broadcom/wrapper-lib.c b/pkgs/by-name/li/libfprint-2-tod1-broadcom/wrapper-lib.c new file mode 100644 index 000000000000..c6909ae55a52 --- /dev/null +++ b/pkgs/by-name/li/libfprint-2-tod1-broadcom/wrapper-lib.c @@ -0,0 +1,23 @@ +#include +#include +#include + +static const char from[] = "/var/lib/fprint/fw"; +static const char to[] = "@to@"; + +FILE* fopen_wrapper(const char* fn, const char* mode) { + size_t fn_len = strlen(fn); + size_t from_len = strlen(from); + if (fn_len > from_len && memcmp(fn, from, from_len) == 0) { + size_t to_len = strlen(to); + char* rewritten = calloc(fn_len + (to_len - from_len) + 1, 1); + memcpy(rewritten, to, to_len); + memcpy(rewritten + to_len, fn + from_len, fn_len - from_len); + + printf("fopen_wrapper.c: Replacing path '%s' with '%s'\n", fn, rewritten); + FILE* result = fopen(rewritten, mode); + free(rewritten); + return result; + } + return fopen(fn, mode); +} From 3399a775842df763632593a374937039cf4e004a Mon Sep 17 00:00:00 2001 From: Peter Kling Date: Thu, 1 Aug 2024 14:36:31 +0200 Subject: [PATCH 3/4] avoid unnecessary files in wrapper-lib's source directory in the nix store --- .../by-name/li/libfprint-2-tod1-broadcom/package.nix | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix b/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix index 0a9da8a0cb1a..449f7aba3702 100644 --- a/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix +++ b/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix @@ -22,16 +22,22 @@ let inherit version; }; - # wraps `fopen()` for finding firmware files wrapperLibName = "wrapper-lib.so"; + wrapperLibSource = "wrapper-lib.c"; + + # wraps `fopen()` for finding firmware files wrapperLib = stdenv.mkDerivation { pname = "${pname}-wrapper-lib"; inherit version; - src = ./.; + src = builtins.path { + name = "${pname}-source"; + path = ./.; + filter = (path: type: baseNameOf path == wrapperLibSource); + }; postPatch = '' - substitute wrapper-lib.c lib.c \ + substitute ${wrapperLibSource} lib.c \ --subst-var-by to "${src}/var/lib/fprint/fw" cc -fPIC -shared lib.c -o ${wrapperLibName} ''; From e6e55fbe78f041f716c869d3a10be68af9cabef2 Mon Sep 17 00:00:00 2001 From: Peter Kling Date: Thu, 1 Aug 2024 16:02:42 +0200 Subject: [PATCH 4/4] better names for involved nix store paths --- pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix b/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix index 449f7aba3702..842f803c0af0 100644 --- a/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix +++ b/pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix @@ -31,9 +31,9 @@ let inherit version; src = builtins.path { - name = "${pname}-source"; + name = "${pname}-wrapper-lib-source"; path = ./.; - filter = (path: type: baseNameOf path == wrapperLibSource); + filter = path: type: baseNameOf path == wrapperLibSource; }; postPatch = ''