- fix: mark rpmdb files with %config to prevent erasure on downgrade.
CVS patchset: 4891
CVS date: 2001/06/20 06:29:20
- preliminary abstraction to support per-header methods.
- finalize per-header methods, accessing headerFoo through vector.
- make package ordering loop messages debug, not warning.
+ - remove {ia64,sparc}-linux.{prov,req}, changes merged into linux.*.
+ - fix: partial sets of hardlinked files forbidden in payload.
+ - fix: mark rpmdb files with %config to prevent erasure on downgrade.
4.0 -> 4.0.[12]
- add doxygen and lclint annotations most everywhere.
const char *fmode = rpmExpand(fmodeMacro, NULL);
const char *failedFile = NULL;
FD_t cfd;
- int rc;
+ int rc, ec;
if (!(fmode && fmode[0] == 'w'))
fmode = xstrdup("w9.gzdio");
rc = fsmSetup(fi->fsm, FSM_PKGBUILD, ts, fi, cfd,
&csa->cpioArchiveSize, &failedFile);
(void) Fclose(cfd);
- (void) fsmTeardown(fi->fsm);
+ ec = fsmTeardown(fi->fsm);
+ if (!rc) rc = ec;
if (rc) {
- rpmError(RPMERR_CPIO, _("create archive failed on file %s: %s\n"),
+ if (failedFile)
+ rpmError(RPMERR_CPIO, _("create archive failed on file %s: %s\n"),
failedFile, cpioStrerror(rc));
+ else
+ rpmError(RPMERR_CPIO, _("create archive failed: %s\n"),
+ cpioStrerror(rc));
rc = 1;
}
case CPIOERR_HDR_SIZE: s = _("Header size too big"); break;
case CPIOERR_UNKNOWN_FILETYPE: s = _("Unknown file type"); break;
- case CPIOERR_MISSING_HARDLINK: s = _("Missing hard link"); break;
+ case CPIOERR_MISSING_HARDLINK: s = _("Missing hard link(s)"); break;
case CPIOERR_MD5SUM_MISMATCH: s = _("MD5 sum mismatch"); break;
case CPIOERR_INTERNAL: s = _("Internal error"); break;
}
int _fsm_debug = 0;
+static int all_hardlinks_in_package = 1;
+
/* XXX Failure to remove is not (yet) cause for failure. */
/*@-exportlocal -exportheadervar@*/
int strict_erasures = 0;
/*@=observertrans =dependenttrans@*/
if (fsm->goal == FSM_PKGINSTALL) fsm->li->linksLeft++;
-#if 0
-fprintf(stderr, "*** %p link[%d:%d] %d filex %d %s\n", fsm->li, fsm->li->linksLeft, st->st_nlink, (int)st->st_size, fsm->li->filex[fsm->li->linksLeft], fsm->li->files[fsm->li->linksLeft]);
-#endif
-
if (fsm->goal == FSM_PKGBUILD)
return (fsm->li->linksLeft > 0);
/*@loopbreak@*/ break;
}
+ /* Flush partial sets of hard linked files. */
+ if (!all_hardlinks_in_package) {
+ while ((fsm->li = fsm->links) != NULL) {
+ fsm->links = fsm->li->next;
+ fsm->li->next = NULL;
+ if (!rc)
+ rc = writeLinkedFile(fsm);
+ fsm->li = freeHardLink(fsm->li);
+ }
+ }
+
if (!rc)
rc = fsmStage(fsm, FSM_TRAILER);
+
break;
case FSM_CREATE:
{ rpmTransactionSet ts = fsmGetTs(fsm);
case FSM_DESTROY:
fsm->path = _free(fsm->path);
- /* Create any remaining links (if no error), and clean up. */
+ /* Check for hard links missing from payload. */
while ((fsm->li = fsm->links) != NULL) {
fsm->links = fsm->li->next;
fsm->li->next = NULL;
- if (fsm->goal == FSM_PKGINSTALL && fsm->commit && fsm->li->linksLeft)
+ if (fsm->goal == FSM_PKGINSTALL &&
+ fsm->commit && fsm->li->linksLeft)
{
for (i = 0 ; i < fsm->li->linksLeft; i++) {
if (fsm->li->filex[i] < 0) continue;
/*@loopbreak@*/ break;
}
}
- if (fsm->goal == FSM_PKGBUILD) {
+ if (fsm->goal == FSM_PKGBUILD && all_hardlinks_in_package) {
rc = CPIOERR_MISSING_HARDLINK;
- }
+ }
fsm->li = freeHardLink(fsm->li);
}
fsm->ldn = _free(fsm->ldn);
%package python
Summary: Python bindings for apps which will manipulate RPM packages.
Group: Development/Libraries
-BuildRequires: popt >= 1.5
Requires: rpm = %{version}
-Requires: popt >= 1.5
Requires: python >= 1.5.2
%description python
%endif
%define rpmattr %attr(0755, @RPMUSER@, @RPMGROUP@)
-%define rpmdbattr %rpmattr %ghost %config(missingok)
%files
%defattr(-,root,root)
%dir /etc/rpm
%config(noreplace,missingok) /etc/rpm/macros.db1
%attr(0755, @RPMUSER@, @RPMGROUP@) %dir /var/lib/rpm
+
+%define rpmdbattr %attr(0644, @RPMUSER@, @RPMGROUP@) %verify(not md5 size mtime) %ghost %config(missingok)
%rpmdbattr /var/lib/rpm/Basenames
%rpmdbattr /var/lib/rpm/Conflictname
%rpmdbattr /var/lib/rpm/__db.001
%rpmdbattr /var/lib/rpm/Requirename
%rpmdbattr /var/lib/rpm/Requireversion
%rpmdbattr /var/lib/rpm/Triggername
+
%endif
%rpmattr %{__prefix}/bin/rpm2cpio