+configdpkgnoopchroot() {
+ # create a library to noop chroot() and rewrite maintainer script executions
+ # via execvp() as used by dpkg as we don't want our rootdir to be a fullblown
+ # chroot directory dpkg could chroot into to execute the maintainer scripts
+ msgtest 'Building library to preload to make maintainerscript work in' 'dpkg'
+ cat > noopchroot.c << EOF
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <limits.h>
+
+static char * chrootdir = NULL;
+
+int chroot(const char *path) {
+ printf("WARNING: CHROOTing to %s was ignored!\n", path);
+ free(chrootdir);
+ chrootdir = strdup(path);
+ return 0;
+}
+int execvp(const char *file, char *const argv[]) {
+ static int (*func_execvp) (const char *, char * const []) = NULL;
+ if (func_execvp == NULL)
+ func_execvp = (int (*) (const char *, char * const [])) dlsym(RTLD_NEXT, "execvp");
+ if (chrootdir == NULL || strncmp(file, "/var/lib/dpkg/", strlen("/var/lib/dpkg/")) != 0)
+ return func_execvp(file, argv);
+ printf("REWRITE execvp call %s into %s\n", file, chrootdir);
+ char newfile[PATH_MAX];
+ snprintf(newfile, sizeof(newfile), "%s/%s", chrootdir, file);
+ char const * const baseadmindir = "/var/lib/dpkg";
+ char admindir[PATH_MAX];
+ snprintf(admindir, sizeof(admindir), "%s/%s", chrootdir, baseadmindir);
+ setenv("DPKG_ADMINDIR", admindir, 1);
+ return func_execvp(newfile, argv);
+}
+EOF
+ testsuccess --nomsg gcc -fPIC -shared -o noopchroot.so noopchroot.c -ldl
+}
+configcompression() {
+ while [ -n "$1" ]; do
+ case "$1" in
+ '.') printf ".\t.\tcat\n";;
+ 'gz') printf "gzip\tgz\tgzip\n";;
+ 'bz2') printf "bzip2\tbz2\tbzip2\n";;
+ 'lzma') printf "lzma\tlzma\txz --format=lzma\n";;
+ 'xz') printf "xz\txz\txz\n";;
+ *) printf "$1\t$1\t$1\n";;
+ esac
+ shift
+ done > "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf"
+}
+confighashes() {
+ {
+ echo 'APT::FTPArchive {'
+ {
+ while [ -n "$1" ]; do
+ printf "$1" | tr 'a-z' 'A-Z'
+ printf "\t\"true\";\n"
+ shift
+ done
+ for h in 'MD5' 'SHA1' 'SHA256' 'SHA512'; do
+ printf "$h\t\"false\";\n"
+ done
+ } | awk '!x[$1]++'
+ echo '};'
+ } >> "${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/ftparchive-hashes.conf"
+}
+forcecompressor() {
+ COMPRESSOR="$1"
+ COMPRESSOR_CMD="$1"
+ case $COMPRESSOR in
+ gzip) COMPRESS='gz';;
+ bzip2) COMPRESS='bz2';;
+ lzma) COMPRESS='lzma';;
+ xz) COMPRESS='xz';;
+ *) msgdie "Compressor $COMPRESSOR is unknown to framework, so can't be forced by forcecompressor!";;
+ esac
+ local CONFFILE="${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/00force-compressor"
+ echo "Acquire::CompressionTypes::Order { \"${COMPRESS}\"; };
+Dir::Bin::uncompressed \"/does/not/exist\";
+Dir::Bin::gzip \"/does/not/exist\";
+Dir::Bin::bzip2 \"/does/not/exist\";
+Dir::Bin::lzma \"/does/not/exist\";
+Dir::Bin::xz \"/does/not/exist\";" > "$CONFFILE"
+ if [ -e "/bin/${COMPRESSOR}" ]; then
+ echo "Dir::Bin::${COMPRESSOR} \"/bin/${COMPRESSOR}\";" >> "$CONFFILE"
+ elif [ -e "/usr/bin/${COMPRESSOR}" ]; then
+ echo "Dir::Bin::${COMPRESSOR} \"/usr/bin/${COMPRESSOR}\";" >> "$CONFFILE"
+ elif [ "${COMPRESSOR}" = 'lzma' ]; then
+ echo 'Dir::Bin::xz "/usr/bin/xz";' >> "$CONFFILE"
+ COMPRESSOR_CMD='xz --format=lzma'
+ else
+ msgtest 'Test for availability of compressor' "${COMPRESSOR}"
+ msgfail "${COMPRESSOR} not available"
+ fi
+}
+