return te;
}
+static Header rpmteDBHeader(rpmts ts, unsigned int rec)
+{
+ Header h = NULL;
+ rpmdbMatchIterator mi;
+
+ mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, &rec, sizeof(rec));
+ /* iterator returns weak refs, grab hold of header */
+ if ((h = rpmdbNextIterator(mi)))
+ h = headerLink(h);
+ mi = rpmdbFreeIterator(mi);
+ return h;
+}
+
+static Header rpmteFDHeader(rpmts ts, rpmte te)
+{
+ Header h = NULL;
+ te->fd = rpmtsNotify(ts, te, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
+ if (te->fd != NULL) {
+ rpmVSFlags ovsflags;
+ rpmRC pkgrc;
+
+ ovsflags = rpmtsSetVSFlags(ts, rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD);
+ pkgrc = rpmReadPackageFile(ts, rpmteFd(te), rpmteNEVRA(te), &h);
+ rpmtsSetVSFlags(ts, ovsflags);
+ switch (pkgrc) {
+ default:
+ rpmteClose(te, ts);
+ break;
+ case RPMRC_NOTTRUSTED:
+ case RPMRC_NOKEY:
+ case RPMRC_OK:
+ break;
+ }
+ }
+ return h;
+}
+
int rpmteOpen(rpmte te, rpmts ts)
{
Header h = NULL;
+ unsigned int instance;
if (te == NULL || ts == NULL)
goto exit;
+ instance = rpmteDBInstance(te);
rpmteSetHeader(te, NULL);
- switch (te->type) {
+
+ switch (rpmteType(te)) {
case TR_ADDED:
- te->h = NULL;
- te->fd = rpmtsNotify(ts, te, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
- if (te->fd != NULL) {
- rpmVSFlags ovsflags;
- rpmRC pkgrc;
-
- ovsflags = rpmtsSetVSFlags(ts, rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD);
- pkgrc = rpmReadPackageFile(ts, rpmteFd(te), rpmteNEVRA(te), &h);
- rpmtsSetVSFlags(ts, ovsflags);
- switch (pkgrc) {
- default:
- rpmteClose(te, ts);
- break;
- case RPMRC_NOTTRUSTED:
- case RPMRC_NOKEY:
- case RPMRC_OK:
- break;
- }
- }
+ h = instance ? rpmteDBHeader(ts, instance) : rpmteFDHeader(ts, te);
break;
- case TR_REMOVED: {
- unsigned int rec = rpmteDBInstance(te);
- rpmdbMatchIterator mi;
-
- /* eventually we'll want notifications for erase open too */
- mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, &rec, sizeof(rec));
- /* iterator returns weak refs, grab hold of header */
- if ((h = rpmdbNextIterator(mi)))
- h = headerLink(h);
- mi = rpmdbFreeIterator(mi);
- }
+ case TR_REMOVED:
+ h = rpmteDBHeader(ts, instance);
break;
}
if (h != NULL) {
switch (te->type) {
case TR_ADDED:
- rpmtsNotify(ts, te, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
- te->fd = NULL;
+ if (te->fd) {
+ rpmtsNotify(ts, te, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
+ te->fd = NULL;
+ }
break;
case TR_REMOVED:
/* eventually we'll want notifications for erase open too */