diff options
author | jbj <devnull@localhost> | 2002-05-19 23:37:24 +0000 |
---|---|---|
committer | jbj <devnull@localhost> | 2002-05-19 23:37:24 +0000 |
commit | 386882db7a38f24e0222a2ae94d4c93a34af0d37 (patch) | |
tree | e53df08616151ff51b3acb571d948cc018150537 /lib | |
parent | 2126e4ad09e175a4356a29ab03756dbbeb8c976f (diff) | |
download | rpm-386882db7a38f24e0222a2ae94d4c93a34af0d37.tar.gz rpm-386882db7a38f24e0222a2ae94d4c93a34af0d37.tar.bz2 rpm-386882db7a38f24e0222a2ae94d4c93a34af0d37.zip |
- fix: synthesize unpacking progress callbacks for packages w/o files.
CVS patchset: 5440
CVS date: 2002/05/19 23:37:24
Diffstat (limited to 'lib')
-rw-r--r-- | lib/depends.c | 8 | ||||
-rw-r--r-- | lib/fsm.c | 56 | ||||
-rw-r--r-- | lib/package.c | 2 | ||||
-rw-r--r-- | lib/psm.c | 116 | ||||
-rw-r--r-- | lib/rpmal.h | 4 | ||||
-rw-r--r-- | lib/rpmchecksig.c | 2 | ||||
-rw-r--r-- | lib/rpmcli.h | 2 | ||||
-rw-r--r-- | lib/rpmds.c | 2 | ||||
-rw-r--r-- | lib/rpmds.h | 2 | ||||
-rw-r--r-- | lib/rpmfi.c | 17 | ||||
-rw-r--r-- | lib/rpmfi.h | 12 | ||||
-rw-r--r-- | lib/rpminstall.c | 12 | ||||
-rw-r--r-- | lib/rpmlib.h | 7 | ||||
-rw-r--r-- | lib/rpmps.c | 7 | ||||
-rw-r--r-- | lib/rpmps.h | 6 | ||||
-rw-r--r-- | lib/rpmte.c | 44 | ||||
-rw-r--r-- | lib/rpmte.h | 38 | ||||
-rw-r--r-- | lib/rpmts.c | 66 | ||||
-rw-r--r-- | lib/rpmts.h | 57 | ||||
-rw-r--r-- | lib/signature.c | 1 | ||||
-rw-r--r-- | lib/transaction.c | 59 | ||||
-rw-r--r-- | lib/verify.c | 2 |
22 files changed, 313 insertions, 209 deletions
diff --git a/lib/depends.c b/lib/depends.c index c8815b823..fb3d5b7a2 100644 --- a/lib/depends.c +++ b/lib/depends.c @@ -14,7 +14,11 @@ #include "rpmal.h" #include "rpmds.h" #include "rpmfi.h" + +#define _RPMTE_INTERNAL #include "rpmte.h" + +#define _RPMTS_INTERNAL #include "rpmts.h" #include "debug.h" @@ -482,7 +486,7 @@ static int unsatisfiedDepend(rpmts ts, rpmds dep) /* * Search for an unsatisfied dependency. */ - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOSUGGESTS) && ts->solve != NULL) + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOSUGGESTS) && ts->solve != NULL) xx = (*ts->solve) (ts, dep); unsatisfied: @@ -1142,7 +1146,7 @@ int rpmtsOrder(rpmts ts) int_32 Flags; #ifdef DYING - int chainsaw = rpmtsGetFlags(ts) & RPMTRANS_FLAG_CHAINSAW; + int chainsaw = rpmtsFlags(ts) & RPMTRANS_FLAG_CHAINSAW; #else int chainsaw = 1; #endif @@ -15,6 +15,7 @@ #include "psm.h" /* XXX fiTypeString */ #include "rpmerr.h" +#define _RPMFI_INTERNAL #include "rpmfi.h" #include "rpmte.h" #include "rpmts.h" @@ -126,7 +127,7 @@ mapInitIterator(rpmts ts, rpmfi fi) iter = xcalloc(1, sizeof(*iter)); iter->ts = rpmtsLink(ts, "mapIterator"); iter->fi = rpmfiLink(fi, "mapIterator"); - iter->reverse = (fi->te->type == TR_REMOVED && fi->action != FA_COPYOUT); + iter->reverse = (rpmteType(fi->te) == TR_REMOVED && fi->action != FA_COPYOUT); iter->i = (iter->reverse ? (fi->fc - 1) : 0); iter->isave = iter->i; return iter; @@ -503,14 +504,9 @@ int fsmSetup(FSM_t fsm, fileStage goal, fsm->iter = mapInitIterator(ts, fi); if (fsm->goal == FSM_PKGINSTALL) { - if (ts && ts->notify) { - /*@-type@*/ /* FIX: cast? */ - /*@-noeffectuncon @*/ /* FIX: check rc */ - (void)ts->notify(fi->h, RPMCALLBACK_INST_START, 0, fi->archiveSize, - rpmfiKey(fi), ts->notifyData); - /*@=noeffectuncon @*/ - /*@=type@*/ - } + void * ptr; + ptr = rpmtsNotify(ts, fi->te, + RPMCALLBACK_INST_START, 0, fi->archiveSize); } /*@-assignexpose@*/ @@ -595,22 +591,22 @@ int fsmMapPath(FSM_t fsm) break; case FA_COPYIN: case FA_CREATE: -assert(fi->te->type == TR_ADDED); +assert(rpmteType(fi->te) == TR_ADDED); break; case FA_SKIPNSTATE: - if (fi->fstates && fi->te->type == TR_ADDED) + if (fi->fstates && rpmteType(fi->te) == TR_ADDED) fi->fstates[i] = RPMFILE_STATE_NOTINSTALLED; break; case FA_SKIPNETSHARED: - if (fi->fstates && fi->te->type == TR_ADDED) + if (fi->fstates && rpmteType(fi->te) == TR_ADDED) fi->fstates[i] = RPMFILE_STATE_NETSHARED; break; case FA_BACKUP: if (!(fsm->fflags & RPMFILE_GHOST)) /* XXX Don't if %ghost file. */ - switch (fi->te->type) { + switch (rpmteType(fi->te)) { case TR_ADDED: fsm->osuffix = SUFFIX_RPMORIG; /*@innerbreak@*/ break; @@ -621,18 +617,18 @@ assert(fi->te->type == TR_ADDED); break; case FA_ALTNAME: -assert(fi->te->type == TR_ADDED); +assert(rpmteType(fi->te) == TR_ADDED); if (!(fsm->fflags & RPMFILE_GHOST)) /* XXX Don't if %ghost file. */ fsm->nsuffix = SUFFIX_RPMNEW; break; case FA_SAVE: -assert(fi->te->type == TR_ADDED); +assert(rpmteType(fi->te) == TR_ADDED); if (!(fsm->fflags & RPMFILE_GHOST)) /* XXX Don't if %ghost file. */ fsm->osuffix = SUFFIX_RPMSAVE; break; case FA_ERASE: - assert(fi->te->type == TR_REMOVED); + assert(rpmteType(fi->te) == TR_REMOVED); /* * XXX TODO: %ghost probably shouldn't be removed, but that changes * legacy rpm behavior. @@ -689,7 +685,7 @@ int fsmMapAttrs(FSM_t fsm) { rpmts ts = fsmGetTs(fsm); - if (ts != NULL && !(ts->transFlags & RPMTRANS_FLAG_NOMD5)) { + if (ts != NULL && !(rpmtsFlags(ts) & RPMTRANS_FLAG_NOMD5)) { fsm->fmd5sum = (fi->fmd5s ? fi->fmd5s[i] : NULL); fsm->md5sum = (fi->md5s ? (fi->md5s + (16 * i)) : NULL); } else { @@ -896,15 +892,9 @@ static int writeFile(/*@special@*/ FSM_t fsm, int writeData) { const rpmts ts = fsmGetTs(fsm); rpmfi fi = fsmGetFi(fsm); - if (ts && ts->notify && fi) { - size_t size = (fdGetCpioPos(fsm->cfd) - pos); - /*@-type@*/ /* FIX: cast? */ - /*@-noeffectuncon @*/ /* FIX: check rc */ - (void)ts->notify(fi->h, RPMCALLBACK_INST_PROGRESS, size, size, - rpmfiKey(fi), ts->notifyData); - /*@=noeffectuncon @*/ - /*@=type@*/ - } + size_t size = (fdGetCpioPos(fsm->cfd) - pos); + void * ptr; + ptr = rpmtsNotify(ts, fi->te, RPMCALLBACK_INST_PROGRESS, size, size); } rc = 0; @@ -1435,7 +1425,7 @@ int fsmStage(FSM_t fsm, fileStage stage) case FSM_CREATE: { rpmts ts = fsmGetTs(fsm); #define _tsmask (RPMTRANS_FLAG_PKGCOMMIT | RPMTRANS_FLAG_COMMIT) - fsm->commit = ((ts && (ts->transFlags & _tsmask) && + fsm->commit = ((ts && (rpmtsFlags(ts) & _tsmask) && fsm->goal != FSM_PKGCOMMIT) ? 0 : 1); #undef _tsmask } @@ -1696,15 +1686,9 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break; if (fsm->goal == FSM_PKGINSTALL || fsm->goal == FSM_PKGBUILD) { rpmts ts = fsmGetTs(fsm); rpmfi fi = fsmGetFi(fsm); - if (ts && ts->notify && fi) { - /*@-type@*/ /* FIX: cast? */ - /*@-noeffectuncon @*/ /* FIX: check rc */ - (void)ts->notify(fi->h, RPMCALLBACK_INST_PROGRESS, - fdGetCpioPos(fsm->cfd), fi->archiveSize, - rpmfiKey(fi), ts->notifyData); - /*@=noeffectuncon @*/ - /*@=type@*/ - } + void * ptr; + ptr = rpmtsNotify(ts, fi->te, RPMCALLBACK_INST_PROGRESS, + fdGetCpioPos(fsm->cfd), fi->archiveSize); } break; case FSM_UNDO: diff --git a/lib/package.c b/lib/package.c index 4b286b87b..47a8cf42d 100644 --- a/lib/package.c +++ b/lib/package.c @@ -10,6 +10,8 @@ #include <rpmlib.h> #include "rpmps.h" + +#define _RPMTS_INTERNAL #include "rpmts.h" #include "misc.h" /* XXX stripTrailingChar() */ @@ -17,8 +17,14 @@ #include <rpmurl.h> #include "rpmal.h" + +#define _RPMDS_INTERNAL /* XXX trigger->i */ #include "rpmds.h" + +#define _RPMFI_INTERNAL #include "rpmfi.h" + +#define _RPMTE_INTERNAL #include "rpmte.h" #include "rpmts.h" @@ -498,9 +504,12 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, goto exit; } -/*@-assignexpose -type@*/ - fi->te = ts->order[0]; -/*@=assignexpose =type@*/ +/*@-onlytrans@*/ /* FIX: te reference */ + fi->te = rpmtsElement(ts, 0); +/*@=onlytrans@*/ +/*@-nullpass@*/ /* FIX fi->h may be null */ + fi->te->h = headerLink(fi->h, "fi->te->h"); +/*@=nullpass@*/ fi->te->fd = fdLink(fd, "installSourcePackage"); hge = fi->hge; hfd = fi->hfd; @@ -561,14 +570,14 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, } } - _sourcedir = rpmGenPath(rpmtsGetRootDir(ts), "%{_sourcedir}", ""); + _sourcedir = rpmGenPath(rpmtsRootDir(ts), "%{_sourcedir}", ""); rc = chkdir(_sourcedir, "sourcedir"); if (rc) { rc = RPMRC_FAIL; goto exit; } - _specdir = rpmGenPath(rpmtsGetRootDir(ts), "%{_specdir}", ""); + _specdir = rpmGenPath(rpmtsRootDir(ts), "%{_specdir}", ""); rc = chkdir(_specdir, "specdir"); if (rc) { rc = RPMRC_FAIL; @@ -627,6 +636,7 @@ exit: /*@-branchstate@*/ if (fi) { + fi->te->h = headerFree(fi->te->h, "fi->te->h"); if (fi->te->fd) (void) Fclose(fi->te->fd); fi->te->fd = NULL; @@ -749,7 +759,7 @@ static int runScript(PSM_t psm, Header h, prefixBuf = alloca(maxPrefixLength + 50); if (script) { - const char * rootDir = rpmtsGetRootDir(ts); + const char * rootDir = rpmtsRootDir(ts); FD_t fd; /*@-branchstate@*/ @@ -861,7 +871,7 @@ static int runScript(PSM_t psm, Header h, } } - rootDir = rpmtsGetRootDir(ts); + rootDir = rpmtsRootDir(ts); if (rootDir != NULL) /* XXX can't happen */ switch(urlIsURL(rootDir)) { case URL_IS_PATH: @@ -1237,7 +1247,7 @@ int psmStage(PSM_t psm, pkgStage stage) case PSM_INIT: rpmMessage(RPMMESS_DEBUG, _("%s: %s has %d files, test = %d\n"), psm->stepName, rpmteNEVR(psm->te), - rpmfiFC(fi), (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST)); + rpmfiFC(fi), (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)); /* * When we run scripts, we pass an argument which is the number of @@ -1264,7 +1274,7 @@ assert(psm->mi == NULL); while ((psm->oh = rpmdbNextIterator(psm->mi))) { fi->record = rpmdbGetIteratorOffset(psm->mi); - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_MULTILIB) + if (rpmtsFlags(ts) & RPMTRANS_FLAG_MULTILIB) psm->oh = headerCopy(psm->oh); else psm->oh = NULL; @@ -1279,7 +1289,7 @@ assert(psm->mi == NULL); memset(fi->fstates, RPMFILE_STATE_NORMAL, fc); } - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_JUSTDB) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB) break; if (fc <= 0) break; /* @@ -1316,6 +1326,8 @@ assert(psm->mi == NULL); /* Retrieve installed header. */ rc = psmStage(psm, PSM_RPMDB_LOAD); +if (rc == 0) +psm->te->h = headerLink(fi->h, "psm->te->h"); } if (psm->goal == PSM_PKGSAVE) { /* Open output package for writing. */ @@ -1338,7 +1350,7 @@ assert(psm->mi == NULL); } break; case PSM_PRE: - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) break; /* Change root directory if requested and not already done. */ rc = psmStage(psm, PSM_CHROOT_IN); @@ -1347,11 +1359,11 @@ assert(psm->mi == NULL); psm->scriptTag = RPMTAG_PREIN; psm->progTag = RPMTAG_PREINPROG; - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPREIN)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPREIN)) { /* XXX FIXME: implement %triggerprein. */ } - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOPRE)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPRE)) { rc = psmStage(psm, PSM_SCRIPT); if (rc) { rpmError(RPMERR_SCRIPT, @@ -1369,7 +1381,7 @@ assert(psm->mi == NULL); psm->sense = RPMSENSE_TRIGGERUN; psm->countCorrection = -1; - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOTRIGGERUN)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERUN)) { /* Run triggers in other package(s) this package sets off. */ rc = psmStage(psm, PSM_TRIGGERS); if (rc) break; @@ -1379,7 +1391,7 @@ assert(psm->mi == NULL); if (rc) break; } - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOPREUN)) + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPREUN)) rc = psmStage(psm, PSM_SCRIPT); } if (psm->goal == PSM_PKGSAVE) { @@ -1475,21 +1487,23 @@ assert(psm->mi == NULL); } break; case PSM_PROCESS: - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) break; if (psm->goal == PSM_PKGINSTALL) { int i; - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_JUSTDB) break; -#ifdef DYING - if (fi->fc <= 0) break; - for (i = 0; i < fi->fc; i++) -#else - if (rpmfiFC(fi) <= 0) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB) break; + + /* XXX Synthesize callbacks for packages with no files. */ + if (rpmfiFC(fi) <= 0) { + void * ptr; + ptr = rpmtsNotify(ts, fi->te, RPMCALLBACK_INST_START, 0, 100); + ptr = rpmtsNotify(ts, fi->te, RPMCALLBACK_INST_PROGRESS, 100, 100); + break; + } + (void) rpmfiInit(fi, 0); - while ((i = rpmfiNext(fi)) >= 0) -#endif - { + while ((i = rpmfiNext(fi)) >= 0) { uid_t uid; gid_t gid; @@ -1570,8 +1584,8 @@ assert(psm->mi == NULL); if (psm->goal == PSM_PKGERASE) { int fc = rpmfiFC(fi); - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_JUSTDB) break; - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_APPLYONLY) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_APPLYONLY) break; if (fc <= 0) break; psm->what = RPMCALLBACK_UNINST_START; @@ -1625,7 +1639,7 @@ assert(psm->mi == NULL); } break; case PSM_POST: - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) break; if (psm->goal == PSM_PKGINSTALL) { int_32 installTime = (int_32) time(NULL); @@ -1639,7 +1653,7 @@ assert(psm->mi == NULL); xx = headerAddEntry(fi->h, RPMTAG_INSTALLTIME, RPM_INT32_TYPE, &installTime, 1); - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_MULTILIB) { + if (rpmtsFlags(ts) & RPMTRANS_FLAG_MULTILIB) { uint_32 multiLib, * newMultiLib, * p; if (hge(fi->h, RPMTAG_MULTILIBS, NULL, @@ -1661,7 +1675,7 @@ assert(psm->mi == NULL); * If this package has already been installed, remove it from * the database before adding the new one. */ - if (fi->record && !(rpmtsGetFlags(ts) & RPMTRANS_FLAG_APPLYONLY)) { + if (fi->record && !(rpmtsFlags(ts) & RPMTRANS_FLAG_APPLYONLY)) { rc = psmStage(psm, PSM_RPMDB_REMOVE); if (rc) break; } @@ -1674,11 +1688,11 @@ assert(psm->mi == NULL); psm->sense = RPMSENSE_TRIGGERIN; psm->countCorrection = 0; - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOPOST)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPOST)) { rc = psmStage(psm, PSM_SCRIPT); if (rc) break; } - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOTRIGGERIN)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERIN)) { /* Run triggers in other package(s) this package sets off. */ rc = psmStage(psm, PSM_TRIGGERS); if (rc) break; @@ -1688,7 +1702,7 @@ assert(psm->mi == NULL); if (rc) break; } - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_APPLYONLY)) + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_APPLYONLY)) rc = markReplacedFiles(psm); } @@ -1699,18 +1713,18 @@ assert(psm->mi == NULL); psm->sense = RPMSENSE_TRIGGERPOSTUN; psm->countCorrection = -1; - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOPOSTUN)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPOSTUN)) { rc = psmStage(psm, PSM_SCRIPT); /* XXX WTFO? postun failures don't cause erasure failure. */ } - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPOSTUN)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPOSTUN)) { /* Run triggers in other package(s) this package sets off. */ rc = psmStage(psm, PSM_TRIGGERS); if (rc) break; } - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_APPLYONLY)) + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_APPLYONLY)) rc = psmStage(psm, PSM_RPMDB_REMOVE); } if (psm->goal == PSM_PKGSAVE) { @@ -1759,8 +1773,12 @@ assert(psm->mi == NULL); /*@=nullstate@*/ } - if (fi->h && (psm->goal == PSM_PKGERASE || psm->goal == PSM_PKGSAVE)) - fi->h = headerFree(fi->h, "PSM_PKGSAVE_POST fi->h"); + if (psm->goal == PSM_PKGERASE || psm->goal == PSM_PKGSAVE) { +if (psm->te->h) +psm->te->h = headerFree(psm->te->h, "psm->te->h"); + if (fi->h) + fi->h = headerFree(fi->h, "PSM_PKGSAVE_POST fi->h"); + } psm->oh = headerFree(psm->oh, "PSM_PKGSAVE_POST psm->oh"); psm->pkgURL = _free(psm->pkgURL); psm->rpmio_flags = _free(psm->rpmio_flags); @@ -1793,20 +1811,14 @@ assert(psm->mi == NULL); case PSM_CREATE: break; case PSM_NOTIFY: -/*@-type@*/ - if (ts && ts->notify) { - /*@-noeffectuncon @*/ /* FIX: check rc */ - (void) ts->notify(fi->h, psm->what, psm->amount, psm->total, - rpmteKey(psm->te), ts->notifyData); - /*@=noeffectuncon @*/ - } -/*@=type@*/ - break; + { void * ptr; + ptr = rpmtsNotify(ts, psm->te, psm->what, psm->amount, psm->total); + } break; case PSM_DESTROY: break; case PSM_COMMIT: - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_PKGCOMMIT)) break; - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_APPLYONLY) break; + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_PKGCOMMIT)) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_APPLYONLY) break; rc = fsmSetup(fi->fsm, FSM_PKGCOMMIT, ts, fi, NULL, NULL, &psm->failedFile); @@ -1814,7 +1826,7 @@ assert(psm->mi == NULL); break; case PSM_CHROOT_IN: - { const char * rootDir = rpmtsGetRootDir(ts); + { const char * rootDir = rpmtsRootDir(ts); /* Change root directory if requested and not already done. */ if (rootDir != NULL && !rpmtsGetChrootDone(ts) && !psm->chrootDone) { static int _loaded = 0; @@ -1896,12 +1908,12 @@ fprintf(stderr, "*** PSM_RDB_LOAD: header #%u not found\n", fi->record); rc = (fi->h ? RPMRC_OK : RPMRC_FAIL); break; case PSM_RPMDB_ADD: - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) break; if (fi->h != NULL) /* XXX can't happen */ rc = rpmdbAdd(rpmtsGetRdb(ts), rpmtsGetTid(ts), fi->h); break; case PSM_RPMDB_REMOVE: - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST) break; + if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) break; rc = rpmdbRemove(rpmtsGetRdb(ts), rpmtsGetTid(ts), fi->record); break; diff --git a/lib/rpmal.h b/lib/rpmal.h index 61192cf0f..35094a7aa 100644 --- a/lib/rpmal.h +++ b/lib/rpmal.h @@ -8,6 +8,10 @@ typedef /*@abstract@*/ struct availableList_s * availableList; +#ifdef __cplusplus +{ +#endif + /** * Initialize available packckages, items, and directory list. * @param delta no. of entries to add on each realloc diff --git a/lib/rpmchecksig.c b/lib/rpmchecksig.c index d6b0872eb..5219b33ce 100644 --- a/lib/rpmchecksig.c +++ b/lib/rpmchecksig.c @@ -11,6 +11,8 @@ #include "rpmdb.h" #include "rpmps.h" + +#define _RPMTS_INTERNAL #include "rpmts.h" #include "rpmlead.h" diff --git a/lib/rpmcli.h b/lib/rpmcli.h index 81568c6ef..3e16f611b 100644 --- a/lib/rpmcli.h +++ b/lib/rpmcli.h @@ -432,7 +432,7 @@ int rpmInstallSource(rpmts ts, const char * arg, * Describe database command line requests. */ struct rpmInstallArguments_s { - rpmtsFlags transFlags; + rpmtransFlags transFlags; rpmprobFilterFlags probFilter; rpmInstallInterfaceFlags installInterfaceFlags; rpmEraseInterfaceFlags eraseInterfaceFlags; diff --git a/lib/rpmds.c b/lib/rpmds.c index eafe5a632..a8bc3ab69 100644 --- a/lib/rpmds.c +++ b/lib/rpmds.c @@ -5,6 +5,8 @@ #include <rpmlib.h> #include "rpmps.h" + +#define _RPMDS_INTERNAL #include "rpmds.h" #include "debug.h" diff --git a/lib/rpmds.h b/lib/rpmds.h index c9093b897..3f1155920 100644 --- a/lib/rpmds.h +++ b/lib/rpmds.h @@ -6,6 +6,7 @@ * Structure(s) used for dependency tag sets. */ +#if defined(_RPMDS_INTERNAL) /** * A package dependency set. */ @@ -31,6 +32,7 @@ struct rpmds_s { int_32 Count; /*!< No. of elements */ /*@refs@*/ int nrefs; /*!< Reference count. */ }; +#endif /* _RPMDS_INTERNAL */ #ifdef __cplusplus extern "C" { diff --git a/lib/rpmfi.c b/lib/rpmfi.c index 88e9ba5b2..496f760af 100644 --- a/lib/rpmfi.c +++ b/lib/rpmfi.c @@ -13,7 +13,10 @@ #include "cpio.h" /* XXX CPIO_FOO */ #include "fsm.h" /* XXX newFSM() */ +#define _RPMFI_INTERNAL #include "rpmfi.h" + +#define _RPMTE_INTERNAL /* relocations */ #include "rpmte.h" #include "rpmts.h" @@ -23,7 +26,6 @@ /*@access rpmfi @*/ /*@access rpmte @*/ -/*@access rpmts @*/ /* XXX for ts->ignoreSet */ /*@unchecked@*/ static int _fi_debug = 0; @@ -50,11 +52,6 @@ fprintf(stderr, "--> fi %p ++ %d %s at %s:%u\n", fi, fi->nrefs, msg, fn, ln); /*@-refcounttrans@*/ return fi; /*@=refcounttrans@*/ } -fnpyKey rpmfiKey(rpmfi fi) -{ - return (fi != NULL ? rpmteKey(fi->te) : NULL); -} - int rpmfiFC(rpmfi fi) { return (fi != NULL ? fi->fc : 0); @@ -394,7 +391,7 @@ Header relocateFileList(const rpmts ts, rpmfi fi, HME_t hme = fi->hme; HFD_t hfd = (fi->hfd ? fi->hfd : headerFreeData); static int _printed = 0; - int allowBadRelocate = (ts->ignoreSet & RPMPROB_FILTER_FORCERELOCATE); + int allowBadRelocate = (rpmtsFilterFlags(ts) & RPMPROB_FILTER_FORCERELOCATE); rpmRelocation * relocations = NULL; int numRelocations; const char ** validRelocations; @@ -490,7 +487,7 @@ Header relocateFileList(const rpmts ts, rpmfi fi, if (j == numValid && !allowBadRelocate && actions) { rpmps ps = rpmtsGetProblems(ts); rpmpsAppend(ps, RPMPROB_BADRELOCATE, - p->NEVR, p->key, + rpmteNEVR(p), rpmteKey(p), relocations[i].oldPath, NULL, NULL, 0); ps = rpmpsFree(ps); } @@ -601,7 +598,7 @@ Header relocateFileList(const rpmts ts, rpmfi fi, * If only adding libraries of different arch into an already * installed package, skip all other files. */ - if (p->multiLib && !isFileMULTILIB((fFlags[i]))) { + if (rpmteMultiLib(p) && !isFileMULTILIB((fFlags[i]))) { if (actions) { actions[i] = FA_SKIPMULTILIB; rpmMessage(RPMMESS_DEBUG, _("excluding multilib path %s%s\n"), @@ -1028,7 +1025,7 @@ if (fi->actions == NULL) if (ts != NULL) if (fi != NULL) - if (fi->te != NULL && fi->te->type == TR_ADDED) { + if (fi->te != NULL && rpmteType(fi->te) == TR_ADDED) { Header foo; /* XXX DYING */ if (fi->actions == NULL) diff --git a/lib/rpmfi.h b/lib/rpmfi.h index 900c5f9d3..bac24b020 100644 --- a/lib/rpmfi.h +++ b/lib/rpmfi.h @@ -6,6 +6,7 @@ * Structure(s) used for file info tag sets. */ +#if defined(_RPMFI_INTERNAL) /** */ typedef struct sharedFileInfo_s * sharedFileInfo; @@ -133,6 +134,8 @@ struct rpmfi_s { /*@refs@*/ int nrefs; /*!< Reference count. */ }; +#endif /* _RPMFI_INTERNAL */ + #ifdef __cplusplus extern "C" { #endif @@ -172,15 +175,6 @@ rpmfi XrpmfiLink (/*@null@*/ rpmfi fi, /*@null@*/ const char * msg, #define rpmfiLink(_fi, _msg) XrpmfiLink(_fi, _msg, __FILE__, __LINE__) /** - * Retrieve key from transaction element file info. - * @param fi transaction element file info - * @return transaction element file info key - */ -/*@exposed@*/ /*@dependent@*/ /*@null@*/ -fnpyKey rpmfiKey(rpmfi fi) - /*@*/; - -/** * Return file count from file info set. * @param fi file info set * @return current file count diff --git a/lib/rpminstall.c b/lib/rpminstall.c index 3c721af3c..fb9250472 100644 --- a/lib/rpminstall.c +++ b/lib/rpminstall.c @@ -8,6 +8,8 @@ #include "rpmdb.h" #include "rpmps.h" + +#define _RPMTS_INTERNAL /* ts->goal, ts->dbmode, ts->suggests */ #include "rpmts.h" #include "manifest.h" @@ -246,7 +248,7 @@ int rpmInstall(rpmts ts, vsflags |= _RPMTS_VSF_NOSIGNATURES; vsflags |= _RPMTS_VSF_VERIFY_LEGACY; - ts->dbmode = (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST) + ts->dbmode = (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) ? O_RDONLY : (O_RDWR|O_CREAT); { int notifyFlags; @@ -308,7 +310,7 @@ restart: fprintf(stdout, _("Retrieving %s\n"), fileURL); { char tfnbuf[64]; - const char * rootDir = rpmtsGetRootDir(ts); + const char * rootDir = rpmtsRootDir(ts); if (!(rootDir && * rootDir)) rootDir = ""; strcpy(tfnbuf, "rpm-xfer.XXXXXX"); @@ -603,7 +605,7 @@ restart: continue; } - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST)) { + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)) { eiu->rpmrc = rpmInstallSourcePackage(ts, eiu->fd, NULL, NULL); if (eiu->rpmrc != RPMRC_OK) eiu->numFailed++; } @@ -654,7 +656,7 @@ int rpmErase(rpmts ts, ts->goal = TSM_ERASE; /* XXX W2DO? O_EXCL??? */ - ts->dbmode = (rpmtsGetFlags(ts) & RPMTRANS_FLAG_TEST) + ts->dbmode = (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) ? O_RDONLY : (O_RDWR|O_EXCL); (void) rpmtsOpenDB(ts, ts->dbmode); @@ -704,7 +706,7 @@ int rpmErase(rpmts ts, } if (!stopUninstall) { - (void) rpmtsSetFlags(ts, (rpmtsGetFlags(ts) | RPMTRANS_FLAG_REVERSE)); + (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | RPMTRANS_FLAG_REVERSE)); numFailed += rpmtsRun(ts, NULL, 0); ps = rpmtsGetProblems(ts); ps = rpmpsFree(ps); diff --git a/lib/rpmlib.h b/lib/rpmlib.h index e8651f123..eb88a9ef6 100644 --- a/lib/rpmlib.h +++ b/lib/rpmlib.h @@ -65,8 +65,7 @@ void * _free(/*@only@*/ /*@null@*/ /*@out@*/ const void * p) * sets to reduce errors. In general, installs/upgrades are done before * strict removals, and prerequisite ordering is done on installs/upgrades. */ -typedef /*@abstract@*/ /*@refcounted@*/ -struct rpmts_s * rpmts; +typedef /*@abstract@*/ /*@refcounted@*/ struct rpmts_s * rpmts; /** \ingroup rpmtrans * An added/available package retrieval key. @@ -855,7 +854,7 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, /** \ingroup rpmtrans * Bit(s) to control rpmtsRun() operation. */ -typedef enum rpmtsFlags_e { +typedef enum rpmtransFlags_e { RPMTRANS_FLAG_NONE = 0, RPMTRANS_FLAG_TEST = (1 << 0), /*!< from --test */ RPMTRANS_FLAG_BUILD_PROBS = (1 << 1), /*!< @todo Document. */ @@ -899,7 +898,7 @@ typedef enum rpmtsFlags_e { /*@=enummemuse@*/ RPMTRANS_FLAG_NOMD5 = (1 << 27), /*!< from --nomd5 */ RPMTRANS_FLAG_NOSUGGESTS = (1 << 28) /*!< from --nosuggests */ -} rpmtsFlags; +} rpmtransFlags; #define _noTransScripts \ ( RPMTRANS_FLAG_NOPRE | \ diff --git a/lib/rpmps.c b/lib/rpmps.c index fde4b82e8..75b5cd910 100644 --- a/lib/rpmps.c +++ b/lib/rpmps.c @@ -7,14 +7,13 @@ #include <rpmlib.h> #include "rpmps.h" -#include "rpmts.h" #include "misc.h" #include "debug.h" -/*@access fnpyKey@*/ -/*@access rpmProblem@*/ -/*@access rpmProblemSet@*/ +/*@access fnpyKey @*/ +/*@access rpmProblem @*/ +/*@access rpmps @*/ /*@unchecked@*/ static int _ps_debug = 0; diff --git a/lib/rpmps.h b/lib/rpmps.h index 0561989ca..14e3b179e 100644 --- a/lib/rpmps.h +++ b/lib/rpmps.h @@ -84,10 +84,12 @@ void printDepProblems(FILE * fp, /*@null@*/ const rpmps ps) * @param prob rpm problem * @return formatted string (malloc'd) */ +/*@-exportlocal@*/ /*@-redecl@*/ /* LCL: is confused. */ /*@only@*/ extern const char * rpmProblemString(const rpmProblem prob) /*@*/; /*@=redecl@*/ +/*@=exportlocal@*/ /** * Unreference a problem set instance. @@ -101,11 +103,13 @@ rpmps rpmpsUnlink (/*@killref@*/ /*@returned@*/ rpmps ps, /*@modifies ps @*/; /** @todo Remove debugging entry from the ABI. */ +/*@-exportlocal@*/ /*@null@*/ rpmps XrpmpsUnlink (/*@killref@*/ /*@returned@*/ rpmps ps, const char * msg, const char * fn, unsigned ln) /*@modifies ps @*/; #define rpmpsUnlink(_ps, _msg) XrpmpsUnlink(_ps, _msg, __FILE__, __LINE__) +/*@=exportlocal@*/ /** * Reference a problem set instance. @@ -144,9 +148,11 @@ rpmps rpmpsFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmps ps) * @param fp file handle * @param prob rpm problem */ +/*@-exportlocal@*/ void rpmProblemPrint(FILE *fp, rpmProblem prob) /*@globals fileSystem @*/ /*@modifies prob, *fp, fileSystem @*/; +/*@=exportlocal@*/ /** * Print problems to file handle. diff --git a/lib/rpmte.c b/lib/rpmte.c index 37968f633..dd4aa5a55 100644 --- a/lib/rpmte.c +++ b/lib/rpmte.c @@ -11,6 +11,8 @@ #include "rpmds.h" #include "rpmfi.h" + +#define _RPMTE_INTERNAL #include "rpmte.h" #include "rpmts.h" @@ -65,9 +67,7 @@ static void delTE(rpmte p) p->h = headerFree(p->h, "delTE"); - /*@-abstract@*/ memset(p, 0, sizeof(*p)); /* XXX trash and burn */ - /*@=abstract@*/ /*@-nullstate@*/ /* FIX: p->{NEVR,name} annotations */ return; /*@=nullstate@*/ @@ -102,13 +102,13 @@ static void addTE(rpmts ts, rpmte p, Header h, ep = NULL; xx = hge(h, RPMTAG_EPOCH, NULL, (void **)&ep, NULL); - /*@-branchstate@*/ +/*@-branchstate@*/ if (ep) { p->epoch = xmalloc(20); sprintf(p->epoch, "%d", *ep); } else p->epoch = NULL; - /*@=branchstate@*/ +/*@=branchstate@*/ p->this = rpmdsThis(h, RPMTAG_PROVIDENAME, RPMSENSE_EQUAL); p->provides = rpmdsNew(h, RPMTAG_PROVIDENAME, scareMem); @@ -153,7 +153,7 @@ rpmte rpmteFree(rpmte te) } rpmte rpmteNew(const rpmts ts, Header h, - rpmTransactionType type, + rpmElementType type, fnpyKey key, rpmRelocation * relocs, int dboffset, @@ -176,7 +176,7 @@ rpmte rpmteNew(const rpmts ts, Header h, return te; } -rpmTransactionType rpmteType(rpmte te) +rpmElementType rpmteType(rpmte te) { return (te != NULL ? te->type : -1); } @@ -279,14 +279,14 @@ rpmte rpmteParent(rpmte te) rpmte rpmteSetParent(rpmte te, rpmte pte) { rpmte opte = NULL; - /*@-branchstate@*/ +/*@-branchstate@*/ if (te != NULL) { opte = te->parent; /*@-assignexpose -temptrans@*/ te->parent = pte; /*@=assignexpose =temptrans@*/ } - /*@=branchstate@*/ +/*@=branchstate@*/ return opte; } @@ -442,8 +442,8 @@ rpmtei XrpmteiInit(rpmts ts, const char * fn, unsigned int ln) tei = xcalloc(1, sizeof(*tei)); tei->ts = rpmtsLink(ts, "rpmtei"); - tei->reverse = ((ts->transFlags & RPMTRANS_FLAG_REVERSE) ? 1 : 0); - tei->oc = (tei->reverse ? (ts->orderCount - 1) : 0); + tei->reverse = ((rpmtsFlags(ts) & RPMTRANS_FLAG_REVERSE) ? 1 : 0); + tei->oc = (tei->reverse ? (rpmtsNElements(ts) - 1) : 0); tei->ocsave = tei->oc; /*@-modfilesys@*/ if (_te_debug) @@ -458,37 +458,35 @@ fprintf(stderr, "*** tei %p ++ %s:%d\n", tei, fn, ln); * @return transaction element, NULL on termination */ static /*@dependent@*/ /*@null@*/ -rpmte teNextIterator(rpmtei tei) +rpmte rpmteiNextIterator(rpmtei tei) /*@modifies tei @*/ { rpmte te = NULL; int oc = -1; - if (tei == NULL || tei->ts == NULL || tei->ts->order == NULL) + if (tei == NULL || tei->ts == NULL || rpmtsNElements(tei->ts) <= 0) return te; if (tei->reverse) { if (tei->oc >= 0) oc = tei->oc--; } else { - if (tei->oc < tei->ts->orderCount) oc = tei->oc++; + if (tei->oc < rpmtsNElements(tei->ts)) oc = tei->oc++; } tei->ocsave = oc; - /*@-abstract @*/ +/*@-branchstate@*/ if (oc != -1) - te = tei->ts->order[oc]; - /*@=abstract @*/ - /*@-compdef -usereleased@*/ /* FIX: ts->order may be released */ + te = rpmtsElement(tei->ts, oc); +/*@=branchstate@*/ return te; - /*@=compdef =usereleased@*/ } -rpmte rpmteiNext(rpmtei tei, rpmTransactionType type) +rpmte rpmteiNext(rpmtei tei, rpmElementType type) { - rpmte p; + rpmte te; - while ((p = teNextIterator(tei)) != NULL) { - if (type == 0 || (p->type & type) != 0) + while ((te = rpmteiNextIterator(tei)) != NULL) { + if (type == 0 || (te->type & type) != 0) break; } - return p; + return te; } diff --git a/lib/rpmte.h b/lib/rpmte.h index 008e3cb45..7f0185ffa 100644 --- a/lib/rpmte.h +++ b/lib/rpmte.h @@ -1,21 +1,36 @@ #ifndef H_RPMTE #define H_RPMTE -/** \ingroup rpmdep rpmtrans +/** \ingroup rpmts rpmte * \file lib/rpmte.h * Structures used for an "rpmte" transaction element. */ +/** + * Transaction element ordering chain linkage. + */ typedef /*@abstract@*/ struct tsortInfo_s * tsortInfo; +/** + * Transaction element iterator. + */ typedef /*@abstract@*/ struct rpmtei_s * rpmtei; +/** \ingroup rpmte + * Transaction element type. + */ +typedef enum rpmElementType_e { + TR_ADDED = (1 << 0), /*!< Package will be installed. */ + TR_REMOVED = (1 << 1) /*!< Package will be removed. */ +} rpmElementType; + /*@-exportlocal@*/ /*@unchecked@*/ extern int _te_debug; /*@=exportlocal@*/ -/** \ingroup rpmdep +#if defined(_RPMTE_INTERNAL) +/** \ingroup rpmte * Dependncy ordering information. */ /*@-fielduse@*/ /* LCL: confused by union? */ @@ -36,18 +51,11 @@ struct tsortInfo_s { }; /*@=fielduse@*/ -/** \ingroup rpmdep - */ -typedef enum rpmTransactionType_e { - TR_ADDED = (1 << 0), /*!< Package will be installed. */ - TR_REMOVED = (1 << 1) /*!< Package will be removed. */ -} rpmTransactionType; - -/** \ingroup rpmdep +/** \ingroup rpmte * A single package instance to be installed/removed atomically. */ struct rpmte_s { - rpmTransactionType type; /*!< Package disposition (installed/removed). */ + rpmElementType type; /*!< Package disposition (installed/removed). */ /*@refcounted@*/ /*@null@*/ Header h; /*!< Package header. */ @@ -121,6 +129,8 @@ struct rpmtei_s { int oc; /*!< iterator index. */ }; +#endif /* _RPMTE_INTERNAL */ + #ifdef __cplusplus extern "C" { #endif @@ -146,7 +156,7 @@ rpmte rpmteFree(/*@only@*/ /*@null@*/ rpmte te) * @return new transaction element */ /*@only@*/ /*@null@*/ -rpmte rpmteNew(const rpmts ts, Header h, rpmTransactionType type, +rpmte rpmteNew(const rpmts ts, Header h, rpmElementType type, /*@exposed@*/ /*@dependent@*/ /*@null@*/ fnpyKey key, /*@null@*/ rpmRelocation * relocs, int dboffset, @@ -158,7 +168,7 @@ rpmte rpmteNew(const rpmts ts, Header h, rpmTransactionType type, * @param te transaction element * @return type */ -rpmTransactionType rpmteType(rpmte te) +rpmElementType rpmteType(rpmte te) /*@*/; /** @@ -488,7 +498,7 @@ rpmtei XrpmteiInit(rpmts ts, * @return next transaction element of type, NULL on termination */ /*@dependent@*/ /*@null@*/ -rpmte rpmteiNext(rpmtei tei, rpmTransactionType type) +rpmte rpmteiNext(rpmtei tei, rpmElementType type) /*@modifies tei @*/; #ifdef __cplusplus diff --git a/lib/rpmts.c b/lib/rpmts.c index a5def14ba..3f9873a16 100644 --- a/lib/rpmts.c +++ b/lib/rpmts.c @@ -14,7 +14,11 @@ #include "rpmds.h" #include "rpmfi.h" #include "rpmal.h" + +#define _RPMTE_INTERNAL /* XXX te->h */ #include "rpmte.h" + +#define _RPMTS_INTERNAL #include "rpmts.h" /* XXX FIXME: merge with existing (broken?) tests in system.h */ @@ -411,13 +415,9 @@ int rpmtsSetVerifySigFlags(rpmts ts, int vsflags) return ret; } -const char * rpmtsGetRootDir(rpmts ts) +const char * rpmtsRootDir(rpmts ts) { - const char * rootDir = NULL; - if (ts != NULL) { - rootDir = ts->rootDir; - } - return rootDir; + return (ts != NULL ? ts->rootDir : NULL); } void rpmtsSetRootDir(rpmts ts, const char * rootDir) @@ -548,7 +548,7 @@ int rpmtsInitDSI(const rpmts ts) int rc; int i; - if (ts->ignoreSet & RPMPROB_FILTER_DISKSPACE) + if (rpmtsFilterFlags(ts) & RPMPROB_FILTER_DISKSPACE) return 0; rc = rpmGetFilesystemList(&ts->filesystems, &ts->filesystemCount); @@ -702,18 +702,56 @@ void rpmtsCheckDSIProblems(const rpmts ts, const rpmte te) ps = rpmpsFree(ps); } -rpmtsFlags rpmtsGetFlags(rpmts ts) +void * rpmtsNotify(rpmts ts, rpmte te, + rpmCallbackType what, unsigned long amount, unsigned long total) { - rpmtsFlags otransFlags = 0; - if (ts != NULL) { - otransFlags = ts->transFlags; + void * ptr = NULL; + if (ts && ts->notify && te) { +assert(!(te->type == TR_ADDED && te->h == NULL)); + /*@-type@*/ /* FIX: cast? */ + /*@-noeffectuncon @*/ /* FIX: check rc */ + ptr = ts->notify(te->h, what, amount, total, + rpmteKey(te), ts->notifyData); + /*@=noeffectuncon @*/ + /*@=type@*/ } - return otransFlags; + return ptr; +} + +int rpmtsNElements(rpmts ts) +{ + int nelements = 0; + if (ts != NULL && ts->order != NULL) { + nelements = ts->orderCount; + } + return nelements; +} + +rpmte rpmtsElement(rpmts ts, int ix) +{ + rpmte te = NULL; + if (ts != NULL && ts->order != NULL) { + if (ix >= 0 && ix < ts->orderCount) + te = ts->order[ix]; + } + /*@-compdef@*/ + return te; + /*@=compdef@*/ +} + +rpmprobFilterFlags rpmtsFilterFlags(rpmts ts) +{ + return (ts != NULL ? ts->ignoreSet : 0); +} + +rpmtransFlags rpmtsFlags(rpmts ts) +{ + return (ts != NULL ? ts->transFlags : 0); } -rpmtsFlags rpmtsSetFlags(rpmts ts, rpmtsFlags transFlags) +rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags) { - rpmtsFlags otransFlags = 0; + rpmtransFlags otransFlags = 0; if (ts != NULL) { otransFlags = ts->transFlags; ts->transFlags = transFlags; diff --git a/lib/rpmts.h b/lib/rpmts.h index c07d606cb..57095efb3 100644 --- a/lib/rpmts.h +++ b/lib/rpmts.h @@ -14,6 +14,12 @@ extern int _ts_debug; /*@=exportlocal@*/ +#define _RPMTS_VSF_NODIGESTS (1 << 0) +#define _RPMTS_VSF_NOSIGNATURES (1 << 1) +#define _RPMTS_VSF_VERIFY_LEGACY (1 << 2) + +#if defined(_RPMTS_INTERNAL) + /*@unchecked@*/ /*@-exportlocal@*/ extern int _cacheDependsRC; @@ -55,7 +61,7 @@ typedef enum tsStage_e { * The set of packages to be installed/removed atomically. */ struct rpmts_s { - rpmtsFlags transFlags; /*!< Bit(s) to control operation. */ + rpmtransFlags transFlags; /*!< Bit(s) to control operation. */ tsmStage goal; /*!< Transaction goal (i.e. mode) */ /*@null@*/ @@ -122,9 +128,6 @@ struct rpmts_s { int nodigests; /*!< Verify digests? */ int nosignatures; /*!< Verify signatures? */ int vsflags; /*!< Signature verification flags. */ -#define _RPMTS_VSF_NODIGESTS (1 << 0) -#define _RPMTS_VSF_NOSIGNATURES (1 << 1) -#define _RPMTS_VSF_VERIFY_LEGACY (1 << 2) /*@observer@*/ /*@dependent@*/ /*@null@*/ const char * fn; /*!< Current package fn. */ @@ -144,6 +147,7 @@ struct rpmts_s { /*@refs@*/ int nrefs; /*!< Reference count. */ }; +#endif /* _RPMTS_INTERNAL */ #ifdef __cplusplus extern "C" { @@ -326,7 +330,7 @@ int rpmtsSetVerifySigFlags(rpmts ts, int vsflags) * @return transaction rootDir */ /*@observer@*/ /*@null@*/ -const char * rpmtsGetRootDir(rpmts ts) +const char * rpmtsRootDir(rpmts ts) /*@*/; /** \ingroup rpmts @@ -445,12 +449,51 @@ void rpmtsUpdateDSI(const rpmts ts, dev_t dev, void rpmtsCheckDSIProblems(const rpmts ts, const rpmte te) /*@modifies ts @*/; +/** + * Perform transaction progress notify callback. + * @param ts transaction set + * @param te current transaction element + * @param what type of call back + * @param amount current value + * @param total final value + * @return callback dependent pointer + */ +/*@null@*/ +void * rpmtsNotify(rpmts ts, rpmte te, + rpmCallbackType what, unsigned long amount, unsigned long total) + /*@*/; + +/** + * Return number of (ordered) transaction set elements. + * @param ts transaction set + * @return no. of transaction set elements + */ +int rpmtsNElements(rpmts ts) + /*@*/; + +/** + * Return (ordered) transaction set element. + * @param ts transaction set + * @param ix transaction element index + * @return transaction element + */ +rpmte rpmtsElement(rpmts ts, int ix) + /*@*/; + +/** \ingroup rpmts + * Get problem ignore bit mask, i.e. bits to filter encountered problems. + * @param ts transaction set + * @return ignore bit mask + */ +rpmprobFilterFlags rpmtsFilterFlags(rpmts ts) + /*@*/; + /** \ingroup rpmts * Get transaction flags, i.e. bits that control rpmtsRun(). * @param ts transaction set * @return transaction flags */ -rpmtsFlags rpmtsGetFlags(rpmts ts) +rpmtransFlags rpmtsFlags(rpmts ts) /*@*/; /** \ingroup rpmts @@ -459,7 +502,7 @@ rpmtsFlags rpmtsGetFlags(rpmts ts) * @param transFlags new transaction flags * @return previous transaction flags */ -rpmtsFlags rpmtsSetFlags(rpmts ts, rpmtsFlags transFlags) +rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags) /*@modifies ts @*/; /** \ingroup rpmts diff --git a/lib/signature.c b/lib/signature.c index fa9c896a6..df5d4fcbc 100644 --- a/lib/signature.c +++ b/lib/signature.c @@ -10,6 +10,7 @@ #include "rpmdb.h" #include "rpmps.h" +#define _RPMTS_INTERNAL #include "rpmts.h" #include "misc.h" /* XXX for dosetenv() and makeTempFile() */ diff --git a/lib/transaction.c b/lib/transaction.c index a176a5446..2f07a5b69 100644 --- a/lib/transaction.c +++ b/lib/transaction.c @@ -12,8 +12,14 @@ #include "rpmps.h" #include "rpmds.h" + +#define _RPMFI_INTERNAL #include "rpmfi.h" + +#define _RPMTE_INTERNAL #include "rpmte.h" + +#define _RPMTS_INTERNAL #include "rpmts.h" #include "rpmdb.h" @@ -92,7 +98,7 @@ static fileAction decideFileFate(const rpmts ts, * The file doesn't exist on the disk. Create it unless the new * package has marked it as missingok, or allfiles is requested. */ - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_ALLFILES) + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_ALLFILES) && (newFlags & RPMFILE_MISSINGOK)) { rpmMessage(RPMMESS_DEBUG, _("%s skipped due to missingok flag\n"), @@ -588,7 +594,7 @@ assert(otherFi->actions[otherFileNum] != FA_UNKNOWN); assert(otherFi != NULL); /* Mark added overlapped non-identical files as a conflict. */ - if ((ts->ignoreSet & RPMPROB_FILTER_REPLACENEWFILES) + if ((rpmtsFilterFlags(ts) & RPMPROB_FILTER_REPLACENEWFILES) && filecmp(otherFi, fi)) { rpmpsAppend(ps, RPMPROB_NEW_FILE_CONFLICT, @@ -709,7 +715,7 @@ static void skipFiles(const rpmts ts, rpmfi fi) /*@globals rpmGlobalMacroContext @*/ /*@modifies fi, rpmGlobalMacroContext @*/ { - int noDocs = (rpmtsGetFlags(ts) & RPMTRANS_FLAG_NODOCS); + int noDocs = (rpmtsFlags(ts) & RPMTRANS_FLAG_NODOCS); char ** netsharedPaths = NULL; const char ** languages; const char * dn, * bn; @@ -912,9 +918,9 @@ rpmfi rpmteiGetFi(const rpmtei tei) if (tei != NULL && tei->ocsave != -1) { /*@-type -abstract@*/ /* FIX: rpmte not opaque */ - rpmte te = tei->ts->order[tei->ocsave]; + rpmte te = rpmtsElement(tei->ts, tei->ocsave); /*@-assignexpose@*/ - if ((fi = te->fi) != NULL) + if (te != NULL && (fi = te->fi) != NULL) fi->te = te; /*@=assignexpose@*/ /*@=type =abstract@*/ @@ -945,14 +951,14 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) /* FIXME: what if the same package is included in ts twice? */ - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOSCRIPTS) - (void) rpmtsSetFlags(ts, (rpmtsGetFlags(ts) | _noTransScripts | _noTransTriggers)); - if (rpmtsGetFlags(ts) & RPMTRANS_FLAG_NOTRIGGERS) - (void) rpmtsSetFlags(ts, (rpmtsGetFlags(ts) | _noTransTriggers)); + if (rpmtsFlags(ts) & RPMTRANS_FLAG_NOSCRIPTS) + (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | _noTransScripts | _noTransTriggers)); + if (rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERS) + (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | _noTransTriggers)); /* XXX MULTILIB is broken, as packages can and do execute /sbin/ldconfig. */ - if (rpmtsGetFlags(ts) & (RPMTRANS_FLAG_JUSTDB | RPMTRANS_FLAG_MULTILIB)) - (void) rpmtsSetFlags(ts, (rpmtsGetFlags(ts) | _noTransScripts | _noTransTriggers)); + if (rpmtsFlags(ts) & (RPMTRANS_FLAG_JUSTDB | RPMTRANS_FLAG_MULTILIB)) + (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | _noTransScripts | _noTransTriggers)); ts->probs = rpmpsFree(ts->probs); ts->probs = rpmpsCreate(); @@ -994,21 +1000,21 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) continue; /* XXX can't happen */ fc = rpmfiFC(fi); - if (!(ts->ignoreSet & RPMPROB_FILTER_IGNOREARCH)) + if (!(rpmtsFilterFlags(ts) & RPMPROB_FILTER_IGNOREARCH)) if (!archOkay(rpmteA(p))) rpmpsAppend(ps, RPMPROB_BADARCH, rpmteNEVR(p), rpmteKey(p), rpmteA(p), NULL, NULL, 0); - if (!(ts->ignoreSet & RPMPROB_FILTER_IGNOREOS)) + if (!(rpmtsFilterFlags(ts) & RPMPROB_FILTER_IGNOREOS)) if (!osOkay(rpmteO(p))) rpmpsAppend(ps, RPMPROB_BADOS, rpmteNEVR(p), rpmteKey(p), rpmteO(p), NULL, NULL, 0); - if (!(ts->ignoreSet & RPMPROB_FILTER_OLDPACKAGE)) { + if (!(rpmtsFilterFlags(ts) & RPMPROB_FILTER_OLDPACKAGE)) { Header h; mi = rpmtsInitIterator(ts, RPMTAG_NAME, rpmteN(p), 0); while ((h = rpmdbNextIterator(mi)) != NULL) @@ -1017,7 +1023,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) } /* XXX multilib should not display "already installed" problems */ - if (!(ts->ignoreSet & RPMPROB_FILTER_REPLACEPKG) && !rpmteMultiLib(p)) { + if (!(rpmtsFilterFlags(ts) & RPMPROB_FILTER_REPLACEPKG) && !rpmteMultiLib(p)) { mi = rpmtsInitIterator(ts, RPMTAG_NAME, rpmteN(p), 0); xx = rpmdbSetIteratorRE(mi, RPMTAG_VERSION, RPMMIRE_DEFAULT, rpmteV(p)); @@ -1095,7 +1101,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) pi = rpmteiFree(pi); if (!rpmtsGetChrootDone(ts)) { - const char * rootDir = rpmtsGetRootDir(ts); + const char * rootDir = rpmtsRootDir(ts); xx = chdir("/"); /*@-superuser -noeffect @*/ if (rootDir != NULL) @@ -1232,7 +1238,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) switch (rpmteType(p)) { case TR_ADDED: xx = handleInstInstalledFiles(ts, p, fi, shared, nexti - i, - !(beingRemoved || (ts->ignoreSet & RPMPROB_FILTER_REPLACEOLDFILES))); + !(beingRemoved || (rpmtsFilterFlags(ts) & RPMPROB_FILTER_REPLACEOLDFILES))); /*@switchbreak@*/ break; case TR_REMOVED: if (!beingRemoved) @@ -1291,7 +1297,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) /* =============================================== * If unfiltered problems exist, free memory and return. */ - if ((rpmtsGetFlags(ts) & RPMTRANS_FLAG_BUILD_PROBS) + if ((rpmtsFlags(ts) & RPMTRANS_FLAG_BUILD_PROBS) || (ts->probs->numProblems && (okProbs != NULL || rpmpsTrim(ts->probs, okProbs))) ) @@ -1304,7 +1310,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) /* =============================================== * Save removed files before erasing. */ - if (rpmtsGetFlags(ts) & (RPMTRANS_FLAG_DIRSTASH | RPMTRANS_FLAG_REPACKAGE)) { + if (rpmtsFlags(ts) & (RPMTRANS_FLAG_DIRSTASH | RPMTRANS_FLAG_REPACKAGE)) { pi = rpmteiInit(ts); while ((p = rpmteiNext(pi, 0)) != NULL) { fi = rpmteiGetFi(pi); @@ -1312,7 +1318,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) case TR_ADDED: /*@switchbreak@*/ break; case TR_REMOVED: - if (!(rpmtsGetFlags(ts) & RPMTRANS_FLAG_REPACKAGE)) + if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_REPACKAGE)) /*@switchbreak@*/ break; psm->te = p; psm->fi = rpmfiLink(fi, "tsRepackage"); @@ -1334,7 +1340,6 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) /*@-branchstate@*/ /* FIX: fi reload needs work */ while ((p = rpmteiNext(pi, 0)) != NULL) { alKey pkgKey; - Header h; int gotfd; gotfd = 0; @@ -1349,7 +1354,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) pkgKey = rpmteAddedKey(p); rpmMessage(RPMMESS_DEBUG, "========== +++ %s\n", rpmteNEVR(p)); - h = NULL; + p->h = NULL; /*@-type@*/ /* FIX: rpmte not opaque */ { /*@-noeffectuncon@*/ /* FIX: notify annotations */ @@ -1360,7 +1365,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) rpmRC rpmrc; rpmrc = rpmReadPackageFile(ts, rpmteFd(p), - "rpmtsRun", &h); + "rpmtsRun", &p->h); if (!(rpmrc == RPMRC_OK || rpmrc == RPMRC_BADSIZE)) { /*@-noeffectuncon@*/ /* FIX: notify annotations */ @@ -1389,7 +1394,7 @@ fi->actions = NULL; fi->magic = RPMFIMAGIC; fi->te = p; fi->record = 0; - (void) rpmfiNew(ts, fi, h, RPMTAG_BASENAMES, 1); + (void) rpmfiNew(ts, fi, p->h, RPMTAG_BASENAMES, 1); psm->fi = rpmfiLink(fi, "tsInstall"); fi->fstates = _free(fi->fstates); fi->fstates = fstates; @@ -1399,9 +1404,9 @@ fi->actions = actions; } if (rpmteMultiLib(p)) - (void) rpmtsSetFlags(ts, (rpmtsGetFlags(ts) | RPMTRANS_FLAG_MULTILIB)); + (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | RPMTRANS_FLAG_MULTILIB)); else - (void) rpmtsSetFlags(ts, (rpmtsGetFlags(ts) & ~RPMTRANS_FLAG_MULTILIB)); + (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) & ~RPMTRANS_FLAG_MULTILIB)); if (psmStage(psm, PSM_PKGINSTALL)) { ourrc++; @@ -1413,7 +1418,7 @@ fi->actions = actions; lastKey = pkgKey; } - h = headerFree(h, "TR_ADDED h free"); + p->h = headerFree(p->h, "TR_ADDED h free"); if (gotfd) { /*@-noeffectuncon @*/ /* FIX: check rc */ diff --git a/lib/verify.c b/lib/verify.c index 1cced4f1d..92d2fb233 100644 --- a/lib/verify.c +++ b/lib/verify.c @@ -39,7 +39,7 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi, struct stat sb; /* Prepend the path to root (if specified). */ - rootDir = rpmtsGetRootDir(ts); + rootDir = rpmtsRootDir(ts); if (rootDir && *rootDir != '\0' && !(rootDir[0] == '/' && rootDir[1] == '\0')) { |