aboutsummaryrefslogtreecommitdiff
path: root/infra/libkookie/nixpkgs/pkgs/tools/misc/execline
diff options
context:
space:
mode:
authorMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
committerMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
commitc4625b175f8200f643fd6e11010932ea44c78433 (patch)
treebce3f89888c8ac3991fa5569a878a9eab6801ccc /infra/libkookie/nixpkgs/pkgs/tools/misc/execline
parent49f735974dd103039ddc4cb576bb76555164a9e7 (diff)
parentd661aa56a8843e991261510c1bb28fdc2f6975ae (diff)
Add 'infra/libkookie/' from commit 'd661aa56a8843e991261510c1bb28fdc2f6975ae'
git-subtree-dir: infra/libkookie git-subtree-mainline: 49f735974dd103039ddc4cb576bb76555164a9e7 git-subtree-split: d661aa56a8843e991261510c1bb28fdc2f6975ae
Diffstat (limited to 'infra/libkookie/nixpkgs/pkgs/tools/misc/execline')
-rw-r--r--infra/libkookie/nixpkgs/pkgs/tools/misc/execline/default.nix55
-rw-r--r--infra/libkookie/nixpkgs/pkgs/tools/misc/execline/execlineb-wrapper.c50
2 files changed, 105 insertions, 0 deletions
diff --git a/infra/libkookie/nixpkgs/pkgs/tools/misc/execline/default.nix b/infra/libkookie/nixpkgs/pkgs/tools/misc/execline/default.nix
new file mode 100644
index 000000000000..ecedd2b0b417
--- /dev/null
+++ b/infra/libkookie/nixpkgs/pkgs/tools/misc/execline/default.nix
@@ -0,0 +1,55 @@
+{ lib, skawarePackages
+# for execlineb-with-builtins
+, coreutils, gnugrep, writeScriptBin, runCommand, runCommandCC
+}:
+
+with skawarePackages;
+
+buildPackage {
+ pname = "execline";
+ version = "2.6.1.0";
+ sha256 = "0mj565xml3hvw27finydms0s9abbbpgbr29vnr8gwi7zjzq7ck52";
+
+ description = "A small scripting language, to be used in place of a shell in non-interactive scripts";
+
+ outputs = [ "bin" "lib" "dev" "doc" "out" ];
+
+ # TODO: nsss support
+ configureFlags = [
+ "--libdir=\${lib}/lib"
+ "--dynlibdir=\${lib}/lib"
+ "--bindir=\${bin}/bin"
+ "--includedir=\${dev}/include"
+ "--with-sysdeps=${skalibs.lib}/lib/skalibs/sysdeps"
+ "--with-include=${skalibs.dev}/include"
+ "--with-lib=${skalibs.lib}/lib"
+ "--with-dynlib=${skalibs.lib}/lib"
+ ];
+
+ postInstall = ''
+ # remove all execline executables from build directory
+ rm $(find -type f -mindepth 1 -maxdepth 1 -executable)
+ rm libexecline.*
+
+ mv doc $doc/share/doc/execline/html
+ mv examples $doc/share/doc/execline/examples
+
+ mv $bin/bin/execlineb $bin/bin/.execlineb-wrapped
+
+ # A wrapper around execlineb, which provides all execline
+ # tools on `execlineb`’s PATH.
+ # It is implemented as a C script, because on non-Linux,
+ # nested shebang lines are not supported.
+ # The -lskarnet has to come at the end to support static builds.
+ $CC \
+ -O \
+ -Wall -Wpedantic \
+ -D "EXECLINEB_PATH()=\"$bin/bin/.execlineb-wrapped\"" \
+ -D "EXECLINE_BIN_PATH()=\"$bin/bin\"" \
+ -I "${skalibs.dev}/include" \
+ -L "${skalibs.lib}/lib" \
+ -o "$bin/bin/execlineb" \
+ ${./execlineb-wrapper.c} \
+ -lskarnet
+ '';
+}
diff --git a/infra/libkookie/nixpkgs/pkgs/tools/misc/execline/execlineb-wrapper.c b/infra/libkookie/nixpkgs/pkgs/tools/misc/execline/execlineb-wrapper.c
new file mode 100644
index 000000000000..d31a76ca26eb
--- /dev/null
+++ b/infra/libkookie/nixpkgs/pkgs/tools/misc/execline/execlineb-wrapper.c
@@ -0,0 +1,50 @@
+/*
+ * A wrapper around execlineb, which provides all execline
+ * tools on execlineb’s PATH.
+ * It is implemented as a C program, because on non-Linux,
+ * nested shebang lines are not supported.
+ */
+
+#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
+ );
+}