195 lines
6.3 KiB
Diff
195 lines
6.3 KiB
Diff
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);
|