Merge pull request #326272 from pitkling/libfprint-2-tod1-broadcom

libfprint-2-tod1-broadcom: init at 5.12.018

authored by Florian and committed by GitHub bb820857 8fe1db00

+119
+5
maintainers/maintainer-list.nix
··· 16033 githubId = 1830959; 16034 name = "Piper McCorkle"; 16035 }; 16036 piturnah = { 16037 email = "peterhebden6@gmail.com"; 16038 github = "Piturnah";
··· 16033 githubId = 1830959; 16034 name = "Piper McCorkle"; 16035 }; 16036 + pitkling = { 16037 + github = "pitkling"; 16038 + githubId = 1018801; 16039 + name = "Peter Kling"; 16040 + }; 16041 piturnah = { 16042 email = "peterhebden6@gmail.com"; 16043 github = "Piturnah";
+91
pkgs/by-name/li/libfprint-2-tod1-broadcom/package.nix
···
··· 1 + { 2 + autoPatchelfHook, 3 + fetchzip, 4 + lib, 5 + libfprint-tod, 6 + openssl, 7 + patchelfUnstable, # have to use patchelfUnstable to support --rename-dynamic-symbols 8 + stdenv, 9 + }: 10 + 11 + # Based on ideas from (using a wrapper library to redirect fopen() calls to firmware files): 12 + # * https://tapesoftware.net/replace-symbol/ 13 + # * https://github.com/NixOS/nixpkgs/pull/260715 14 + let 15 + pname = "libfprint-2-tod1-broadcom"; 16 + version = "5.12.018"; 17 + 18 + src = fetchzip { 19 + url = "http://dell.archive.canonical.com/updates/pool/public/libf/${pname}/${pname}_${version}.orig.tar.gz"; 20 + hash = "sha256-0C2PpYpEJNrU+8NT95w4QV0J5nHQisMY94Czw3jQOzw="; 21 + pname = "${pname}-unpacked"; 22 + inherit version; 23 + }; 24 + 25 + wrapperLibName = "wrapper-lib.so"; 26 + wrapperLibSource = "wrapper-lib.c"; 27 + 28 + # wraps `fopen()` for finding firmware files 29 + wrapperLib = stdenv.mkDerivation { 30 + pname = "${pname}-wrapper-lib"; 31 + inherit version; 32 + 33 + src = builtins.path { 34 + name = "${pname}-wrapper-lib-source"; 35 + path = ./.; 36 + filter = path: type: baseNameOf path == wrapperLibSource; 37 + }; 38 + 39 + postPatch = '' 40 + substitute ${wrapperLibSource} lib.c \ 41 + --subst-var-by to "${src}/var/lib/fprint/fw" 42 + cc -fPIC -shared lib.c -o ${wrapperLibName} 43 + ''; 44 + 45 + installPhase = '' 46 + runHook preInstall 47 + install -D -t $out/lib ${wrapperLibName} 48 + runHook postInstall 49 + ''; 50 + }; 51 + in 52 + stdenv.mkDerivation { 53 + inherit src pname version; 54 + 55 + buildInputs = [ 56 + libfprint-tod 57 + openssl 58 + wrapperLib 59 + ]; 60 + 61 + nativeBuildInputs = [ 62 + autoPatchelfHook 63 + patchelfUnstable 64 + ]; 65 + 66 + installPhase = '' 67 + runHook preInstall 68 + 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 69 + install -D -t "$out/lib/udev/rules.d/" -m 644 -v lib/udev/rules.d/60-libfprint-2-device-broadcom.rules 70 + runHook postInstall 71 + ''; 72 + 73 + postFixup = '' 74 + echo fopen64 fopen_wrapper > fopen_name_map 75 + patchelf \ 76 + --rename-dynamic-symbols fopen_name_map \ 77 + --add-needed ${wrapperLibName} \ 78 + "$out/lib/libfprint-2/tod-1/libfprint-2-tod-1-broadcom.so" 79 + ''; 80 + 81 + passthru.driverPath = "/lib/libfprint-2/tod-1"; 82 + 83 + meta = with lib; { 84 + description = "Broadcom driver module for libfprint-2-tod Touch OEM Driver (from Dell)"; 85 + homepage = "http://dell.archive.canonical.com/updates/pool/public/libf/libfprint-2-tod1-broadcom/"; 86 + license = licenses.unfree; 87 + maintainers = with maintainers; [ pitkling ]; 88 + platforms = [ "x86_64-linux" ]; 89 + sourceProvenance = with sourceTypes; [ binaryNativeCode ]; 90 + }; 91 + }
+23
pkgs/by-name/li/libfprint-2-tod1-broadcom/wrapper-lib.c
···
··· 1 + #include <stdio.h> 2 + #include <stdlib.h> 3 + #include <string.h> 4 + 5 + static const char from[] = "/var/lib/fprint/fw"; 6 + static const char to[] = "@to@"; 7 + 8 + FILE* fopen_wrapper(const char* fn, const char* mode) { 9 + size_t fn_len = strlen(fn); 10 + size_t from_len = strlen(from); 11 + if (fn_len > from_len && memcmp(fn, from, from_len) == 0) { 12 + size_t to_len = strlen(to); 13 + char* rewritten = calloc(fn_len + (to_len - from_len) + 1, 1); 14 + memcpy(rewritten, to, to_len); 15 + memcpy(rewritten + to_len, fn + from_len, fn_len - from_len); 16 + 17 + printf("fopen_wrapper.c: Replacing path '%s' with '%s'\n", fn, rewritten); 18 + FILE* result = fopen(rewritten, mode); 19 + free(rewritten); 20 + return result; 21 + } 22 + return fopen(fn, mode); 23 + }