diff options
author | jbj <devnull@localhost> | 2001-03-02 19:47:45 +0000 |
---|---|---|
committer | jbj <devnull@localhost> | 2001-03-02 19:47:45 +0000 |
commit | 665c365a12630dc0e2a9a5f6f005bc8b84b6868b (patch) | |
tree | 26ec9996df0ebccef589d770850509349304dcbd | |
parent | e403840dbac865e660698f9528ded42adaa5e823 (diff) | |
download | rpm-665c365a12630dc0e2a9a5f6f005bc8b84b6868b.tar.gz rpm-665c365a12630dc0e2a9a5f6f005bc8b84b6868b.tar.bz2 rpm-665c365a12630dc0e2a9a5f6f005bc8b84b6868b.zip |
Add top level, external enties to psmStage().
CVS patchset: 4596
CVS date: 2001/03/02 19:47:45
-rw-r--r-- | lib/psm.c | 260 | ||||
-rw-r--r-- | lib/psm.h | 23 | ||||
-rw-r--r-- | lib/transaction.c | 6 | ||||
-rw-r--r-- | po/rpm.pot | 16 |
4 files changed, 125 insertions, 180 deletions
@@ -1270,11 +1270,53 @@ static int runImmedTriggers(PSM_t psm) return rc; } +/*@observer@*/ static const char *const pkgStageString(pkgStage a) { + switch(a) { + case PSM_UNKNOWN: return "unknown"; + + case PSM_PKGINSTALL: return " install"; + case PSM_PKGERASE: return " erase"; + case PSM_PKGCOMMIT: return " commit"; + case PSM_PKGSAVE: return "repackage"; + + case PSM_INIT: return "init"; + case PSM_PRE: return "pre"; + case PSM_PROCESS: return "process"; + case PSM_POST: return "post"; + case PSM_UNDO: return "undo"; + case PSM_FINI: return "fini"; + + case PSM_CREATE: return "create"; + case PSM_NOTIFY: return "notify"; + case PSM_DESTROY: return "destroy"; + case PSM_COMMIT: return "commit"; + + case PSM_CHROOT_IN: return "chrootin"; + case PSM_CHROOT_OUT: return "chrootout"; + case PSM_SCRIPT: return "script"; + case PSM_TRIGGERS: return "triggers"; + case PSM_IMMED_TRIGGERS: return "immedtriggers"; + + case PSM_RPMIO_FLAGS: return "rpmioflags"; + + case PSM_RPMDB_LOAD: return "rpmdbload"; + case PSM_RPMDB_ADD: return "rpmdbadd"; + case PSM_RPMDB_REMOVE: return "rpmdbremove"; + + default: return "???"; + } + /*@noteached@*/ +} + +/** + * @todo Packages w/o files never get a callback, hence don't get displayed + * on install with -v. + */ int psmStage(PSM_t psm, pkgStage stage) { const rpmTransactionSet ts = psm->ts; TFI_t fi = psm->fi; - HGE_t hge = (HGE_t)fi->hge; + HGE_t hge = fi->hge; HFD_t hfd = fi->hfd; rpmRC rc = psm->rc; int saveerrno; @@ -1286,6 +1328,7 @@ int psmStage(PSM_t psm, pkgStage stage) rpmMessage(RPMMESS_DEBUG, _("%s: %s-%s-%s has %d files, test = %d\n"), psm->stepName, fi->name, fi->version, fi->release, fi->fc, (ts->transFlags & RPMTRANS_FLAG_TEST)); + if (psm->goal == PSM_PKGINSTALL) { /* * When we run scripts, we pass an argument which is the number of @@ -1298,6 +1341,7 @@ int psmStage(PSM_t psm, pkgStage stage) break; } +assert(psm->mi == NULL); psm->mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, fi->name, 0); rpmdbSetIteratorVersion(psm->mi, fi->version); rpmdbSetIteratorRelease(psm->mi, fi->release); @@ -1310,6 +1354,43 @@ int psmStage(PSM_t psm, pkgStage stage) rpmdbFreeIterator(psm->mi); psm->mi = NULL; rc = RPMRC_OK; + + if (fi->fc > 0 && fi->fstates == NULL) { + fi->fstates = xmalloc(sizeof(*fi->fstates) * fi->fc); + memset(fi->fstates, RPMFILE_STATE_NORMAL, fi->fc); + } + + if (fi->fc <= 0) break; + if (ts->transFlags & RPMTRANS_FLAG_JUSTDB) break; + + /* + * Old format relocateable packages need the entire default + * prefix stripped to form the cpio list, while all other packages + * need the leading / stripped. + */ + { const char * p; + rc = hge(fi->h, RPMTAG_DEFAULTPREFIX, NULL, (void **) &p, NULL); + fi->striplen = (rc ? strlen(p) + 1 : 1); + } + fi->mapflags = + CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID; + + if (headerIsEntry(fi->h, RPMTAG_ORIGBASENAMES)) + buildOrigFileList(fi->h, &fi->apath, NULL); + else + rpmBuildFileList(fi->h, &fi->apath, NULL); + + if (fi->fuser == NULL) + hge(fi->h, RPMTAG_FILEUSERNAME, NULL, + (void **) &fi->fuser, NULL); + if (fi->fgroup == NULL) + hge(fi->h, RPMTAG_FILEGROUPNAME, NULL, + (void **) &fi->fgroup, NULL); + if (fi->fuids == NULL) + fi->fuids = xcalloc(sizeof(*fi->fuids), fi->fc); + if (fi->fgids == NULL) + fi->fgids = xcalloc(sizeof(*fi->fgids), fi->fc); + rc = RPMRC_OK; } if (psm->goal == PSM_PKGERASE) { /* @@ -1333,6 +1414,8 @@ int psmStage(PSM_t psm, pkgStage stage) } break; case PSM_PRE: + if (ts->transFlags & RPMTRANS_FLAG_TEST) break; + if (psm->goal == PSM_PKGINSTALL) { psm->scriptTag = RPMTAG_PREIN; psm->progTag = RPMTAG_PREINPROG; @@ -1449,6 +1532,7 @@ int psmStage(PSM_t psm, pkgStage stage) } break; case PSM_PROCESS: + if (ts->transFlags & RPMTRANS_FLAG_TEST) break; if (psm->goal == PSM_PKGINSTALL) { struct availablePackage * alp = fi->ap; @@ -1533,6 +1617,7 @@ int psmStage(PSM_t psm, pkgStage stage) } break; case PSM_POST: + if (ts->transFlags & RPMTRANS_FLAG_TEST) break; if (psm->goal == PSM_PKGINSTALL) { int_32 installTime = time(NULL); @@ -1635,16 +1720,31 @@ int psmStage(PSM_t psm, pkgStage stage) psm->pkgURL = _free(psm->pkgURL); psm->rpmio_flags = _free(psm->rpmio_flags); psm->failedFile = _free(psm->failedFile); + + fi->fgids = _free(fi->fgids); + fi->fuids = _free(fi->fuids); + fi->fgroup = hfd(fi->fgroup, -1); + fi->fuser = hfd(fi->fuser, -1); + fi->apath = _free(fi->apath); + fi->fstates = _free(fi->fstates); + break; case PSM_PKGINSTALL: - break; case PSM_PKGERASE: + case PSM_PKGSAVE: + psm->goal = stage; + psm->rc = RPMRC_OK; + psm->stepName = pkgStageString(stage); + + rc = psmStage(psm, PSM_INIT); + if (!rc) rc = psmStage(psm, PSM_PRE); + if (!rc) rc = psmStage(psm, PSM_PROCESS); + if (!rc) rc = psmStage(psm, PSM_POST); + (void) psmStage(psm, PSM_FINI); break; case PSM_PKGCOMMIT: break; - case PSM_PKGSAVE: - break; case PSM_CREATE: break; @@ -1692,6 +1792,7 @@ int psmStage(PSM_t psm, pkgStage stage) } break; case PSM_SCRIPT: + if (ts->transFlags & RPMTRANS_FLAG_NOSCRIPTS) break; rpmMessage(RPMMESS_DEBUG, _("%s: running %s script(s) (if any)\n"), psm->stepName, tag2sln(psm->scriptTag)); rc = runInstScript(psm); @@ -1723,17 +1824,17 @@ int psmStage(PSM_t psm, pkgStage stage) } break; case PSM_RPMDB_LOAD: - { rpmdbMatchIterator mi = NULL; - - mi = rpmdbInitIterator(ts->rpmdb, RPMDBI_PACKAGES, +assert(psm->mi == NULL); + psm->mi = rpmdbInitIterator(ts->rpmdb, RPMDBI_PACKAGES, &fi->record, sizeof(fi->record)); - fi->h = rpmdbNextIterator(mi); + fi->h = rpmdbNextIterator(psm->mi); if (fi->h) fi->h = headerLink(fi->h); - rpmdbFreeIterator(mi); - rc = (fi->h ? 0 : 2); - } break; + rpmdbFreeIterator(psm->mi); + psm->mi = NULL; + rc = (fi->h ? RPMRC_OK : RPMRC_FAIL); + break; case PSM_RPMDB_ADD: if (ts->transFlags & RPMTRANS_FLAG_TEST) break; rc = rpmdbAdd(ts->rpmdb, ts->id, fi->h); @@ -1749,140 +1850,3 @@ int psmStage(PSM_t psm, pkgStage stage) return rc; } - -/** - * @todo Packages w/o files never get a callback, hence don't get displayed - * on install with -v. - */ -int installBinaryPackage(PSM_t psm) -{ - const rpmTransactionSet ts = psm->ts; - TFI_t fi = psm->fi; - HGE_t hge = (HGE_t)fi->hge; - int ec = 2; /* assume error return */ - rpmRC rc = RPMRC_OK; - -psm->goal = PSM_PKGINSTALL; -psm->stepName = " install"; - - rc = psmStage(psm, PSM_INIT); - if (rc) - goto exit; - - if (fi->fc > 0 && fi->fstates == NULL) { - fi->fstates = xmalloc(sizeof(*fi->fstates) * fi->fc); - memset(fi->fstates, RPMFILE_STATE_NORMAL, fi->fc); - } - - if (fi->fc > 0 && !(ts->transFlags & RPMTRANS_FLAG_JUSTDB)) { - const char * p; - - /* - * Old format relocateable packages need the entire default - * prefix stripped to form the cpio list, while all other packages - * need the leading / stripped. - */ - rc = hge(fi->h, RPMTAG_DEFAULTPREFIX, NULL, (void **) &p, NULL); - fi->striplen = (rc ? strlen(p) + 1 : 1); - fi->mapflags = - CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID; - - if (headerIsEntry(fi->h, RPMTAG_ORIGBASENAMES)) - buildOrigFileList(fi->h, &fi->apath, NULL); - else - rpmBuildFileList(fi->h, &fi->apath, NULL); - - if (fi->fuser == NULL) - hge(fi->h, RPMTAG_FILEUSERNAME, NULL, (void **) &fi->fuser, NULL); - if (fi->fgroup == NULL) - hge(fi->h, RPMTAG_FILEGROUPNAME, NULL, (void **) &fi->fgroup, NULL); - if (fi->fuids == NULL) - fi->fuids = xcalloc(sizeof(*fi->fuids), fi->fc); - if (fi->fgids == NULL) - fi->fgids = xcalloc(sizeof(*fi->fgids), fi->fc); - - } - - if (ts->transFlags & RPMTRANS_FLAG_TEST) { - ec = 0; - goto exit; - } - - rc = psmStage(psm, PSM_PRE); - if (rc) - goto exit; - - rc = psmStage(psm, PSM_PROCESS); - if (rc) - goto exit; - - rc = psmStage(psm, PSM_POST); - if (rc) - goto exit; - - ec = 0; - -exit: - (void) psmStage(psm, PSM_FINI); - - return ec; -} - -int removeBinaryPackage(PSM_t psm) -{ - rpmRC rc = RPMRC_OK; - -psm->goal = PSM_PKGERASE; -psm->stepName = " erase"; - - rc = psmStage(psm, PSM_INIT); - if (rc) - goto exit; - - rc = psmStage(psm, PSM_PRE); - if (rc) - goto exit; - - rc = psmStage(psm, PSM_PROCESS); - /* XXX WTFO? erase failures are not cause for stopping. */ - - rc = psmStage(psm, PSM_POST); - if (rc) - goto exit; - -exit: - (void) psmStage(psm, PSM_FINI); - - return rc; -} - -int repackage(PSM_t psm) -{ - rpmRC rc = RPMRC_OK; - -psm->goal = PSM_PKGSAVE; -psm->stepName = "repackage"; - - rc = psmStage(psm, PSM_INIT); - if (rc) - goto exit; - - /* Write the lead, signature, and header into the package. */ - rc = psmStage(psm, PSM_PRE); - if (rc) - goto exit; - - /* Write the payload into the package. */ - rc = psmStage(psm, PSM_PROCESS); - if (rc) - goto exit; - - rc = psmStage(psm, PSM_POST); - if (rc) - goto exit; - -exit: - (void) psmStage(psm, PSM_FINI); - - return rc; -} @@ -191,30 +191,11 @@ void freeFi(TFI_t fi) /*@observer@*/ const char *const fileActionString(fileAction a); /** - * Install binary package (from transaction set). - * @param psm package state machine data - * @return 0 on success, 1 on bad magic, 2 on error - */ -int installBinaryPackage(PSM_t psm) - /*@modifies psm @*/; - -/** - * Erase binary package (from transaction set). + * Package state machine driver. * @param psm package state machine data + * @param stage next stage * @return 0 on success */ -int removeBinaryPackage(PSM_t psm) - /*@modifies psm @*/; - -/** - * @param psm package state machine data - * @return 0 on success - */ -int repackage(PSM_t psm) - /*@modifies psm @*/; - -/** - */ int psmStage(PSM_t psm, pkgStage stage) /*@modifies psm @*/; diff --git a/lib/transaction.c b/lib/transaction.c index 11c877a6c..3b3500490 100644 --- a/lib/transaction.c +++ b/lib/transaction.c @@ -1800,7 +1800,7 @@ int rpmRunTransactions( rpmTransactionSet ts, break; case TR_REMOVED: if (ts->transFlags & RPMTRANS_FLAG_REPACKAGE) - repackage(psm); + (void) psmStage(psm, PSM_PKGSAVE); break; } } @@ -1860,7 +1860,7 @@ assert(alp == fi->ap); ts->transFlags |= RPMTRANS_FLAG_MULTILIB; if (fi->ap == NULL) fi->ap = alp; /* XXX WTFO? */ - if (installBinaryPackage(psm)) { + if (psmStage(psm, PSM_PKGINSTALL)) { ourrc++; lastFailed = i; } @@ -1889,7 +1889,7 @@ if (fi->ap == NULL) fi->ap = alp; /* XXX WTFO? */ if (ts->order[oc].u.removed.dependsOnIndex == lastFailed) break; - if (removeBinaryPackage(psm)) + if (psmStage(psm, PSM_PKGERASE)) ourrc++; break; diff --git a/po/rpm.pot b/po/rpm.pot index c849abef1..5e1a92112 100644 --- a/po/rpm.pot +++ b/po/rpm.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2001-03-02 12:08-0500\n" +"POT-Creation-Date: 2001-03-02 14:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -1808,7 +1808,7 @@ msgstr "" msgid "Could not open %s: %s\n" msgstr "" -#: build/pack.c:484 lib/psm.c:1429 +#: build/pack.c:484 lib/psm.c:1512 #, c-format msgid "Unable to write package: %s\n" msgstr "" @@ -1838,7 +1838,7 @@ msgstr "" msgid "Unable to write payload to %s: %s\n" msgstr "" -#: build/pack.c:566 lib/psm.c:1621 +#: build/pack.c:566 lib/psm.c:1706 #, c-format msgid "Wrote: %s\n" msgstr "" @@ -2921,26 +2921,26 @@ msgstr "" msgid "execution of %s scriptlet from %s-%s-%s failed, exit status %d\n" msgstr "" -#: lib/psm.c:1286 +#: lib/psm.c:1328 #, c-format msgid "%s: %s-%s-%s has %d files, test = %d\n" msgstr "" -#: lib/psm.c:1342 +#: lib/psm.c:1425 #, c-format msgid "%s: %s scriptlet failed (%d), skipping %s-%s-%s\n" msgstr "" -#: lib/psm.c:1479 +#: lib/psm.c:1563 #, c-format msgid "unpacking of archive failed%s%s: %s\n" msgstr "" -#: lib/psm.c:1480 +#: lib/psm.c:1564 msgid " on file " msgstr "" -#: lib/psm.c:1695 +#: lib/psm.c:1796 #, c-format msgid "%s: running %s script(s) (if any)\n" msgstr "" |