A new user interface for you! Read more...

File luaroot.diff of Package rpm

Index: lib/psm.c
===================================================================
--- lib/psm.c.orig
+++ lib/psm.c
@@ -441,6 +441,8 @@ static rpmRC runLuaScript(rpmpsm psm, He
 #ifdef WITH_LUA
     char *sname = NULL;
     int rootFd = -1;
+    int chroot_done;
+    const char *rootDir;
     int xx;
     rpmlua lua = NULL; /* Global state. */
     rpmluav var;
@@ -449,16 +451,21 @@ static rpmRC runLuaScript(rpmpsm psm, He
 
     rpmlog(RPMLOG_DEBUG, "%s: %s running <lua> scriptlet.\n",
 	   psm->stepName, sname);
-    if (!rpmtsChrootDone(ts)) {
-	const char *rootDir = rpmtsRootDir(ts);
-	xx = chdir("/");
-	rootFd = open(".", O_RDONLY, 0);
-	if (rootFd >= 0) {
-	    if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/')
+    chroot_done = rpmtsChrootDone(ts);
+    rootDir = rpmtsRootDir(ts);
+    if (!chroot_done) {
+	if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/') {
+	    xx = chdir("/");
+	    rootFd = open(".", O_RDONLY, 0);
+	    if (rootFd >= 0) {
 		xx = chroot(rootDir);
-	    xx = rpmtsSetChrootDone(ts, 1);
+		xx = rpmtsSetChrootDone(ts, 1);
+	    }
 	}
+    } else {
+	rootFd = open(".", O_RDONLY, 0);
     }
+    xx = chdir("/");
 
     /* Create arg variable */
     rpmluaPushTable(lua, "arg");
@@ -491,12 +498,17 @@ static rpmRC runLuaScript(rpmpsm psm, He
     rpmluaDelVar(lua, "arg");
 
     if (rootFd >= 0) {
-	const char *rootDir = rpmtsRootDir(ts);
 	xx = fchdir(rootFd);
 	xx = close(rootFd);
-	if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/')
+	if (!chroot_done) {
 	    xx = chroot(".");
-	xx = rpmtsSetChrootDone(ts, 0);
+	    xx = rpmtsSetChrootDone(ts, 0);
+	}
+    }
+    if (!chroot_done) {
+	const char *currDir = rpmtsCurrDir(ts);
+	if (currDir != NULL)
+	    xx = chdir(currDir);
     }
     free(sname);
 #else