Lua 'print' statement is not working properly inside of RPM 5

The print statement should capture the output and send it to the script
processing engine, and not display it directly to the screen.

This patch is from: http://rpm5.org/cvs/patchset?cn=17671

Upstream-Status: backport (patchset 17671 from rpm5.org)

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

Index: rpm-5.4.14/CHANGES
===================================================================
--- rpm-5.4.14.orig/CHANGES
+++ rpm-5.4.14/CHANGES
@@ -1,3 +1,4 @@
+    - jbj: lua: fix: resurrect output capture with lua-5.2.
     - jbj: verify: fix: broken logic for %ghost avoidance (Mark Hatle).
 
 5.4.13 -> 5.4.14:
Index: rpm-5.4.14/rpmio/rpmlua.c
===================================================================
--- rpm-5.4.14.orig/rpmio/rpmlua.c
+++ rpm-5.4.14/rpmio/rpmlua.c
@@ -175,7 +175,7 @@ rpmlua rpmluaNew(void)
     };
     /*@=readonlytrans =nullassign @*/
     /*@observer@*/ /*@unchecked@*/
-    const luaL_Reg *lib = lualibs;
+    const luaL_Reg *lib;
     char *path_buf;
     char *path_next;
     char *path;
@@ -190,31 +190,34 @@ rpmlua rpmluaNew(void)
 
     luaL_openlibs(L);
 
-    for (; lib->name; lib++) {
+    for (lib = lualibs; lib->name; lib++) {
 	luaL_requiref(L, lib->name, lib->func, 1);
+	lua_pop(L, 1);
     }
 
     {	const char * _lua_path = rpmGetPath(rpmluaPath, NULL);
  	if (_lua_path != NULL) {
+#if defined(LUA_GLOBALSINDEX)
 	    lua_pushliteral(L, "LUA_PATH");
 	    lua_pushstring(L, _lua_path);
+	    lua_rawset(L, LUA_GLOBALSINDEX);
+#else
+	    lua_pushstring(L, _lua_path);
+	    lua_setglobal(L, "LUA_PATH");
+#endif
 	    _lua_path = _free(_lua_path);
 	}
     }
 
 #if defined(LUA_GLOBALSINDEX)
-    lua_rawset(L, LUA_GLOBALSINDEX);
-#else
-    lua_pushglobaltable(L);
-#endif
     lua_pushliteral(L, "print");
     lua_pushcfunction(L, rpm_print);
-
-#if defined(LUA_GLOBALSINDEX)
     lua_rawset(L, LUA_GLOBALSINDEX);
 #else
-    lua_pushglobaltable(L);
+    lua_pushcfunction(L, rpm_print);
+    lua_setglobal(L, "print");
 #endif
+
     rpmluaSetData(lua, "lua", lua);
 
     /* load all standard RPM Lua script files */
@@ -351,6 +354,9 @@ void rpmluaSetVar(rpmlua _lua, rpmluav v
 #if defined(LUA_GLOBALSINDEX)
 	if (lua->pushsize == 0)
 	    lua_pushvalue(L, LUA_GLOBALSINDEX);
+#else
+	if (lua->pushsize == 0)
+	    lua_pushglobaltable(L);
 #endif
 	if (pushvar(L, var->keyType, &var->key) != -1) {
 	    if (pushvar(L, var->valueType, &var->value) != -1)
@@ -1039,14 +1045,15 @@ static int rpm_print (lua_State *L)
     lua_getglobal(L, "tostring");
     for (i = 1; i <= n; i++) {
 	const char *s;
+	size_t l;
 	lua_pushvalue(L, -1);  /* function to be called */
 	lua_pushvalue(L, i);   /* value to print */
 	lua_call(L, 1, 1);
-	s = lua_tostring(L, -1);  /* get result */
+	s = lua_tolstring(L, -1, &l);  /* get result */
 	if (s == NULL)
 	    return luaL_error(L, "`tostring' must return a string to `print'");
 	if (lua->storeprint) {
-	    size_t sl = lua_rawlen(L, -1);
+	    size_t sl = l;
 	    if ((size_t)(lua->printbufused+sl+1) > lua->printbufsize) {
 		lua->printbufsize += sl+512;
 		lua->printbuf = (char *) xrealloc(lua->printbuf, lua->printbufsize);
