/** * Run internal Lua script. */ static rpmRC runLuaScript(rpmPlugins plugins, ARGV_const_t prefixes, const char *sname, rpmlogLvl lvl, FD_t scriptFd, ARGV_t * argvp, const char *script, int arg1, int arg2) { rpmRC rc = RPMRC_FAIL; #ifdef WITH_LUA ARGV_t argv = argvp ? *argvp : NULL; rpmlua lua = NULL; /* Global state. */ rpmluav var = rpmluavNew(); int cwd = -1; rpmlog(RPMLOG_DEBUG, "%s: running <lua> scriptlet.\n", sname); /* Create arg variable */ rpmluaPushTable(lua, "arg"); rpmluavSetListMode(var, 1); if (argv) { char **p; for (p = argv; *p; p++) { rpmluavSetValue(var, RPMLUAV_STRING, *p); rpmluaSetVar(lua, var); } } if (arg1 >= 0) { rpmluavSetValueNum(var, arg1); rpmluaSetVar(lua, var); } if (arg2 >= 0) { rpmluavSetValueNum(var, arg2); rpmluaSetVar(lua, var); } rpmluaPop(lua); /* Lua scripts can change our cwd and umask, save and restore */ /* XXX TODO: use cwd from chroot state to save unnecessary open here */ cwd = open(".", O_RDONLY); if (cwd != -1) { mode_t oldmask = umask(0); umask(oldmask); if (chdir("/") == 0 && rpmluaRunScript(lua, script, sname) == 0) { rc = RPMRC_OK; } /* This failing would be fatal, return something different for it... */ if (fchdir(cwd)) { rpmlog(RPMLOG_ERR, _("Unable to restore current directory: %m")); rc = RPMRC_NOTFOUND; } close(cwd); umask(oldmask); } rpmluaDelVar(lua, "arg"); rpmluavFree(var); #else rpmlog(lvl, _("<lua> scriptlet support not built in\n")); #endif return rc; }
static void specFini(void * _spec) /*@modifies _spec @*/ { Spec spec = _spec; struct ReadLevelEntry *rl; if (spec == NULL) return; /* XXX assert? */ spec->lbuf = _free(spec->lbuf); spec->sl = freeSl(spec->sl); spec->st = freeSt(spec->st); spec->prep = rpmiobFree(spec->prep); spec->build = rpmiobFree(spec->build); spec->install = rpmiobFree(spec->install); spec->check = rpmiobFree(spec->check); spec->clean = rpmiobFree(spec->clean); spec->foo = tagStoreFree(spec->foo, spec->nfoo); spec->nfoo = 0; spec->buildSubdir = _free(spec->buildSubdir); spec->rootURL = _free(spec->rootURL); spec->specFile = _free(spec->specFile); closeSpec(spec); while (spec->readStack) { rl = spec->readStack; /*@-dependenttrans@*/ spec->readStack = rl->next; /*@=dependenttrans@*/ rl->next = NULL; rl = _free(rl); } spec->sourceRpmName = _free(spec->sourceRpmName); spec->sourcePkgId = _free(spec->sourcePkgId); spec->sourceHeader = headerFree(spec->sourceHeader); if (spec->fi != NULL) { rpmfi fi = spec->fi; spec->fi = NULL; fi = rpmfiFree(fi); } if (!spec->recursing) { if (spec->BASpecs != NULL) while (spec->BACount--) { /*@-unqualifiedtrans@*/ spec->BASpecs[spec->BACount] = freeSpec(spec->BASpecs[spec->BACount]); /*@=unqualifiedtrans@*/ } /*@-compdef@*/ spec->BASpecs = _free(spec->BASpecs); /*@=compdef@*/ } spec->BANames = _free(spec->BANames); spec->passPhrase = _free(spec->passPhrase); spec->cookie = _free(spec->cookie); #ifdef WITH_LUA { rpmlua lua = NULL; /* global state */ rpmluaDelVar(lua, "patches"); rpmluaDelVar(lua, "sources"); } #endif spec->sources = freeSources(spec->sources); spec->dig = pgpDigFree(spec->dig); spec->packages = freePackages(spec->packages); }