/** * Return exit code from running verify script from header. * @todo malloc/free/refcount handling is fishy here. * @param qva parsed query/verify options * @param ts transaction set * @param fi file info set * @param scriptFd file handle to use for stderr (or NULL) * @return 0 on success */ static int rpmVerifyScript(/*@unused@*/ QVA_t qva, rpmts ts, rpmfi fi, /*@null@*/ FD_t scriptFd) /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@modifies ts, fi, scriptFd, rpmGlobalMacroContext, fileSystem, internalState @*/ { rpmpsm psm; rpmRC rc; int ec = 0; if (scriptFd != NULL) rpmtsSetScriptFd(ts, scriptFd); psm = rpmpsmNew(ts, NULL, fi); rc = rpmpsmScriptStage(psm, RPMTAG_VERIFYSCRIPT, RPMTAG_VERIFYSCRIPTPROG); if (rc != RPMRC_OK) ec = 1; rc = rpmpsmScriptStage(psm, RPMTAG_SANITYCHECK, RPMTAG_SANITYCHECKPROG); if (rc != RPMRC_OK) ec = 1; psm = rpmpsmFree(psm, __FUNCTION__); if (scriptFd != NULL) rpmtsSetScriptFd(ts, NULL); return ec; }
/** * Return exit code from running verify script from header. * @todo malloc/free/refcount handling is fishy here. * @param qva parsed query/verify options * @param ts transaction set * @param h header * @param scriptFd file handle to use for stderr (or NULL) * @return 0 on success */ static int rpmVerifyScript(QVA_t qva, rpmts ts, Header h, FD_t scriptFd) { rpmpsm psm = NULL; rpmte te = NULL; int rc = 0; /* fake up a erasure transaction element */ rc = rpmtsAddEraseElement(ts, h, -1); te = rpmtsElement(ts, 0); rpmteOpen(te, ts, 0); if (scriptFd != NULL) rpmtsSetScriptFd(ts, scriptFd); /* create psm to run the script */ psm = rpmpsmNew(ts, te); rpmpsmScriptStage(psm, RPMTAG_VERIFYSCRIPT, RPMTAG_VERIFYSCRIPTPROG); rc = rpmpsmStage(psm, PSM_SCRIPT); psm = rpmpsmFree(psm); if (scriptFd != NULL) rpmtsSetScriptFd(ts, NULL); /* clean up our fake transaction bits */ rpmteClose(te, ts, 0); rpmtsEmpty(ts); return rc; }
/* * Run pre/post transaction scripts for transaction set * param ts Transaction set * param stag RPMTAG_PRETRANS or RPMTAG_POSTTRANS * return 0 on success, -1 on error (invalid script tag) */ static int runTransScripts(rpmts ts, rpmTag stag) { rpmtsi pi; rpmte p; rpmpsm psm; int xx; pi = rpmtsiInit(ts); while ((p = rpmtsiNext(pi, TR_ADDED)) != NULL) { rpmTag progtag = RPMTAG_NOT_FOUND; /* If no pre/post-transaction script, then don't bother. */ if (!rpmteHaveTransScript(p, stag)) continue; switch (stag) { case RPMTAG_PRETRANS: progtag = RPMTAG_PRETRANSPROG; break; case RPMTAG_POSTTRANS: progtag = RPMTAG_POSTTRANSPROG; break; default: assert(progtag != RPMTAG_NOT_FOUND); break; } if (rpmteOpen(p, ts, 0)) { psm = rpmpsmNew(ts, p); xx = rpmpsmScriptStage(psm, stag, progtag); psm = rpmpsmFree(psm); rpmteClose(p, ts, 0); } } pi = rpmtsiFree(pi); return 0; }