21 #define _RPMTE_INTERNAL
22 #define _RPMTS_INTERNAL
27 #define _RPMROLLBACK_INTERNAL
28 #include <rpmrollback.h>
43 static int IDTintcmp(
const void * a,
const void * b)
47 return (
reverse * (((IDT)a)->val.u32 - ((IDT)b)->val.u32) );
56 for (i = 0; i < idtx->nidt; i++) {
57 IDT idt = idtx->idt + i;
60 idt->key =
_free(idt->key);
62 idtx->idt =
_free(idtx->idt);
70 IDTX idtx =
xcalloc(1,
sizeof(*idtx));
72 idtx->size = (int)
sizeof(*((IDT)0));
78 if (need < 0)
return NULL;
81 if (need == 0)
return idtx;
83 if ((idtx->nidt + need) > idtx->alloced) {
85 idtx->alloced += idtx->delta;
88 idtx->idt =
xrealloc(idtx->idt, (idtx->alloced * idtx->size) );
95 if (idtx != NULL && idtx->idt != NULL && idtx->nidt > 0)
96 qsort(idtx->idt, idtx->nidt, idtx->size,
IDTintcmp);
102 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
116 if (!xx || he->
p.
ui32p == NULL)
121 if (tid == 0 || tid == 0xffffffff)
129 if (idtx == NULL || idtx->idt == NULL)
134 idt = idtx->idt + idtx->nidt;
151 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
156 const char ** av = NULL;
169 for (i = 0; i < ac; i++) {
172 fd =
Fopen(av[i],
"r.fdio");
173 if (fd == NULL ||
Ferror(fd)) {
176 if (fd != NULL) (void)
Fclose(fd);
198 assert(origin != NULL);
199 assert(!strcmp(av[i], origin));
203 if (!xx || he->
p.
ui32p == NULL)
213 if (idtx == NULL || idtx->idt == NULL)
217 idt = idtx->idt + idtx->nidt;
231 for (i = 0; i < ac; i++)
232 av[i] =
_free(av[i]);
233 av =
_free(av); ac = 0;
254 if (AV != NULL && AC > 0 && B == NULL) {
255 if (!strcmp(lname,
"NEVRA")) {
257 for (i = 0; i < AC && (A = AV[i]) != NULL; i++) {
269 if (AV != NULL && B != NULL)
270 for (i = 0; i < AC && (A = AV[i]) != NULL; i++) {
271 if (*A && *B && !strcmp(A, B))
297 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
304 while (ip != NULL && ip->val.u32 == thistid) {
310 const char ** flinkPkgid = NULL;
311 const char ** flinkHdrid = NULL;
312 const char ** flinkNEVRA = NULL;
318 flinkPkgid = he->
p.
argv;
322 if (pn == 1 && flinkPkgid[0] != NULL && !strcmp(flinkPkgid[0],
RPMTE_CHAIN_END)) {
323 flinkPkgid =
_free(flinkPkgid);
329 flinkHdrid = he->
p.
argv;
333 flinkNEVRA = he->
p.
argv;
345 bingo =
cmpArgvStr(ts,
"NEVRA", flinkNEVRA, nn, (p ? p->NEVRA : NULL));
347 bingo =
cmpArgvStr(ts,
"Hdrid", flinkHdrid, hn, (p ? p->hdrid : NULL));
350 bingo =
cmpArgvStr(ts,
"Pkgid", flinkPkgid, pn, (p ? p->pkgid : NULL));
352 flinkPkgid =
_free(flinkPkgid);
353 flinkHdrid =
_free(flinkHdrid);
354 flinkNEVRA =
_free(flinkNEVRA);
374 rpmte q = ts->teErase;
401 unsigned thistid = 0xffffffff;
414 unsigned int _unsafe_rollbacks = 0;
419 if (argv != NULL && *argv != NULL) {
453 {
const char * globstr =
rpmExpand(
"%{_repackage_dir}/*/*.rpm", NULL);
454 if (globstr == NULL || *globstr ==
'%') {
455 globstr =
_free(globstr);
468 globstr =
_free(globstr);
488 if (ip != NULL && ip->val.u32 > thistid)
489 thistid = ip->val.u32;
490 if (rp != NULL && rp->val.u32 > thistid)
491 thistid = rp->val.u32;
494 if (thistid == 0 || thistid < ia->rbtid)
498 if (_unsafe_rollbacks && thistid <= _unsafe_rollbacks)
509 if (thistid == *excludedTID) {
510 time_t ttid = (time_t)thistid;
512 _(
"Excluding TID from rollback: %-24.24s (0x%08x)\n"),
513 ctime(&ttid), thistid);
520 while (rp != NULL && rp->val.u32 == thistid) {
529 while (ip != NULL && ip->val.u32 == thistid) {
548 while (rp != NULL && rp->val.u32 == thistid) {
551 (rp->key ? rp->key :
"???"));
566 rc =
findErases(ts, ts->teInstall, thistid, ip, niids);
585 rc =
findErases(ts, NULL, thistid, ip, niids);
590 while (ip != NULL && ip->val.u32 == thistid) {
598 if (_unsafe_rollbacks != 0)
620 tid = (time_t)thistid;
622 _(
"Rollback packages (+%d/-%d) to %-24.24s (0x%08x):\n"),
623 numAdded, numRemoved, ctime(&tid), thistid);
637 xx = rpmtsPrint(ts, stdout);
650 for (i = 0; i < rtids->nidt; i++) {
651 IDT rrp = rtids->idt + i;
652 if (rrp->val.u32 != thistid)
656 (void) unlink(rrp->key);
673 while (ip != NULL && ip->val.u32 == thistid) {