21 #define _RPMTE_INTERNAL
22 #define _RPMTS_INTERNAL
27 #define _RPMROLLBACK_INTERNAL
28 #include <rpmrollback.h>
40 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
42 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
43 #define VSF_SET(_vsflags, _FLAG) \
44 (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG))
45 #define VSF_CLR(_vsflags, _FLAG) \
46 (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG))
53 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
55 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
56 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG)
57 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG)
66 static int IDTintcmp(
const void * a,
const void * b)
70 return ( reverse * (((IDT)a)->val.u32 - ((IDT)b)->val.u32) );
79 for (i = 0; i < idtx->nidt; i++) {
80 IDT idt = idtx->idt + i;
83 idt->key =
_free(idt->key);
85 idtx->idt =
_free(idtx->idt);
93 IDTX idtx = (IDTX)
xcalloc(1,
sizeof(*idtx));
95 idtx->size = (int)
sizeof(*((IDT)0));
101 if (need < 0)
return NULL;
104 if (need == 0)
return idtx;
106 if ((idtx->nidt + need) > idtx->alloced) {
108 idtx->alloced += idtx->delta;
111 idtx->idt = (IDT)
xrealloc(idtx->idt, (idtx->alloced * idtx->size));
118 if (idtx != NULL && idtx->idt != NULL && idtx->nidt > 0)
119 qsort(idtx->idt, idtx->nidt, idtx->size,
IDTintcmp);
139 if (!xx || he->
p.
ui32p == NULL)
144 if (tid == 0 || tid == 0xffffffff)
152 if (idtx == NULL || idtx->idt == NULL)
157 idt = idtx->idt + idtx->nidt;
179 const char ** av = NULL;
192 for (i = 0; i < ac; i++) {
195 fd =
Fopen(av[i],
"r.fdio");
196 if (fd == NULL ||
Ferror(fd)) {
199 if (fd != NULL) (void)
Fclose(fd);
221 assert(origin != NULL);
222 assert(!strcmp(av[i], origin));
226 if (!xx || he->
p.
ui32p == NULL)
236 if (idtx == NULL || idtx->idt == NULL)
240 idt = idtx->idt + idtx->nidt;
254 for (i = 0; i < ac; i++)
255 av[i] =
_free(av[i]);
256 av =
_free(av); ac = 0;
277 if (AV != NULL && AC > 0 && B == NULL) {
278 if (!strcmp(lname,
"NEVRA")) {
280 for (i = 0; i < AC && (A = AV[i]) != NULL; i++) {
292 if (AV != NULL && B != NULL)
293 for (i = 0; i < AC && (A = AV[i]) != NULL; i++) {
294 if (*A && *B && !strcmp(A, B))
327 while (ip != NULL && ip->val.u32 == thistid) {
333 const char ** flinkPkgid = NULL;
334 const char ** flinkHdrid = NULL;
335 const char ** flinkNEVRA = NULL;
341 flinkPkgid = he->
p.
argv;
345 if (pn == 1 && flinkPkgid[0] != NULL && !strcmp(flinkPkgid[0],
RPMTE_CHAIN_END)) {
346 flinkPkgid =
_free(flinkPkgid);
352 flinkHdrid = he->
p.
argv;
356 flinkNEVRA = he->
p.
argv;
368 bingo =
cmpArgvStr(ts,
"NEVRA", flinkNEVRA, nn, (p ? p->NEVRA : NULL));
370 bingo =
cmpArgvStr(ts,
"Hdrid", flinkHdrid, hn, (p ? p->hdrid : NULL));
373 bingo =
cmpArgvStr(ts,
"Pkgid", flinkPkgid, pn, (p ? p->pkgid : NULL));
375 flinkPkgid =
_free(flinkPkgid);
376 flinkHdrid =
_free(flinkHdrid);
377 flinkNEVRA =
_free(flinkNEVRA);
397 rpmte q = ts->teErase;
424 unsigned thistid = 0xffffffff;
437 unsigned int _unsafe_rollbacks = 0;
442 if (argv != NULL && *argv != NULL) {
451 #if defined(SUPPORT_NOSIGNATURES)
453 VSF_SET(vsflags, NOSHA1HEADER);
488 {
const char * globstr =
rpmExpand(
"%{_repackage_dir}/*/*.rpm", NULL);
489 if (globstr == NULL || *globstr ==
'%') {
490 globstr =
_free(globstr);
503 globstr =
_free(globstr);
524 if (ip != NULL && ip->val.u32 > thistid)
525 thistid = ip->val.u32;
526 if (rp != NULL && rp->val.u32 > thistid)
527 thistid = rp->val.u32;
530 if (thistid == 0 || thistid < ia->rbtid)
534 if (_unsafe_rollbacks && thistid <= _unsafe_rollbacks)
545 if (thistid == *excludedTID) {
546 time_t ttid = (time_t)thistid;
548 _(
"Excluding TID from rollback: %-24.24s (0x%08x)\n"),
549 ctime(&ttid), thistid);
556 while (rp != NULL && rp->val.u32 == thistid) {
565 while (ip != NULL && ip->val.u32 == thistid) {
584 while (rp != NULL && rp->val.u32 == thistid) {
587 (rp->key ? rp->key :
"???"));
603 rc =
findErases(ts, ts->teInstall, thistid, ip, niids);
622 rc =
findErases(ts, NULL, thistid, ip, niids);
627 while (ip != NULL && ip->val.u32 == thistid) {
635 if (_unsafe_rollbacks != 0)
658 tid = (time_t)thistid;
660 _(
"Rollback packages (+%d/-%d) to %-24.24s (0x%08x):\n"),
661 numAdded, numRemoved, ctime(&tid), thistid);
675 xx = rpmtsPrint(ts, stdout);
688 for (i = 0; i < rtids->nidt; i++) {
689 IDT rrp = rtids->idt + i;
690 if (rrp->val.u32 != thistid)
694 (void) unlink(rrp->key);
711 while (ip != NULL && ip->val.u32 == thistid) {