blob: 9333dea441132a654957a8820cf6e1fde48a7437 [file] [log] [blame]
Upstream-Status: Inappropriate [OE-Core]
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Ronan Le Martret <ronan.lemartret@open.eurogiciel.org>
Index: rpm-4.11.2/lib/psm.c
===================================================================
--- rpm-4.11.2.orig/lib/psm.c
+++ rpm-4.11.2/lib/psm.c
@@ -421,7 +421,8 @@ static rpmRC runScript(rpmpsm psm, ARGV_
rpmswEnter(rpmtsOp(psm->ts, RPMTS_OP_SCRIPTLETS), 0);
rc = rpmScriptRun(script, arg1, arg2, sfd,
- prefixes, warn_only, selinux);
+ prefixes, warn_only, selinux, rpmtsRootDir(psm->ts) );
+
rpmswExit(rpmtsOp(psm->ts, RPMTS_OP_SCRIPTLETS), 0);
/* Map warn-only errors to "notfound" for script stop callback */
@@ -958,15 +959,49 @@ static rpmRC rpmpsmStage(rpmpsm psm, pkg
case PSM_DESTROY:
break;
case PSM_SCRIPT: /* Run current package scriptlets. */
+#ifdef RPM_VENDOR_OE
+ {
+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+ if (scriptletWrapper && *scriptletWrapper)
+ (void) rpmChrootOut();
+#endif
+
rc = runInstScript(psm);
+#ifdef RPM_VENDOR_OE
+ if (scriptletWrapper && *scriptletWrapper)
+ (void) rpmChrootIn();
+ }
+#endif
break;
case PSM_TRIGGERS:
/* Run triggers in other package(s) this package sets off. */
+#ifdef RPM_VENDOR_OE
+ {
+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+ if (scriptletWrapper && *scriptletWrapper)
+ (void) rpmChrootOut();
+#endif
rc = runTriggers(psm);
+#ifdef RPM_VENDOR_OE
+ if (scriptletWrapper && *scriptletWrapper)
+ (void) rpmChrootIn();
+ }
+#endif
break;
case PSM_IMMED_TRIGGERS:
/* Run triggers in this package other package(s) set off. */
+#ifdef RPM_VENDOR_OE
+ {
+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+ if (scriptletWrapper && *scriptletWrapper)
+ (void) rpmChrootOut();
+#endif
rc = runImmedTriggers(psm);
+#ifdef RPM_VENDOR_OE
+ if (scriptletWrapper && *scriptletWrapper)
+ (void) rpmChrootIn();
+ }
+#endif
break;
case PSM_RPMDB_ADD: {
Index: rpm-4.11.2/lib/rpmscript.c
===================================================================
--- rpm-4.11.2.orig/lib/rpmscript.c
+++ rpm-4.11.2/lib/rpmscript.c
@@ -92,7 +92,7 @@ static rpmRC runLuaScript(int selinux, A
static const char * const SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin";
static void doScriptExec(int selinux, ARGV_const_t argv, ARGV_const_t prefixes,
- FD_t scriptFd, FD_t out)
+ FD_t scriptFd, FD_t out, char * rootDir )
{
int pipes[2];
int flag;
@@ -158,13 +158,12 @@ static void doScriptExec(int selinux, AR
setenv("RPM_INSTALL_PREFIX", *pf, 1);
}
}
-
- if (chdir("/") == 0) {
+ if (chdir(rootDir) == 0) {
/* XXX Don't mtrace into children. */
unsetenv("MALLOC_CHECK_");
/* Permit libselinux to do the scriptlet exec. */
- if (selinux == 1) {
+ if (selinux == 1) {
xx = rpm_execcon(0, argv[0], argv, environ);
}
@@ -175,12 +174,12 @@ static void doScriptExec(int selinux, AR
_exit(127); /* exit 127 for compatibility with bash(1) */
}
-static char * writeScript(const char *cmd, const char *script)
+static char * writeScript(const char *cmd, const char *script, char * rootDir)
{
char *fn = NULL;
size_t slen = strlen(script);
int ok = 0;
- FD_t fd = rpmMkTempFile("/", &fn);
+ FD_t fd = rpmMkTempFile(rootDir, &fn);
if (Ferror(fd))
goto exit;
@@ -204,7 +203,7 @@ exit:
*/
static rpmRC runExtScript(int selinux, ARGV_const_t prefixes,
const char *sname, rpmlogLvl lvl, FD_t scriptFd,
- ARGV_t * argvp, const char *script, int arg1, int arg2)
+ ARGV_t * argvp, const char *script, int arg1, int arg2,char * rootDir)
{
FD_t out = NULL;
char * fn = NULL;
@@ -215,7 +214,7 @@ static rpmRC runExtScript(int selinux, A
rpmlog(RPMLOG_DEBUG, "%s: scriptlet start\n", sname);
if (script) {
- fn = writeScript(*argvp[0], script);
+ fn = writeScript(*argvp[0], script, rootDir);
if (fn == NULL) {
rpmlog(RPMLOG_ERR,
_("Couldn't create temporary file for %s: %s\n"),
@@ -258,7 +257,7 @@ static rpmRC runExtScript(int selinux, A
} else if (pid == 0) {/* Child */
rpmlog(RPMLOG_DEBUG, "%s: execv(%s) pid %d\n",
sname, *argvp[0], (unsigned)getpid());
- doScriptExec(selinux, *argvp, prefixes, scriptFd, out);
+ doScriptExec(selinux, *argvp, prefixes, scriptFd, out, rootDir);
}
do {
@@ -297,13 +296,27 @@ exit:
}
rpmRC rpmScriptRun(rpmScript script, int arg1, int arg2, FD_t scriptFd,
- ARGV_const_t prefixes, int warn_only, int selinux)
+ ARGV_const_t prefixes, int warn_only, int selinux, char * rootDir)
{
ARGV_t args = NULL;
rpmlogLvl lvl = warn_only ? RPMLOG_WARNING : RPMLOG_ERR;
rpmRC rc;
-
- if (script == NULL) return RPMRC_OK;
+#ifdef RPM_VENDOR_OE
+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+#endif
+
+ if (script == NULL) return RPMRC_OK;
+#ifdef RPM_VENDOR_OE
+ if (scriptletWrapper && *scriptletWrapper) {
+ argvAdd(&args, scriptletWrapper);
+
+ if ( rootDir ) {
+ argvAdd(&args, rootDir);
+ } else {
+ argvAdd(&args, "/");
+ }
+ }
+#endif
/* construct a new argv as we can't modify the one from header */
if (script->args) {
@@ -315,7 +328,7 @@ rpmRC rpmScriptRun(rpmScript script, int
if (rstreq(args[0], "<lua>")) {
rc = runLuaScript(selinux, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2);
} else {
- rc = runExtScript(selinux, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2);
+ rc = runExtScript(selinux, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2, rootDir);
}
argvFree(args);
Index: rpm-4.11.2/lib/rpmscript.h
===================================================================
--- rpm-4.11.2.orig/lib/rpmscript.h
+++ rpm-4.11.2/lib/rpmscript.h
@@ -29,7 +29,7 @@ rpmScript rpmScriptFree(rpmScript script
RPM_GNUC_INTERNAL
rpmRC rpmScriptRun(rpmScript script, int arg1, int arg2, FD_t scriptFd,
- ARGV_const_t prefixes, int warn_only, int selinux);
+ ARGV_const_t prefixes, int warn_only, int selinux, char * rootDir);
RPM_GNUC_INTERNAL
rpmTagVal rpmScriptTag(rpmScript script);