diff options
Diffstat (limited to 'pkgs/tools/system/dell-command-configure')
-rw-r--r-- | pkgs/tools/system/dell-command-configure/default.nix | 108 | ||||
-rwxr-xr-x | pkgs/tools/system/dell-command-configure/wrapper-lib.c | 23 |
2 files changed, 131 insertions, 0 deletions
diff --git a/pkgs/tools/system/dell-command-configure/default.nix b/pkgs/tools/system/dell-command-configure/default.nix new file mode 100644 index 00000000000..2374d36421f --- /dev/null +++ b/pkgs/tools/system/dell-command-configure/default.nix @@ -0,0 +1,108 @@ +{ + stdenv, + lib, + fetchurl, + dpkg, + autoPatchelfHook, + patchelfUnstable, + openssl, +}: + +# Use techniques described in https://web.archive.org/web/20220904051329/https://tapesoftware.net/replace-symbol/ + +# Adapted from https://github.com/KenMacD/etc-nixos/blob/d3d28085586358a62b2bb4b427eb21aad05b5b23/dcc/default.nix + +# Used https://github.com/NixOS/nixpkgs/pull/84926 as a template +# then converted to use autoPatchelfHook instead, and link with +# the dependencies from other pkgs. + +let + version = "4.8.0-494"; + + unpacked = stdenv.mkDerivation rec { + inherit version; + pname = "dell-command-configure-unpacked"; + + src = fetchurl { + url = + "https://dl.dell.com/FOLDER08911312M/1/command-configure_${version}.ubuntu20_amd64.tar.gz"; + # The CDN blocks the Curl user-agent, so set to blank instead. + curlOpts = ''-A=""''; + hash = "sha256-l5oHgDkFBF6llNsHufTmuDzjkhGmXHYXlOJ4hvZfRoE="; + }; + + dontBuild = true; + + nativeBuildInputs = [ dpkg ]; + + unpackPhase = '' + tar -xzf ${src} + dpkg-deb -x command-configure_${version}.ubuntu20_amd64.deb command-configure + dpkg-deb -x srvadmin-hapi_9.5.0_amd64.deb srvadmin-hapi + ''; + + installPhase = '' + mkdir $out + cp -r . $out + ''; + }; + + # Contains a fopen() wrapper for finding the firmware package + wrapperLibName = "wrapper-lib.so"; + wrapperLib = stdenv.mkDerivation { + pname = "dell-command-configure-unpacked-wrapper-lib"; + inherit version; + + src = ./.; + + postPatch = '' + ls -al + substitute wrapper-lib.c lib.c \ + --subst-var-by to "${unpacked}/srvadmin-hapi/opt/dell/srvadmin/etc/omreg.d/omreg-hapi.cfg" + cc -fPIC -shared lib.c -o ${wrapperLibName} + ''; + installPhase = '' + install -D ${wrapperLibName} -t $out/lib + ''; + }; + +in stdenv.mkDerivation rec { + inherit version; + pname = "dell-command-configure"; + + buildInputs = [ openssl stdenv.cc.cc.lib ]; + nativeBuildInputs = [ autoPatchelfHook ]; + dontConfigure = true; + + src = unpacked; + + installPhase = '' + install -D -t $out/lib -m644 -v command-configure/opt/dell/dcc/libhapiintf.so + install -D -t $out/lib -m644 -v command-configure/opt/dell/dcc/libsmbios_c.so.2 + install -D -t $out/bin -m755 -v command-configure/opt/dell/dcc/cctk + install -D -t $out/bin -m755 -v srvadmin-hapi/opt/dell/srvadmin/sbin/dchcfg + for lib in $(find srvadmin-hapi/opt/dell/srvadmin/lib64 -type l); do + install -D -t $out/lib -m644 -v $lib + done + ''; + + postFixup = '' + echo fopen fopen_wrapper > fopen_name_map + echo access access_wrapper > access_name_map + ${patchelfUnstable}/bin/patchelf \ + --rename-dynamic-symbols fopen_name_map \ + --rename-dynamic-symbols access_name_map \ + --add-needed ${wrapperLibName} \ + --set-rpath ${lib.makeLibraryPath [ wrapperLib ]} \ + $out/lib/* + ''; + + meta = with lib; { + description = "Configure BIOS settings on Dell laptops."; + homepage = + "https://www.dell.com/support/article/us/en/19/sln311302/dell-command-configure"; + license = licenses.unfree; + maintainers = with maintainers; [ ryangibb ]; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/tools/system/dell-command-configure/wrapper-lib.c b/pkgs/tools/system/dell-command-configure/wrapper-lib.c new file mode 100755 index 00000000000..f93bcd58ab7 --- /dev/null +++ b/pkgs/tools/system/dell-command-configure/wrapper-lib.c @@ -0,0 +1,23 @@ +#include <stdio.h> +#include <string.h> + +static const char from[] = "/usr/lib/ext/dell/omreg.cfg"; +static const char to[] = "@to@"; + +int access_wrapper(const char *fn, int mode) +{ + if (!strcmp(fn, from)) { + printf("access_wrapper.c: Replacing path '%s' with '%s'\n", from, to); + fn = to; + } + return access(fn, mode); +} + +FILE* fopen_wrapper(const char* fn, const char* mode) +{ + if (!strcmp(fn, from)) { + printf("fopen_wrapper.c: Replacing path '%s' with '%s'\n", from, to); + fn = to; + } + return fopen(fn, mode); +} |