+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 << EOF > noopchroot.c
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.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[strlen(chrootdir) + strlen(file)];
+ strcpy(newfile, chrootdir);
+ strcat(newfile, file);
+ char const * const baseadmindir = "/var/lib/dpkg";
+ char admindir[strlen(chrootdir) + strlen(baseadmindir)];
+ strcpy(admindir, chrootdir);
+ strcat(admindir, baseadmindir);
+ setenv("DPKG_ADMINDIR", admindir, 1);
+ return func_execvp(newfile, argv);
+}
+EOF
+ testsuccess --nomsg gcc -fPIC -shared -o noopchroot.so noopchroot.c -ldl
+}
+