RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [EMAIL PROTECTED] Module: rpm Date: 20-Sep-2008 23:10:31 Branch: HEAD Handle: 2008092021103001 Modified files: rpm CHANGES rpm/lib psm.c Log: - jbj: permit multiple triggers to fire from packages. Summary: Revision Changes Path 1.2554 +1 -0 rpm/CHANGES 2.311 +78 -93 rpm/lib/psm.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2553 -r1.2554 CHANGES --- rpm/CHANGES 20 Sep 2008 15:31:47 -0000 1.2553 +++ rpm/CHANGES 20 Sep 2008 21:10:30 -0000 1.2554 @@ -1,5 +1,6 @@ 5.1.0 -> 5.2a0: + - jbj: permit multiple triggers to fire from packages. - jbj: don't install symclash.* to avoid picking up a dependency on python. - jbj: fix: check added file names against installed conflicts. - jbj: update nl.po (Translation Project). @@ . patch -p0 <<'@@ .' Index: rpm/lib/psm.c ============================================================================ $ cvs diff -u -r2.310 -r2.311 psm.c --- rpm/lib/psm.c 7 Sep 2008 15:10:55 -0000 2.310 +++ rpm/lib/psm.c 20 Sep 2008 21:10:31 -0000 2.311 @@ -1013,35 +1013,35 @@ * @param sourceH * @param triggeredH * @param arg2 - * @param triggersAlreadyRun + * @param done * @return */ static rpmRC handleOneTrigger(const rpmpsm psm, Header sourceH, Header triggeredH, - int arg2, unsigned char * triggersAlreadyRun) + int arg2, /[EMAIL PROTECTED]@*/ unsigned char * done) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, [EMAIL PROTECTED]/ /[EMAIL PROTECTED] psm, sourceH, triggeredH, *triggersAlreadyRun, rpmGlobalMacroContext, fileSystem, internalState @*/ { int scareMem = 0; - HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); + HE_t Nhe = memset(alloca(sizeof(*Nhe)), 0, sizeof(*Nhe)); + HE_t Ihe = memset(alloca(sizeof(*Ihe)), 0, sizeof(*Ihe)); + HE_t She = memset(alloca(sizeof(*She)), 0, sizeof(*She)); + HE_t Phe = memset(alloca(sizeof(*Phe)), 0, sizeof(*Phe)); const rpmts ts = psm->ts; rpmds trigger = NULL; - const char ** triggerScripts; - const char ** triggerProgs; - rpmuint32_t * triggerIndices; const char * sourceName; const char * triggerName; rpmRC rc = RPMRC_OK; int xx; int i; - he->tag = RPMTAG_NAME; - xx = headerGet(sourceH, he, 0); - sourceName = he->p.str; - he->tag = RPMTAG_NAME; - xx = headerGet(triggeredH, he, 0); - triggerName = he->p.str; + Nhe->tag = RPMTAG_NAME; + xx = headerGet(sourceH, Nhe, 0); + sourceName = Nhe->p.str; + Nhe->tag = RPMTAG_NAME; + xx = headerGet(triggeredH, Nhe, 0); + triggerName = Nhe->p.str; trigger = rpmdsInit(rpmdsNew(triggeredH, RPMTAG_TRIGGERNAME, scareMem)); if (trigger == NULL) @@ -1052,63 +1052,54 @@ while ((i = rpmdsNext(trigger)) >= 0) { const char * Name; rpmuint32_t Flags = rpmdsFlags(trigger); + int arg1; + int index; + + if (!(Flags & psm->sense)) + continue; if ((Name = rpmdsN(trigger)) == NULL) continue; /* XXX can't happen */ - if (strcmp(Name, sourceName)) continue; - if (!(Flags & psm->sense)) - continue; - - /* - * XXX Trigger on any provided dependency, not just the package NEVR. - */ + /* XXX Trigger on any provided dependency, not just the package NEVR. */ if (!rpmdsAnyMatchesDep(sourceH, trigger, 1)) continue; + if (done && done[i]) + continue; - he->tag = RPMTAG_TRIGGERINDEX; - xx = headerGet(triggeredH, he, 0); - triggerIndices = he->p.ui32p; - he->tag = RPMTAG_TRIGGERSCRIPTS; - xx = headerGet(triggeredH, he, 0); - triggerScripts = he->p.argv; - he->tag = RPMTAG_TRIGGERSCRIPTPROG; - xx = headerGet(triggeredH, he, 0); - triggerProgs = he->p.argv; - - if (triggerIndices && triggerScripts && triggerProgs) { - int arg1; - int index; - - arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), triggerName); - if (arg1 < 0) { - /* XXX W2DO? fails as "execution of script failed" */ - rc = RPMRC_FAIL; - } else { - arg1 += psm->countCorrection; - index = triggerIndices[i]; - if (triggersAlreadyRun == NULL || - triggersAlreadyRun[index] == 0) - { - rc = runScript(psm, triggeredH, "%trigger", 1, - triggerProgs + index, triggerScripts[index], - arg1, arg2); - if (triggersAlreadyRun != NULL) - triggersAlreadyRun[index] = 1; - } - } + Ihe->tag = RPMTAG_TRIGGERINDEX; + xx = headerGet(triggeredH, Ihe, 0); + if (!(xx && Ihe->p.ui32p && Ihe->c)) goto bottom; + + She->tag = RPMTAG_TRIGGERSCRIPTS; + xx = headerGet(triggeredH, She, 0); + if (!(xx && She->p.argv && She->c)) goto bottom; + + Phe->tag = RPMTAG_TRIGGERSCRIPTPROG; + xx = headerGet(triggeredH, Phe, 0); + if (!(xx && Phe->p.argv && Phe->c)) goto bottom; + + arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), triggerName); + if (arg1 < 0) { + /* XXX W2DO? fails as "execution of script failed" */ + rc = RPMRC_FAIL; + goto bottom; } - triggerIndices = _free(triggerIndices); - triggerScripts = _free(triggerScripts); - triggerProgs = _free(triggerProgs); + arg1 += psm->countCorrection; + index = Ihe->p.ui32p[i]; + /* XXX FIXME: permit trigger scripts with arguments. */ + rc = runScript(psm, triggeredH, "%trigger", 1, + Phe->p.argv + index, She->p.argv[index], + arg1, arg2); + if (done) + done[i] = 1; - /* - * Each target/source header pair can only result in a single - * script being run. - */ - break; +bottom: + Ihe->p.ptr = _free(Ihe->p.ptr); + She->p.ptr = _free(She->p.ptr); + Phe->p.ptr = _free(Phe->p.ptr); } trigger = rpmdsFree(trigger); @@ -1173,59 +1164,53 @@ /[EMAIL PROTECTED] psm, rpmGlobalMacroContext, fileSystem, internalState @*/ { - HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); + HE_t Nhe = memset(alloca(sizeof(*Nhe)), 0, sizeof(*Nhe)); + HE_t Ihe = memset(alloca(sizeof(*Ihe)), 0, sizeof(*Ihe)); + HE_t Fhe = memset(alloca(sizeof(*Fhe)), 0, sizeof(*Fhe)); const rpmts ts = psm->ts; rpmfi fi = psm->fi; - const char ** triggerNames; - int numTriggers; - rpmuint32_t * triggerIndices; - int numTriggerIndices; - unsigned char * triggersRun; + unsigned char * done = NULL; + Header sourceH = NULL; + unsigned i; rpmRC rc = RPMRC_OK; - size_t nb; int xx; assert(fi->h != NULL); if (fi->h == NULL) return rc; /* XXX can't happen */ - he->tag = RPMTAG_TRIGGERNAME; - xx = headerGet(fi->h, he, 0); - triggerNames = he->p.argv; - numTriggers = he->c; - he->tag = RPMTAG_TRIGGERINDEX; - xx = headerGet(fi->h, he, 0); - triggerIndices = he->p.ui32p; - numTriggerIndices = he->c; + Nhe->tag = RPMTAG_TRIGGERNAME; + xx = headerGet(fi->h, Nhe, 0); + if (!(xx && Nhe->p.argv && Nhe->c)) goto exit; + Ihe->tag = RPMTAG_TRIGGERINDEX; + xx = headerGet(fi->h, Ihe, 0); + if (!(xx && Ihe->p.ui32p && Ihe->c)) goto exit; + Fhe->tag = RPMTAG_TRIGGERFLAGS; + xx = headerGet(fi->h, Fhe, 0); + if (!(xx && Fhe->p.ui32p && Fhe->c)) goto exit; - if (!(triggerNames && numTriggers > 0 && triggerIndices && numTriggerIndices > 0)) - goto exit; + done = xcalloc(Ihe->c, sizeof(*done)); - nb = sizeof(*triggersRun) * numTriggerIndices; - triggersRun = memset(alloca(nb), 0, nb); - - { Header sourceH = NULL; - int i; - - for (i = 0; i < numTriggers; i++) { - rpmdbMatchIterator mi; + for (i = 0; i < Nhe->c; i++) { + rpmdbMatchIterator mi; - if (triggersRun[triggerIndices[i]] != 0) continue; + if (!(Fhe->p.ui32p[i] & psm->sense)) + continue; - mi = rpmtsInitIterator(ts, RPMTAG_NAME, triggerNames[i], 0); + mi = rpmtsInitIterator(ts, RPMTAG_NAME, Nhe->p.argv[i], 0); - while((sourceH = rpmdbNextIterator(mi)) != NULL) { + while((sourceH = rpmdbNextIterator(mi)) != NULL) { rc |= handleOneTrigger(psm, sourceH, fi->h, - rpmdbGetIteratorCount(mi), - triggersRun); - } - - mi = rpmdbFreeIterator(mi); + rpmdbGetIteratorCount(mi), done); } + + mi = rpmdbFreeIterator(mi); } exit: - triggerIndices = _free(triggerIndices); - triggerNames = _free(triggerNames); + done = _free(done); + Fhe->p.ptr = _free(Fhe->p.ptr); + Ihe->p.ptr = _free(Ihe->p.ptr); + Nhe->p.ptr = _free(Nhe->p.ptr); return rc; } @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org