Enable a cross-install scriptlet helper.

The helper is called from outside of the chroot with the arguments:

<root> <prog> <script> <arg1> [<arg2> ... <argN>]

The helper script is used by oe-core to facilitate shell script actions that
can not be run from within a chroot on a foreign target system during a
cross install.

Upstream-Status: Pending

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>

Index: rpm-5.4.14/lib/psm.c
===================================================================
--- rpm-5.4.14.orig/lib/psm.c
+++ rpm-5.4.14/lib/psm.c
@@ -806,6 +806,10 @@ static rpmRC runScript(rpmpsm psm, Heade
     int xx;
     int i;
 
+#ifdef RPM_VENDOR_OE
+    const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+#endif
+    
     if (psm->sstates != NULL && ix >= 0 && ix < RPMSCRIPT_MAX)
 	ssp = psm->sstates + ix;
     if (ssp != NULL)
@@ -872,14 +876,29 @@ assert(he->p.str != NULL);
 		(F_ISSET(psm, UNORDERED) ? "a" : ""));
 
     if (Phe->p.argv == NULL) {
-	argv = (const char **) alloca(5 * sizeof(*argv));
-	argv[0] = "/bin/sh";
-	argc = 1;
+	argv = (const char **) alloca(7 * sizeof(*argv));
+	argc = 0;
+    } else {
+	argv = (const char **) alloca((Phe->c + 6) * sizeof(*argv));
+	argc = 0;
+    }
+
+#ifdef RPM_VENDOR_OE
+    if (scriptletWrapper && *scriptletWrapper) {
+	argv[argc++] = scriptletWrapper;
+	argv[argc] = rpmtsRootDir(ts);
+	if (!argv[argc] || !*argv[argc])
+	   argv[argc] = "/";
+	argc++;
+    }
+#endif
+
+    if (Phe->p.argv == NULL) {
+	argv[argc++] = "/bin/sh";
 	ldconfig_done = 0;
     } else {
-	argv = (const char **) alloca((Phe->c + 4) * sizeof(*argv));
-	memcpy(argv, Phe->p.argv, Phe->c * sizeof(*argv));
-	argc = Phe->c;
+	memcpy((argv + argc), Phe->p.argv, Phe->c * sizeof(*argv));
+	argc += Phe->c;
 	ldconfig_done = (ldconfig_path && !strcmp(argv[0], ldconfig_path)
 		? 1 : 0);
     }
@@ -930,7 +949,12 @@ assert(he->p.str != NULL);
 	    goto exit;
 
 	if (rpmIsDebug() &&
-	    (!strcmp(argv[0], "/bin/sh") || !strcmp(argv[0], "/bin/bash")))
+	    (!strcmp(argv[0], "/bin/sh") || !strcmp(argv[0], "/bin/bash"))
+#ifdef RPM_VENDOR_OE
+	    || (scriptletWrapper && *scriptletWrapper && !strcmp(argv[1], "/bin/sh"))
+	    || (scriptletWrapper && *scriptletWrapper && !strcmp(argv[1], "/bin/bash"))
+#endif
+	   )
 	{
 	    static const char set_x[] = "set -x\n";
 	    nw = Fwrite(set_x, sizeof(set_x[0]), sizeof(set_x)-1, fd);
@@ -1065,12 +1089,22 @@ assert(he->p.str != NULL);
 
 	{   const char * rootDir = rpmtsRootDir(ts);
 	    if (!rpmtsChrootDone(ts) && rootDir != NULL &&
+#ifdef RPM_VENDOR_OE
+		!(scriptletWrapper && *scriptletWrapper) &&
+#endif
 		!(rootDir[0] == '/' && rootDir[1] == '\0'))
 	    {
 		/*@-modobserver@*/
 		xx = Chroot(rootDir);
 		/*@=modobserver@*/
 	    }
+#ifdef RPM_VENDOR_OE
+	    if (!rpmtsChrootDone(ts) && rootDir != NULL &&
+		(scriptletWrapper && *scriptletWrapper) &&
+		!(rootDir[0] == '/' && rootDir[1] == '\0'))
+		xx = Chdir(rootDir);
+	    else 
+#endif
 	    xx = Chdir("/");
 	    rpmlog(RPMLOG_DEBUG, D_("%s: %s(%s)\texecv(%s) pid %d\n"),
 			psm->stepName, sln, NVRA,
@@ -2985,6 +3019,13 @@ assert(psm->te != NULL);
     case PSM_SCRIPT:	/* Run current package scriptlets. */
 	/* XXX running %verifyscript/%sanitycheck doesn't have psm->te */
     {	rpmtxn _parent = (psm && psm->te ? psm->te->txn : NULL);
+
+#ifdef RPM_VENDOR_OE
+        const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+	if (scriptletWrapper && *scriptletWrapper)
+	     rc = rpmpsmNext(psm, PSM_CHROOT_OUT);
+#endif
+
 	xx = rpmtxnBegin(rpmtsGetRdb(ts), _parent, NULL);
 	rc = runInstScript(psm);
 	if (rc)
@@ -2992,11 +3033,24 @@ assert(psm->te != NULL);
 	else
 	     xx = rpmtxnCommit(rpmtsGetRdb(ts)->db_txn);
 	rpmtsGetRdb(ts)->db_txn = NULL;
+#ifdef RPM_VENDOR_OE
+	if (scriptletWrapper && *scriptletWrapper)
+	     rc = rpmpsmNext(psm, PSM_CHROOT_IN);
+#endif
     }	break;
     case PSM_TRIGGERS:
 	/* Run triggers in other package(s) this package sets off. */
 	if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)	break;
+#ifdef RPM_VENDOR_OE
+        const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+	if (scriptletWrapper && *scriptletWrapper)
+	     rc = rpmpsmNext(psm, PSM_CHROOT_OUT);
+#endif
 	rc = runTriggers(psm);
+#ifdef RPM_VENDOR_OE
+	if (scriptletWrapper && *scriptletWrapper)
+	     rc = rpmpsmNext(psm, PSM_CHROOT_IN);
+#endif
 	break;
     case PSM_IMMED_TRIGGERS:
 	/* Run triggers in this package other package(s) set off. */
@@ -3006,7 +3060,18 @@ assert(psm->te != NULL);
 	    F_SET(psm, GOTTRIGGERS);
 	}
 	if (psm->triggers != NULL)
+#ifdef RPM_VENDOR_OE
+	{
+            const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
+	    if (scriptletWrapper && *scriptletWrapper)
+	         rc = rpmpsmNext(psm, PSM_CHROOT_OUT);
+#endif
 	    rc = runImmedTriggers(psm);
+#ifdef RPM_VENDOR_OE
+	    if (scriptletWrapper && *scriptletWrapper)
+	         rc = rpmpsmNext(psm, PSM_CHROOT_IN);
+	}
+#endif
 	break;
 
     case PSM_RPMIO_FLAGS:
