summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjbj <devnull@localhost>2001-03-02 19:47:45 +0000
committerjbj <devnull@localhost>2001-03-02 19:47:45 +0000
commit665c365a12630dc0e2a9a5f6f005bc8b84b6868b (patch)
tree26ec9996df0ebccef589d770850509349304dcbd
parente403840dbac865e660698f9528ded42adaa5e823 (diff)
downloadrpm-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.c260
-rw-r--r--lib/psm.h23
-rw-r--r--lib/transaction.c6
-rw-r--r--po/rpm.pot16
4 files changed, 125 insertions, 180 deletions
diff --git a/lib/psm.c b/lib/psm.c
index 7cef95697..91fa6a805 100644
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -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;
-}
diff --git a/lib/psm.h b/lib/psm.h
index d56b80f9b..e0c17350c 100644
--- a/lib/psm.h
+++ b/lib/psm.h
@@ -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 ""