diff --git a/configure.ac b/configure.ac index 879fe97f..763ffb04 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,10 @@ AC_SUBST([YEAR_VERSION], [year_version]) AC_SUBST([RELEASE_VERSION], [release_version]) AC_SUBST([PACKAGE_VERSION], [package_version]) +dnl automake variables we want in pkg-config +pkglibexecdir=$libexecdir/$PACKAGE +AC_SUBST(pkglibexecdir) + AS_IF([echo "$CFLAGS" | grep -q -E -e '-Werror($| )'], [], [ CC_CHECK_FLAGS_APPEND([WARN_CFLAGS], [CFLAGS], [\ -pipe \ diff --git a/src/libostree/ostree-1.pc.in b/src/libostree/ostree-1.pc.in index 9a4debce..cbf0a13c 100644 --- a/src/libostree/ostree-1.pc.in +++ b/src/libostree/ostree-1.pc.in @@ -3,6 +3,7 @@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ features=@OSTREE_FEATURES@ +cliextdir=@pkglibexecdir@/ext Name: OSTree Description: Git for operating system binaries diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c index b72fa9d4..7a4c4707 100644 --- a/src/ostree/ot-main.c +++ b/src/ostree/ot-main.c @@ -41,6 +41,10 @@ static gboolean opt_verbose; static gboolean opt_version; static gboolean opt_print_current_dir; +// TODO: make this public? But no one sane wants to use our C headers +// to find where to put files. Maybe we can make it printed by the CLI? +#define _OSTREE_EXT_DIR PKGLIBEXECDIR "/ext" + static GOptionEntry global_entries[] = { { "verbose", 'v', 0, G_OPTION_ARG_NONE, &opt_verbose, "Print debug information during command processing", NULL }, { "version", 0, 0, G_OPTION_ARG_NONE, &opt_version, "Print version information and exit", NULL }, @@ -188,7 +192,7 @@ ostree_command_lookup_external (int argc, // Find the first verb (ignoring all earlier flags), then // check if it is a known native command. Otherwise, try to look it - // up in $PATH. + // up in /usr/lib/ostree/ostree-$cmd or $PATH. // We ignore argv[0] here, the ostree binary itself is not multicall. for (guint arg_index = 1; arg_index < argc; arg_index++) { @@ -204,10 +208,18 @@ ostree_command_lookup_external (int argc, return NULL; } + g_autofree gchar *ext_command = g_strdup_printf ("ostree-%s", current_arg); + + /* First, search in our libdir /usr/lib/ostree/ostree-$cmd */ + g_autofree char *ext_lib = g_strconcat (_OSTREE_EXT_DIR, "/", ext_command, NULL); + struct stat stbuf; + if (stat (ext_lib, &stbuf) == 0) + return g_steal_pointer (&ext_lib); + + /* Otherwise, look in $PATH */ if (g_find_program_in_path (ext_command) == NULL) return NULL; - return g_steal_pointer (&ext_command); } diff --git a/tests/kolainst/destructive/basic-misc.sh b/tests/kolainst/destructive/basic-misc.sh new file mode 100644 index 00000000..6d14cc04 --- /dev/null +++ b/tests/kolainst/destructive/basic-misc.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Random misc tests + +set -xeuo pipefail + +. ${KOLA_EXT_DATA}/libinsttest.sh + +echo "1..1" +date + +# Test CLI extensions installed alongside the system +extdir=/usr/libexec/libostree/ext/ +mkdir -p "${extdir}" +ln -sr /usr/bin/env ${extdir}/ostree-env + +env TESTENV=foo ostree env > out.txt +assert_file_has_content out.text TESTENV=foo +rm -vf "${extdir}/ostree-env" +echo "ok env" + +# End test +date diff --git a/tests/test-cli-extensions.sh b/tests/test-cli-extensions.sh index 1fe9c037..e1916036 100755 --- a/tests/test-cli-extensions.sh +++ b/tests/test-cli-extensions.sh @@ -9,6 +9,9 @@ set -euo pipefail echo '1..2' +# Test CLI extensions via $PATH. If you change this, you may +# also want to change the corresponding destructive version in +# tests/kolainst/destructive/basic-misc.sh mkdir -p ./localbin ORIG_PATH="${PATH}" export PATH="./localbin/:${PATH}"