/** * 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; }
int rpmcliVerify(rpmts ts, QVA_t qva, char * const * argv) { rpmVSFlags vsflags, ovsflags; int ec = 0; FD_t scriptFd = fdDup(STDOUT_FILENO); /* * Open the DB + indices explicitly before possible chroot, * otherwises BDB is going to be unhappy... */ rpmtsOpenDB(ts, O_RDONLY); rpmdbOpenAll(rpmtsGetRdb(ts)); if (rpmChrootSet(rpmtsRootDir(ts)) || rpmChrootIn()) { ec = 1; goto exit; } if (qva->qva_showPackage == NULL) qva->qva_showPackage = showVerifyPackage; vsflags = rpmExpandNumeric("%{?_vsflags_verify}"); if (rpmcliQueryFlags & VERIFY_DIGEST) vsflags |= _RPMVSF_NODIGESTS; if (rpmcliQueryFlags & VERIFY_SIGNATURE) vsflags |= _RPMVSF_NOSIGNATURES; if (rpmcliQueryFlags & VERIFY_HDRCHK) vsflags |= RPMVSF_NOHDRCHK; vsflags &= ~RPMVSF_NEEDPAYLOAD; rpmtsSetScriptFd(ts, scriptFd); ovsflags = rpmtsSetVSFlags(ts, vsflags); ec = rpmcliArgIter(ts, qva, argv); vsflags = rpmtsSetVSFlags(ts, ovsflags); rpmtsSetScriptFd(ts, NULL); if (qva->qva_showPackage == showVerifyPackage) qva->qva_showPackage = NULL; rpmtsEmpty(ts); if (rpmChrootOut() || rpmChrootSet(NULL)) ec = 1; exit: Fclose(scriptFd); return ec; }
static int rpmts_set_scriptFd(rpmtsObject *s, PyObject *value, void *closure) { rpmfdObject *fdo = NULL; int rc = 0; if (PyArg_Parse(value, "O&", rpmfdFromPyObject, &fdo)) { Py_XDECREF(s->scriptFd); s->scriptFd = fdo; rpmtsSetScriptFd(s->ts, rpmfdGetFd(s->scriptFd)); } else if (value == Py_None) { Py_XDECREF(s->scriptFd); s->scriptFd = NULL; rpmtsSetScriptFd(s->ts, NULL); } else { rc = -1; } return rc; }
/* * Set the transaction script file handle * i.e stdout/stderr on scriptlet execution * @param [File] file File handle */ VALUE rpm_transaction_set_script_file(VALUE trans, VALUE file) { if (TYPE(file) != T_FILE) { rb_raise(rb_eTypeError, "illegal argument type"); } rb_ivar_set(trans, id_sf, file); RPM_SCRIPT_FD(trans) = fdDup(NUM2INT(rb_Integer(file))); #if RPM_VERSION_CODE < RPM_VERSION(4,1,0) rpmtransSetScriptFd(RPM_TRANSACTION(trans), RPM_SCRIPT_FD(trans)); #else rpmtsSetScriptFd(RPM_TRANSACTION(trans), RPM_SCRIPT_FD(trans)); #endif return Qnil; }