Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nixpkgs
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: d2c9469ef75d
Choose a base ref
...
head repository: NixOS/nixpkgs
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: fc62890f2d95
Choose a head ref
  • 1 commit
  • 2 files changed
  • 2 contributors

Commits on Oct 19, 2019

  1. execlineb: change execlineb wrapper to C script

    Instead of using execlineb to define the execlineb wrapper, we replace
    it by a little C wrapper.
    
    This is mainly done because on non-Linux systems (i.e. mainly macOS),
    it is impossible for a shebang interpreter to be itself a shebang
    script.
    It is, however, perfectly fine to have a chain that goes
    shebang -> ELF -> shebang -> ELF -> …
    
    Co-Authored-By: Laurent Bercot <ska-skaware@skarnet.org>
    Profpatsch and skarnet committed Oct 19, 2019

    Verified

    This commit was signed with the committer’s verified signature. The key has expired.
    thoughtpolice Austin Seipp
    Copy the full SHA
    fc62890 View commit details
Showing with 61 additions and 23 deletions.
  1. +18 −23 pkgs/tools/misc/execline/default.nix
  2. +43 −0 pkgs/tools/misc/execline/execlineb-wrapper.c
41 changes: 18 additions & 23 deletions pkgs/tools/misc/execline/default.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{ lib, skawarePackages
# for execlineb-with-builtins
, coreutils, gnugrep, writeScriptBin, runCommand
, coreutils, gnugrep, writeScriptBin, runCommand, runCommandCC
# Whether to wrap bin/execlineb to have the execline tools on its PATH.
, execlineb-with-builtins ? true
}:
@@ -43,29 +43,24 @@ let

};

# a wrapper around execlineb, which provides all execline
# A wrapper around execlineb, which provides all execline
# tools on `execlineb`’s PATH.
execlineb-with-builtins-drv =
let eldir = "${execline}/bin";
in writeScriptBin "execlineb" ''
#!${eldir}/execlineb -s0
# appends the execlineb bin dir to PATH if not yet in PATH
${eldir}/define eldir ${eldir}
''${eldir}/ifelse
{
# since this is nix, we can grep for the execline drv hash in PATH
# to see whether it’s already in there
''${eldir}/pipeline
{ ${coreutils}/bin/printenv PATH }
${gnugrep}/bin/grep --quiet "${eldir}"
}
# it’s there already
{ ''${eldir}/execlineb $@ }
# not there yet, add it
''${eldir}/importas oldpath PATH
''${eldir}/export PATH "''${eldir}:''${oldpath}"
''${eldir}/execlineb $@
'';
# It is implemented as a C script, because on non-Linux,
# nested shebang lines are not supported.
execlineb-with-builtins-drv = runCommandCC "execlineb" {} ''
mkdir -p $out/bin
cc \
-O \
-Wall -Wpedantic \
-D 'EXECLINEB_PATH()="${execline}/bin/execlineb"' \
-D 'EXECLINE_BIN_PATH()="${execline}/bin"' \
-I "${skalibs.dev}/include" \
-L "${skalibs.lib}/lib" \
-l"skarnet" \
-o "$out/bin/execlineb" \
${./execlineb-wrapper.c}
'';


# the original execline package, with bin/execlineb overwritten
execline-with-builtins = runCommand "my-execline"
43 changes: 43 additions & 0 deletions pkgs/tools/misc/execline/execlineb-wrapper.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include <stdlib.h>
#include <string.h>

#include <skalibs/stralloc.h>
#include <skalibs/djbunix.h>
#include <skalibs/strerr2.h>
#include <skalibs/env.h>

#define dienomem() strerr_diefu1sys(111, "stralloc_catb")

// macros from outside
/* const char* EXECLINEB_PATH; */
/* const char* EXECLINE_BIN_PATH; */

int main(int argc, char const* argv[], char const *const *envp)
{
PROG = "execlineb-wrapper";

char const* path = getenv("PATH");
stralloc path_modif = STRALLOC_ZERO;

// modify PATH if unset or EXECLINEB_BIN_PATH is not yet there
if ( !path || ! strstr(path, EXECLINE_BIN_PATH())) {
// prepend our execline path
if ( ! stralloc_cats(&path_modif, "PATH=")
|| ! stralloc_cats(&path_modif, EXECLINE_BIN_PATH()) ) dienomem();
// old path was not empty
if ( path && path[0] ) {
if ( ! stralloc_catb(&path_modif, ":", 1)
|| ! stralloc_cats(&path_modif, path) ) dienomem();
}
// append final \0
if ( ! stralloc_0(&path_modif) ) dienomem();
}

// exec into execlineb and append path_modif to the environment
xpathexec_r_name(
EXECLINEB_PATH(),
argv,
envp, env_len(envp),
path_modif.s, path_modif.len
);
}