From 02418009d9465790a9498a4e08b1de2b46a01d66 Mon Sep 17 00:00:00 2001 From: Daniel Berendeev Date: Sat, 6 Dec 2025 19:53:47 +0000 Subject: [PATCH 1/2] maintainer-list: add myself Add myself as a new maintainer due to introducing a new package. --- maintainers/maintainer-list.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index c26aac757ae09..55540ac75c24a 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -5736,6 +5736,13 @@ matrix = "@Dan:matrix.org"; name = "Daniel Theriault"; }; + danberdev = { + email = "me@danber.dev"; + github = "danberdev"; + githubId = 13893528; + name = "Daniil Berendeev"; + keys = [ { fingerprint = "60D7 0EE0 3BD4 A415 B255 1938 6556 0668 006B 4906"; } ]; + }; danbst = { email = "abcz2.uprola@gmail.com"; github = "danbst"; From 9ad97e2943f6189af31c0408923fdc9444248c43 Mon Sep 17 00:00:00 2001 From: Daniel Berendeev Date: Sat, 6 Dec 2025 20:22:26 +0000 Subject: [PATCH 2/2] hp-unified-linux-driver: init at 1.00.39.12_00.15 There are some HP printers that are actually Samsung printers in disguise (because HP bought Samsung printer division). These printers are not supported by HPLIP. To use them, one must obtain a special driver: hp-uld (unified linux driver), which is a modified samsung driver. This driver introduces support for - HP Color Laser 15x Series - HP Color Laser MFP 17x Series - HP Laser 10x Series - HP Laser MFP 13x Series Where x stands for various model numbers from the lineup. This derivation does some ugly library patching, because the scanner library needs some hardcoded paths. In inspiration from similar packages in the collection, the patch was written. The driver uses libxml2.so.2, which is provided by an older libxml2 version. --- .../libsane-smfp-wrapper.c | 51 ++++++ .../hp/hp-unified-linux-driver/package.nix | 151 ++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 pkgs/by-name/hp/hp-unified-linux-driver/libsane-smfp-wrapper.c create mode 100644 pkgs/by-name/hp/hp-unified-linux-driver/package.nix diff --git a/pkgs/by-name/hp/hp-unified-linux-driver/libsane-smfp-wrapper.c b/pkgs/by-name/hp/hp-unified-linux-driver/libsane-smfp-wrapper.c new file mode 100644 index 0000000000000..fe998d309c9b5 --- /dev/null +++ b/pkgs/by-name/hp/hp-unified-linux-driver/libsane-smfp-wrapper.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +static const char libsane_smfp_cfg[] = "/opt/smfp-common/scanner/share/libsane-smfp.cfg"; +static const char libsane_smfp_cfg_to[] = "@libsane_smfp_cfg_to@"; + +static const char smfp_conf[] = "/etc/sane.d/smfp.conf"; +static const char smfp_conf_to[] = "@smfp_conf_to@"; + +static const char usedby[] = "/opt/smfp-common/scanner/.usedby/"; +static const char usedby_to[] = "@usedby_to@"; + +static const char oem[] = "/opt/smfp-common/scanner/share/oem.conf"; +static const char oem_to[] = "@oem_to@"; + +static const char sane_d[] = "/etc/sane.d"; +static const char sane_d_to[] = "@sane_d_to@"; + +static const char opt[] = "/opt"; +static const char opt_to[] = "@opt_to@"; + + +const char* pick_path(const char* path) +{ + if (!strcmp(path, libsane_smfp_cfg)) { + return libsane_smfp_cfg_to; + } else if (!strcmp(path, smfp_conf)) { + return smfp_conf_to; + } else if (!strcmp(path, usedby)) { + return usedby_to; + } else if (!strcmp(path, oem)) { + return oem_to; + } if (!strcmp(path, sane_d)) { + return sane_d_to; + } if (!strcmp(path, opt)) { + return opt_to; + } + return path; +} + +FILE *fopen_wrapper(const char* file_name, const char* mode) +{ + return fopen(pick_path(file_name), mode); +} + +DIR *opendir_wrapper(const char* dirname) +{ + return opendir(pick_path(dirname)); +} diff --git a/pkgs/by-name/hp/hp-unified-linux-driver/package.nix b/pkgs/by-name/hp/hp-unified-linux-driver/package.nix new file mode 100644 index 0000000000000..be09e097882bf --- /dev/null +++ b/pkgs/by-name/hp/hp-unified-linux-driver/package.nix @@ -0,0 +1,151 @@ +{ + lib, + stdenv, + cups, + libusb1, + libxml2_13, # The uld library uses libxml2.so.2 which is provided only in the older version + fetchurl, + patchPpdFilesHook, + buildPackages, + replaceVars, +}: + +let + version = "1.00.39.12_00.15"; + installationPath = + { + x86_64-linux = "x86_64"; + i686-linux = "i386"; + } + .${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); + + unpacked = stdenv.mkDerivation (finalAttrs: { + inherit version; + pname = "hp-unified-linux-driver-unpacked"; + + src = fetchurl { + url = "https://ftp.hp.com/pub/softlib/software13/printers/MFP170/uld-hp_V${version}.tar.gz"; + hash = "sha256-zrube2El50BmNLucKpiwFHfR4R1mx8kEdGad6ZJ7yR0="; + }; + dontBuild = true; + + installPhase = '' + mkdir -p $out/opt/smfp-common/scanner/.usedby/ + cp -r . $out + ''; + }); + + patchedWrapper = replaceVars ./libsane-smfp-wrapper.c { + libsane_smfp_cfg_to = "${unpacked}/noarch/libsane-smfp.cfg"; + smfp_conf_to = "${unpacked}/noarch/etc/smfp.conf"; + usedby_to = "${unpacked}/opt/smfp-common/scanner/.usedby/"; + oem_to = "${unpacked}/noarch/oem.conf"; + sane_d_to = "${unpacked}/etc/sane.d"; + opt_to = "${unpacked}/opt"; + }; + + # Contains a fopen() wrapper + wrapperLibName = "libsane-smfp-wrapper.so"; + wrapperLib = stdenv.mkDerivation (finalAttrs: { + pname = "libsane-smfp-wrapper-lib"; + inherit version; + + unpackPhase = '' + cp ${patchedWrapper} libsane-smfp-wrapper.c + ''; + + buildPhase = '' + $CC -fPIC -shared libsane-smfp-wrapper.c -o ${wrapperLibName} + ''; + + installPhase = '' + install -D ${wrapperLibName} -t $out/lib + ''; + }); + + libPath = + lib.makeLibraryPath [ + cups + libusb1 + libxml2_13 + wrapperLib + ] + + ":$out/lib:${lib.getLib stdenv.cc.cc}/lib"; +in +stdenv.mkDerivation { + inherit version; + + pname = "hp-unified-linux-driver"; + src = unpacked; + + nativeBuildInputs = [ patchPpdFilesHook ]; + + dontPatchELF = true; + dontStrip = true; + + installPhase = '' + runHook preInstall + + mkdir -p $out/opt/smfp-common/scanner/.usedby/ + mkdir -p $out/share/cups + mkdir -p $out/etc/sane.d/dll.d + mkdir -p $out/lib/udev/rules.d + + install -m755 ${installationPath}/{pstosecps,rastertospl,smfpnetdiscovery} -D -t $out/lib/cups/filter/ + install -m755 ${installationPath}/libscmssc.so -D -t $out/lib/ + install -m755 ${installationPath}/libsane-smfp.so.1.0.1 -D -t $out/lib/sane/ + install -m644 noarch/etc/smfp.conf -D -t $out/etc/sane.d/ + cp -r noarch/share/ppd $out/share/ + + echo "smfp" >> $out/etc/sane.d/dll.d/hp-uld.conf + + ln -s $out/share/ppd $out/share/cups/model + ln -sf $out/lib/sane/libsane-smfp.so.1.0.1 $out/lib/sane/libsane-smfp.so.1 + ln -sf $out/lib/sane/libsane-smfp.so.1 $out/lib/sane/libsane-smfp.so + + ( + OEM_FILE=noarch/oem.conf + INSTALL_LOG_FILE=/dev/null + . noarch/scripting_utils + . noarch/package_utils + . noarch/scanner-script.pkg + fill_full_template noarch/etc/smfp.rules.in $out/lib/udev/rules.d/60_smfp_hp.rules + chmod -x $out/lib/udev/rules.d/60_smfp_hp.rules + ) + + runHook postInstall + ''; + + postFixup = '' + patchelf --set-rpath ${libPath} --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \ + $out/lib/cups/filter/{pstosecps,rastertospl,smfpnetdiscovery} + + echo fopen fopen_wrapper >> name_map + echo opendir opendir_wrapper >> name_map + ${buildPackages.patchelfUnstable}/bin/patchelf \ + --rename-dynamic-symbols name_map \ + --add-needed ${wrapperLibName} \ + --set-rpath ${libPath} \ + $out/lib/sane/libsane-smfp.so.1.0.1 + + patchelf --set-rpath ${libPath} $out/lib/libscmssc.so + ''; + + ppdFileCommands = [ + "pstosecps" + "rastertospl" + "smfpnetdiscovery" + ]; + + meta = { + description = "Drivers for HP printers that are actually Samsung printers"; + homepage = "http://www.hp.com/"; + sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; + license = lib.licenses.unfree; + platforms = [ + "x86_64-linux" + "i686-linux" + ]; + maintainers = with lib.maintainers; [ danberdev ]; + }; +}