diff options
Diffstat (limited to 'fakechroot-2.9-cmdsubst.patch')
-rw-r--r-- | fakechroot-2.9-cmdsubst.patch | 262 |
1 files changed, 0 insertions, 262 deletions
diff --git a/fakechroot-2.9-cmdsubst.patch b/fakechroot-2.9-cmdsubst.patch deleted file mode 100644 index 0d40cd7..0000000 --- a/fakechroot-2.9-cmdsubst.patch +++ /dev/null @@ -1,262 +0,0 @@ -Index: test/cmd-subst-pwd.sh -=================================================================== ---- test/cmd-subst-pwd.sh (revision 0) -+++ test/cmd-subst-pwd.sh (revision 0) -@@ -0,0 +1,3 @@ -+#!/bin/sh -+ -+echo substituted - -Property changes on: test/cmd-subst-pwd.sh -___________________________________________________________________ -Added: svn:executable - + * - -Index: test/cmd-subst.t -=================================================================== ---- test/cmd-subst.t (revision 0) -+++ test/cmd-subst.t (revision 0) -@@ -0,0 +1,37 @@ -+#!/bin/sh -+ -+. ./tap.sh -+ -+plan 5 -+ -+rm -rf testtree -+ -+./testtree.sh testtree -+test "`cat testtree/CHROOT`" = "testtree" || not -+ok "testtree" -+ -+t=`./fakechroot.sh testtree /bin/pwd` -+test "$t" = "/" || not -+ok "fakechroot pwd is /" -+ -+export FAKECHROOT_CMD_SUBST="/bin/pwd=$(pwd)/cmd-subst-pwd.sh" -+ -+t=`./fakechroot.sh testtree /bin/pwd` -+test "$t" = "substituted" || not -+ok "fakechroot substituted pwd (1)" -+ -+export FAKECHROOT_CMD_SUBST="/no/file=foo:/bin/pwd=$(pwd)/cmd-subst-pwd.sh" -+ -+t=`./fakechroot.sh testtree /bin/pwd` -+test "$t" = "substituted" || not -+ok "fakechroot substituted pwd (2)" -+ -+export FAKECHROOT_CMD_SUBST="/no/file=foo:/other/file=bar" -+ -+t=`./fakechroot.sh testtree /bin/pwd` -+test "$t" = "/" || not -+ok "fakechroot not substituted pwd is /" -+ -+rm -rf testtree -+ -+end - -Property changes on: test/cmd-subst.t -___________________________________________________________________ -Added: svn:executable - + * - -Index: test/Makefile.am -=================================================================== ---- test/Makefile.am (revision 323) -+++ test/Makefile.am (working copy) -@@ -1,6 +1,6 @@ - SUBDIRS = src - --TESTS = chroot.t escape-nested-chroot.t pwd.t touch.t -+TESTS = chroot.t cmd-subst.t escape-nested-chroot.t pwd.t touch.t - - suffix = - -Index: src/libfakechroot.c -=================================================================== ---- src/libfakechroot.c (revision 323) -+++ src/libfakechroot.c (working copy) -@@ -1467,7 +1467,38 @@ - return execve (path, argv, environ); - } - -+/* Parse the FAKECHROOT_CMD_SUBST environment variable (the first -+ * parameter) and if there is a match with filename, return the -+ * substitution in cmd_subst. Returns non-zero if there was a match. -+ * -+ * FAKECHROOT_CMD_SUBST=cmd=subst:cmd=subst:... -+ */ -+static int -+try_cmd_subst (char *env, const char *filename, char *cmd_subst) -+{ -+ int len = strlen (filename), len2; -+ char *p; - -+ if (env == NULL) return 0; -+ -+ do { -+ p = strchrnul (env, ':'); -+ -+ if (strncmp (env, filename, len) == 0 && env[len] == '=') { -+ len2 = p - &env[len+1]; -+ if (len2 >= FAKECHROOT_MAXPATH) -+ len2 = FAKECHROOT_MAXPATH - 1; -+ strncpy (cmd_subst, &env[len+1], len2); -+ cmd_subst[len2] = '\0'; -+ return 1; -+ } -+ -+ env = p; -+ } while (*env++ != '\0'); -+ -+ return 0; -+} -+ - /* #include <unistd.h> */ - int execve (const char *filename, char *const argv [], char *const envp[]) - { -@@ -1479,32 +1510,16 @@ - char *env; - char tmp[FAKECHROOT_MAXPATH], newfilename[FAKECHROOT_MAXPATH], argv0[FAKECHROOT_MAXPATH]; - char *ptr; -- unsigned int i, j, n, len; -+ unsigned int i, j, n, len, r, newenvppos; - size_t sizeenvp; - char c; - char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; - char *envkey[] = { "FAKECHROOT", "FAKECHROOT_BASE", - "FAKECHROOT_VERSION", "FAKECHROOT_EXCLUDE_PATH", -+ "FAKECHROOT_CMD_SUBST", - "LD_LIBRARY_PATH", "LD_PRELOAD" }; -+ const int nr_envkey = sizeof envkey / sizeof envkey[0]; - -- strncpy(argv0, filename, FAKECHROOT_MAXPATH); -- -- expand_chroot_path(filename, fakechroot_path, fakechroot_ptr, fakechroot_buf); -- strcpy(tmp, filename); -- filename = tmp; -- -- if ((file = open(filename, O_RDONLY)) == -1) { -- errno = ENOENT; -- return -1; -- } -- -- i = read(file, hashbang, FAKECHROOT_MAXPATH-2); -- close(file); -- if (i == -1) { -- errno = ENOENT; -- return -1; -- } -- - if (next_execve == NULL) fakechroot_init(); - - /* Scan envp and check its size */ -@@ -1514,39 +1529,69 @@ - } - - /* Copy envp to newenvp */ -- newenvp = malloc( sizeenvp * sizeof (char *) + sizeof(envkey) ); -+ newenvp = malloc( (sizeenvp + 1) * sizeof (char *) ); - if (newenvp == NULL) { - errno = ENOMEM; - return -1; - } -- for (ep = envp, i = 0; *ep != NULL; ++ep) { -- for (j = 0; j < sizeof (envkey) / sizeof (char *); j++) { -+ for (ep = envp, newenvppos = 0; *ep != NULL; ++ep) { -+ for (j = 0; j < nr_envkey; j++) { - len = strlen (envkey[j]); - if (strncmp (*ep, envkey[j], len) == 0 && (*ep)[len] == '=') - goto skip; - } -- newenvp[i] = *ep; -- i++; -+ newenvp[newenvppos] = *ep; -+ newenvppos++; - skip: ; - } -+ newenvp[newenvppos] = NULL; - -+ strncpy(argv0, filename, FAKECHROOT_MAXPATH); -+ -+ r = try_cmd_subst (getenv ("FAKECHROOT_CMD_SUBST"), filename, tmp); -+ if (r) { -+ filename = tmp; -+ -+ /* FAKECHROOT_CMD_SUBST escapes the chroot. newenvp here does -+ * not contain LD_PRELOAD and the other special environment -+ * variables. -+ */ -+ return next_execve(filename, argv, newenvp); -+ } -+ -+ expand_chroot_path(filename, fakechroot_path, fakechroot_ptr, fakechroot_buf); -+ strcpy(tmp, filename); -+ filename = tmp; -+ -+ if ((file = open(filename, O_RDONLY)) == -1) { -+ errno = ENOENT; -+ return -1; -+ } -+ -+ i = read(file, hashbang, FAKECHROOT_MAXPATH-2); -+ close(file); -+ if (i == -1) { -+ errno = ENOENT; -+ return -1; -+ } -+ - /* Add our variables to newenvp */ -- newenvp = realloc( newenvp, i * sizeof(char *) + sizeof(envkey) ); -+ newenvp = realloc( newenvp, (newenvppos + nr_envkey + 1) * sizeof(char *) ); - if (newenvp == NULL) { - errno = ENOMEM; - return -1; - } -- for (j = 0; j < sizeof(envkey) / sizeof(char *); j++) { -+ for (j = 0; j < nr_envkey; j++) { - env = getenv(envkey[j]); - if (env != NULL) { -- newenvp[i] = malloc(strlen(envkey[j]) + strlen(env) + 3); -- strcpy(newenvp[i], envkey[j]); -- strcat(newenvp[i], "="); -- strcat(newenvp[i], env); -- i++; -+ newenvp[newenvppos] = malloc(strlen(envkey[j]) + strlen(env) + 3); -+ strcpy(newenvp[newenvppos], envkey[j]); -+ strcat(newenvp[newenvppos], "="); -+ strcat(newenvp[newenvppos], env); -+ newenvppos++; - } - } -- newenvp[i] = NULL; -+ newenvp[newenvppos] = NULL; - - /* No hashbang in argv */ - if (hashbang[0] != '#' || hashbang[1] != '!') -Index: man/fakechroot.pod -=================================================================== ---- man/fakechroot.pod (revision 323) -+++ man/fakechroot.pod (working copy) -@@ -139,6 +139,21 @@ - The list of directories which are excluded from being chrooted. The elements - of list are separated with colon. - -+=item B<FAKECHROOT_CMD_SUBST> -+ -+A list of command substitutions. If a program tries to execute one of -+the commands given (path relative to the chroot) then the substitute -+command runs instead (path to substitute command is not chrooted). -+ -+For example: -+ -+ FAKECHROOT_CMD_SUBST=/sbin/ldconfig=/tmp/ldconfig-wrapper -+ -+will substitute C</tmp/ldconfig-wrapper> for C</sbin/ldconfig>. -+ -+Give as many substitute commands as you want, separated by C<:> -+(colon) characters. -+ - =item B<LD_LIBRARY_PATH>, B<LD_PRELOAD> - - Fakechroot is implemented by wrapping system calls. This is accomplished by |