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"; 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 ]; + }; +}