15 #define _RPMDB_INTERNAL
18 #define _RPMTE_INTERNAL
20 #define _RPMTS_INTERNAL
23 #define _RPMEVR_INTERNAL
49 #if defined(CACHE_DEPENDENCY_RESULT)
51 int _cacheDependsRC = CACHE_DEPENDENCY_RESULT;
69 static int intcmp(
const void * a,
const void * b)
74 int rc = (*aptr - *bptr);
96 if (ts->numRemovedPackages > 0 && ts->removedPackages != NULL) {
98 needle = bsearch(&dboffset, ts->removedPackages, ts->numRemovedPackages,
99 sizeof(*ts->removedPackages),
intcmp);
100 if (needle != NULL) {
103 *indexp = needle - ts->removedPackages;
108 if (ts->numRemovedPackages == ts->allocedRemovedPackages) {
109 ts->allocedRemovedPackages += ts->delta;
110 ts->removedPackages =
xrealloc(ts->removedPackages,
111 sizeof(ts->removedPackages) * ts->allocedRemovedPackages);
114 if (ts->removedPackages != NULL) {
115 ts->removedPackages[ts->numRemovedPackages] = dboffset;
116 ts->numRemovedPackages++;
117 if (ts->numRemovedPackages > 1)
118 qsort(ts->removedPackages, ts->numRemovedPackages,
119 sizeof(*ts->removedPackages),
intcmp);
122 if (ts->orderCount >= ts->orderAlloced) {
123 ts->orderAlloced += (ts->orderCount - ts->orderAlloced) + ts->delta;
125 ts->order =
xrealloc(ts->order,
sizeof(*ts->order) * ts->orderAlloced);
130 ts->order[ts->orderCount] = p;
132 *indexp = ts->orderCount;
150 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
151 const char * one, * two;
163 rc = ((strcmp(one, two) == 0) ? 1 : 0);
164 else if (one && !two)
166 else if (!one && two)
202 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
211 const char * t =
rpmExpand(
"%{?_upgrade_tag}", NULL);
225 if (tscolor && hcolor && ohcolor && !(hcolor & ohcolor))
231 if (xx && he->
p.
ui32p != NULL) {
232 if (p->originTid[0] == 0 || p->originTid[0] > he->
p.
ui32p[0]
233 || (he->
c > 1 && p->originTid[0] == he->
p.
ui32p[0] && p->originTid[1] > he->
p.
ui32p[1]))
235 p->originTid[0] = he->
p.
ui32p[0];
236 p->originTid[1] = (he->
c > 1 ? he->
p.
ui32p[1] : 0);
242 if (xx && he->
p.
ui32p != NULL) {
243 if (p->originTime[0] == 0 || p->originTime[0] > he->
p.
ui32p[0]
244 || (he->
c > 1 && p->originTime[0] == he->
p.
ui32p[0] && p->originTime[1] > he->
p.
ui32p[1]))
246 p->originTime[0] = he->
p.
ui32p[0];
247 p->originTime[1] = (he->
c > 1 ? he->
p.
ui32p[1] : 0);
252 #if defined(RPM_VENDOR_WINDRIVER)
259 if (tscolor && (!hcolor || !ohcolor)) {
264 arch = (xx && he->
p.
str != NULL ? he->
p.
str : NULL);
267 oharch = (xx && he->
p.
str != NULL ? he->
p.
str : NULL);
268 if (arch != NULL && oharch != NULL) {
269 if (strcmp(
"noarch", arch) || strcmp(
"noarch", oharch)) {
270 if (!_isCompatibleArch(arch, oharch)) {
272 oharch =
_free(oharch);
278 oharch =
_free(oharch);
289 assert(lastx >= 0 && lastx < ts->orderCount);
290 q = ts->order[lastx];
311 static inline int chkSuffix(
const char * fn,
const char * suffix)
314 size_t flen = strlen(fn);
315 size_t slen = strlen(suffix);
316 return (flen > slen && !strcmp(fn + flen - slen, suffix));
332 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
333 const void *keyval = NULL;
337 Header debuginfoHeader = NULL;
344 const char * t =
rpmExpand(
"%{?_debuginfo_tag}", NULL);
354 default:
return 0;
break;
360 xx =
rpmmiPrune(mi, ts->removedPackages, ts->numRemovedPackages, 1);
368 if (!xx || he->
p.
str == NULL)
381 if (nrefs == 0 && debuginfoInstance > 0 && debuginfoHeader != NULL) {
389 assert(lastx >= 0 && lastx < ts->orderCount);
390 q = ts->order[lastx];
403 debuginfoHeader = NULL;
429 const char *t =
rpmExpand(
"%{?_obsolete_tag}", NULL);
438 if (obsoletes != NULL)
442 if ((Name =
rpmdsN(obsoletes)) == NULL)
452 if (tscolor && dscolor && !(tscolor & dscolor))
456 if (!strcmp(
rpmteN(p), Name))
466 ts->removedPackages, ts->numRemovedPackages, 1);
477 if (tscolor && hcolor && ohcolor && !(hcolor & ohcolor))
491 assert(lastx >= 0 && lastx < ts->orderCount);
492 q = ts->order[lastx];
510 #if defined(RPM_VENDOR_WINDRIVER)
512 int _isCompatibleArch(
const char * arch,
const char * compat)
514 const char * compatArch =
rpmExpand(compat,
" %{?_", compat,
"_compat_arch}", NULL);
515 const char * p, * pe, * t;
519 if (arch[0] ==
'i' && arch[2] ==
'8' && arch[3] ==
'6') {
520 if ((arch[0] == compat[0]) &&
521 (arch[2] == compat[2]) &&
522 (arch[3] == compat[3]))
525 if (!strcmp(compat,
"x86_32"))
529 for ( p = pe = compatArch ; *pe && match == 0 ; ) {
531 pe = p ;
while (*pe && !
xisspace(*pe)) pe++;
534 t = strndup(p, (pe - p));
537 if (!strcmp(arch, t))
541 compatArch =
_free(compatArch);
549 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
556 const char * arch = NULL;
557 const char * os = NULL;
558 rpmds oldChk, newChk;
593 platform = he->
p.
str;
594 if (!xx || platform == NULL)
595 platform =
rpmExpand(arch,
"-unknown-", os, NULL);
602 assert(he->
p.
str != NULL);
605 platform, NULL, NULL, 0);
618 platform =
_free(platform);
652 if (arch == NULL || (parch =
rpmteA(p)) == NULL)
654 #if defined(RPM_VENDOR_WINDRIVER)
656 if (!_isCompatibleArch(arch, parch))
660 if (arch[0] ==
'i' && arch[2] ==
'8' && arch[3] ==
'6') {
661 if (arch[0] != parch[0])
continue;
662 if (arch[2] != parch[2])
continue;
663 if (arch[3] != parch[3])
continue;
666 else if (strcmp(arch, parch))
668 if (os == NULL || (pos =
rpmteO(p)) == NULL)
686 _(
"package %s was already added, skipping %s\n"),
687 (pkgNEVR ? pkgNEVR + 2 :
"?pkgNEVR?"),
688 (addNEVR ? addNEVR + 2 :
"?addNEVR?"));
700 _(
"package %s was already added, replacing with %s\n"),
701 (pkgNEVR ? pkgNEVR + 2 :
"?pkgNEVR?"),
702 (addNEVR ? addNEVR + 2 :
"?addNEVR?"));
719 if (oc >= ts->orderAlloced) {
720 ts->orderAlloced += (oc - ts->orderAlloced) + ts->delta;
722 ts->order =
xrealloc(ts->order, ts->orderAlloced *
sizeof(*ts->order));
729 if (duplicate && oc < ts->orderCount) {
731 ts->order[oc] = rpmteFree(ts->order[oc]);
745 ts->order[oc] = rpmteFree(ts->order[oc]);
746 ts->teInstall = NULL;
753 ts->numAddedPackages++;
756 ts->teInstall = ts->order[oc];
763 if (!(upgrade & 0x1))
810 if (rc == 0 && oc >= 0 && oc < ts->orderCount) {
812 ts->teErase = ts->order[oc];
845 sysinfo_path =
_free(sysinfo_path);
868 #if defined(CACHE_DEPENDENCY_RESULT)
869 int _cacheThisRC = 1;
875 if ((Name =
rpmdsN(dep)) == NULL)
880 #if defined(CACHE_DEPENDENCY_RESULT)
884 if (_cacheDependsRC) {
894 DBC * dbcursor = NULL;
897 size_t DNEVRlen = strlen(DNEVR);
899 xx = dbiCopen(dbi, dbiTxnid(dbi), &dbcursor, 0);
901 memset(key, 0,
sizeof(*key));
902 key->
data = (
void *) DNEVR;
903 key->
size = DNEVRlen;
904 memset(data, 0,
sizeof(*data));
906 data->
size = datalen;
908 xx = dbiGet(dbi, dbcursor, key, data,
DB_SET);
911 DNEVRlen = key->
size;
913 datalen = data->
size;
915 if (xx == 0 && datap && datalen == 4)
916 memcpy(&rc, datap, datalen);
917 xx = dbiCclose(dbi, dbcursor, 0);
935 if (Flags & RPMSENSE_MISSINGOK)
945 s = Name;
while (*s &&
xisdigit(*s)) s++;
950 uid = strtol(Name, NULL, 10);
953 rc = (xx >= 0 ? 0 : 1);
954 if (Flags & RPMSENSE_MISSINGOK)
962 s = Name;
while (*s &&
xisdigit(*s)) s++;
967 gid = strtol(Name, NULL, 10);
970 rc = (xx >= 0 ? 0 : 1);
971 if (Flags & RPMSENSE_MISSINGOK)
980 if (Flags & RPMSENSE_MISSINGOK)
988 const char ** fs = NULL;
993 fs = ts->filesystems;
994 nfs = ts->filesystemCount;
997 for (i = 0; i < nfs; i++) {
998 if (!strcmp(fs[i], Name))
1001 rc = (i < nfs ? 0 : 1);
1002 if (Flags & RPMSENSE_MISSINGOK)
1009 size_t nb = strlen(Name);
1010 rpmDiskSpaceInfo dsi = NULL;
1011 const char ** fs = NULL;
1012 size_t fslen = 0, longest = 0;
1017 fs = ts->filesystems;
1018 nfs = ts->filesystemCount;
1021 for (i = 0; i < nfs; i++) {
1022 fslen = strlen(fs[i]);
1025 if (strncmp(fs[i], Name, fslen))
1027 if (fslen > 1 && Name[fslen] !=
'/' && Name[fslen] !=
'\0')
1029 if (fslen < longest)
1043 if (strchr(
"Gg", end[0]) && strchr(
"Bb", end[1]) && !end[2])
1044 needed *= 1024 * 1024 * 1024;
1045 if (strchr(
"Mm", end[0]) && strchr(
"Bb", end[1]) && !end[2])
1046 needed *= 1024 * 1024;
1047 if (strchr(
"Kk", end[0]) && strchr(
"Bb", end[1]) && !end[2])
1050 needed *= 1024 * 1024;
1052 needed = BLOCK_ROUND(needed, dsi->f_bsize);
1053 xx = (dsi->f_bavail - needed);
1059 if (Flags & RPMSENSE_MISSINGOK)
1067 const char *filename;
1075 if ((cp = strchr(filename,
':')) != NULL) {
1077 digestHashAlgo = algo;
1082 fd =
Fopen(filename,
"r.fdio");
1085 const char * digest = NULL;
1086 size_t digestlen = 0;
1088 size_t nbuf = 8 * BUFSIZ;
1089 char * buf =
alloca(nbuf);
1092 while ((nb =
Fread(buf,
sizeof(buf[0]), nbuf, fd)) > 0)
1094 xx =
Fclose(fd); fd = NULL;
1097 xx = (EVR && *EVR && digest && *digest) ? strcasecmp(EVR, digest) : -1;
1101 if (Flags & RPMSENSE_MISSINGOK)
1125 if (Flags & RPMSENSE_MISSINGOK)
1132 QVA_t qva = memset(
alloca(
sizeof(*qva)), 0,
sizeof(*qva));
1138 if (!strcmp(Name,
"*"))
1140 else if (Name[0] ==
'/')
1145 if (!(Name[0] ==
'/' || !strcmp(Name,
"*")))
1155 if (Flags & RPMSENSE_MISSINGOK)
1163 if (!(EVR && *EVR)) {
1164 static const char gnupg_pre[] =
"%(%{__gpg} --batch --no-tty --quiet --verify ";
1165 static const char gnupg_post[] =
" 2>/dev/null; echo $?)";
1166 const char * t =
rpmExpand(gnupg_pre, Name, gnupg_post, NULL);
1167 rc = (t && t[0] ==
'0') ? 0 : 1;
1171 static const char gnupg_pre[] =
"%(%{__gpg} --batch --no-tty --quiet --verify ";
1172 static const char gnupg_post[] =
" 2>&1 | grep '^Primary key fingerprint:' | sed -e 's;^.*: *;;' -e 's; *;;g')";
1173 const char * t =
rpmExpand(gnupg_pre, Name, gnupg_post, NULL);
1174 rc = ((Flags &
RPMSENSE_EQUAL) && strcasecmp(EVR, t) == 0) ? 0 : 1;
1177 if (Flags & RPMSENSE_MISSINGOK)
1184 static const char macro_pre[] =
"%{?";
1185 static const char macro_post[] =
":0}";
1186 const char * a =
rpmExpand(macro_pre, Name, macro_post, NULL);
1188 rc = (a && a[0] ==
'0') ? 0 : 1;
1190 if (Flags & RPMSENSE_MISSINGOK)
1197 const char * a = envGet(Name);
1204 int sense = (a && *a) ? strcmp(a, b) : -1;
1218 if (Flags & RPMSENSE_MISSINGOK)
1226 pid_t pid = strtol(Name, &t, 10);
1228 if (t == NULL || *t !=
'\0') {
1229 const char * fn =
rpmGetPath(
"%{_varrun}/", Name,
".pid", NULL);
1232 if (fn && *fn !=
'%' && (fd =
Fopen(fn,
"r.fdio")) && !
Ferror(fd)) {
1234 size_t nb =
Fread(buf,
sizeof(buf[0]),
sizeof(buf), fd);
1237 pid = strtol(buf, &t, 10);
1244 rc = (pid > 0 ? (kill(pid, 0) < 0 &&
errno == ESRCH) : 1);
1245 if (Flags & RPMSENSE_MISSINGOK)
1267 if (Flags & RPMSENSE_MISSINGOK)
1288 if (Flags & RPMSENSE_MISSINGOK)
1295 if (sysinfo_path == NULL) {
1296 sysinfo_path =
rpmExpand(
"%{?_rpmds_sysinfo_path}", NULL);
1297 if (!(sysinfo_path != NULL && *sysinfo_path ==
'/')) {
1298 sysinfo_path =
_free(sysinfo_path);
1322 static int oneshot = -1;
1326 if (rpmlibP == NULL)
1337 static int oneshot = -1;
1339 if (oneshot && cpuinfoP == NULL)
1341 if (cpuinfoP == NULL)
1352 static int oneshot = -1;
1356 if (getconfP == NULL)
1367 static int oneshot = -1;
1382 rpmds sonameP = NULL;
1384 char * fn = strcpy(
alloca(strlen(Name)+1), Name);
1391 fn[strlen(fn)-1] =
'\0';
1396 if (!(xx == 0 && sonameP != NULL))
1416 #if defined(CACHE_DEPENDENCY_RESULT)
1429 if (Name[0] ==
'/') {
1434 ts->removedPackages, ts->numRemovedPackages, 1);
1445 ts->removedPackages, ts->numRemovedPackages, 1);
1460 if (ts->solve != NULL) {
1461 xx = (*ts->solve) (ts, dep, ts->solveData);
1473 if (Flags & RPMSENSE_MISSINGOK) {
1475 #if defined(CACHE_DEPENDENCY_RESULT)
1488 #if defined(CACHE_DEPENDENCY_RESULT)
1489 if (_cacheDependsRC && _cacheThisRC) {
1493 _cacheDependsRC = 0;
1498 DBC * dbcursor = NULL;
1499 size_t DNEVRlen = strlen(DNEVR);
1503 memset(key, 0,
sizeof(*key));
1504 key->
data = (
void *) DNEVR;
1505 key->
size = DNEVRlen;
1506 memset(data, 0,
sizeof(*data));
1508 data->
size =
sizeof(rc);
1511 xx = dbiPut(dbi, dbcursor, key, data, 0);
1516 _cacheDependsRC = 0;
1542 const char * depName,
1555 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK)
1561 if (requires != NULL)
1562 while (ourrc < terminate &&
rpmdsNext(requires) >= 0) {
1564 if ((Name =
rpmdsN(requires)) == NULL)
1568 if (depName != NULL && strcmp(depName, Name))
1573 if (tscolor && dscolor && !(tscolor & dscolor))
1582 {
fnpyKey * suggestedKeys = NULL;
1584 if (ts->availablePackages != NULL) {
1589 rpmdsProblem(ps, pkgNEVRA, requires, suggestedKeys, adding);
1602 if (conflicts != NULL)
1603 while (ourrc < terminate &&
rpmdsNext(conflicts) >= 0) {
1605 if ((Name =
rpmdsN(conflicts)) == NULL)
1609 if (depName != NULL && strcmp(depName, Name))
1614 if (tscolor && dscolor && !(tscolor & dscolor))
1634 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK)
1635 dirname_deps =
rpmExpandNumeric(
"%{?_check_dirname_deps}%{?!_check_dirname_deps:1}");
1639 if (dirnames != NULL)
1640 while (ourrc < terminate &&
rpmdsNext(dirnames) >= 0) {
1642 if ((Name =
rpmdsN(dirnames)) == NULL)
1646 if (depName != NULL && strcmp(depName, Name))
1651 if (tscolor && dscolor && !(tscolor & dscolor))
1660 {
fnpyKey * suggestedKeys = NULL;
1662 if (ts->availablePackages != NULL) {
1667 rpmdsProblem(ps, pkgNEVRA, dirnames, suggestedKeys, adding);
1678 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK)
1681 symlink_deps =
rpmExpandNumeric(
"%{?_check_symlink_deps}%{?!_check_symlink_deps:1}");
1685 if (linktos != NULL)
1686 while (ourrc < terminate &&
rpmdsNext(linktos) >= 0) {
1688 if ((Name =
rpmdsN(linktos)) == NULL)
1694 if (depName != NULL && strcmp(depName, Name))
1699 if (tscolor && dscolor && !(tscolor & dscolor))
1708 {
fnpyKey * suggestedKeys = NULL;
1710 if (ts->availablePackages != NULL) {
1715 rpmdsProblem(ps, pkgNEVRA, linktos, suggestedKeys, adding);
1726 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK)
1745 rpmmi mi,
int adding)
1749 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
1758 ts->removedPackages, ts->numRemovedPackages, 1);
1759 while (ourrc < terminate && (h =
rpmmiNext(mi)) != NULL) {
1760 rpmds requires = NULL;
1761 rpmds conflicts = NULL;
1762 rpmds dirnames = NULL;
1763 rpmds linktos = NULL;
1770 if (ourrc >= terminate) {
1790 requires, conflicts, dirnames, linktos,
1791 depName, tscolor, adding);
1885 for (bdp = badDeps; bdp->
pname != NULL && bdp->
qname != NULL; bdp++)
1887 badDeps =
_free(badDeps);
1889 badDepsInitialized = 0;
1909 if (!badDepsInitialized) {
1910 char * s =
rpmExpand(
"%{?_dependency_whiteout}", NULL);
1911 const char ** av = NULL;
1918 if (s != NULL && *s !=
'\0'
1919 && !(i = poptParseArgvString(s, &ac, (
const char ***)&av))
1920 && ac > 0 && av != NULL)
1922 bdp = badDeps =
xcalloc(ac+1,
sizeof(*badDeps));
1923 for (i = 0; i < ac; i++, bdp++) {
1929 if ((qname = strchr(pname,
'>')) != NULL)
1936 _(
"ignore package name relation(s) [%d]\t%s -> %s\n"),
1944 badDepsInitialized++;
1948 if (badDeps != NULL)
1949 for (bdp = badDeps; bdp->
pname != NULL && bdp->
qname != NULL; bdp++) {
1969 while (tsi != NULL && (p = tsi->tsi_suc) != NULL) {
1970 tsi = tsi->tsi_next;
1971 if (
rpmteTSI(p)->tsi_chain != NULL)
1990 if (f & RPMSENSE_SCRIPT_PRE)
1991 return "Requires(pre):";
1992 if (f & RPMSENSE_SCRIPT_POST)
1993 return "Requires(post):";
1994 if (f & RPMSENSE_SCRIPT_PREUN)
1995 return "Requires(preun):";
1996 if (f & RPMSENSE_SCRIPT_POSTUN)
1997 return "Requires(postun):";
1998 if (f & RPMSENSE_SCRIPT_VERIFY)
1999 return "Requires(verify):";
2000 if (f & RPMSENSE_MISSINGOK)
2001 return "Requires(hint):";
2002 if (f & RPMSENSE_FIND_REQUIRES)
2003 return "Requires(auto):";
2022 int zap,
int * nzaps,
int msglvl)
2029 const char *dp = NULL;
2035 tsi_prev = tsi, tsi = tsi->tsi_next)
2041 if (tsi->tsi_suc != p)
2046 if (requires == NULL)
continue;
2059 _(
"removing %s \"%s\" from tsort relations.\n"),
2062 if (tsi_prev) tsi_prev->tsi_next = tsi->tsi_next;
2063 tsi->tsi_next = NULL;
2064 tsi->tsi_suc = NULL;
2089 unsigned char * selected,
2102 rpmal al = (teType ==
TR_ADDED ? ts->addedPackages : ts->erasedPackages);
2141 pkgKey = (
alKey)(((
long)pkgKey) + ts->numAddedPackages);
2148 if (q == NULL || i >= ts->orderCount)
2156 if (selected[i] != 0)
2175 tsi =
xcalloc(1,
sizeof(*tsi));
2179 tsi->tsi_reqx =
rpmdsIx(requires);
2181 tsi->tsi_next =
rpmteTSI(q)->tsi_next;
2198 long a = (long) ((
const orderListIndex)one)->pkgKey;
2199 long b = (long) ((
const orderListIndex)two)->pkgKey;
2223 if ((*rp) == NULL) {
2231 for (qprev = NULL, q = (*qp);
2233 qprev = q, q =
rpmteTSI(q)->tsi_suc)
2246 if (qprev == NULL) {
2251 }
else if (q == NULL) {
2269 #define isAuto(_x) ((_x) & _autobits)
2280 while ((c = (
int)*dn++) != 0) {
2282 default:
continue;
break;
2283 case '/': nslashes++;
break;
2302 int orderingCount = 0;
2303 unsigned char * selected =
alloca(
sizeof(*selected) * (ts->orderCount + 1));
2306 int newOrderCount = 0;
2307 orderListIndex orderList;
2310 int * peer = memset(
alloca(npeer*
sizeof(*peer)), 0, (npeer*
sizeof(*peer)));
2336 pkgKey =
rpmalAdd(&ts->erasedPackages, pkgKey, key,
2340 pkgKey = (
alKey)(((
long)pkgKey) + ts->numAddedPackages);
2350 numOrderList = ts->orderCount;
2354 numOrderList += ts->numAddedPackages;
2356 numOrderList += ts->numRemovedPackages;
2358 ordering =
alloca(
sizeof(*ordering) * (numOrderList + 1));
2359 loopcheck = numOrderList;
2370 while ((p =
rpmtsiNext(pi, oType)) != NULL) {
2372 memset(selected, 0,
sizeof(*selected) * ts->orderCount);
2383 if (requires != NULL)
2393 if (!isErasePreReq(Flags))
2398 if (!isInstallPreReq(Flags))
2410 if (requires != NULL)
2420 if (isErasePreReq(Flags))
2425 if (isInstallPreReq(Flags))
2441 if (strcmp(q->pkgid, p->flink.Pkgid[0]))
2444 if (requires != NULL) {
2458 if (requires != NULL)
2472 if (requires != NULL)
2487 while ((p =
rpmtsiNext(pi, oType)) != NULL) {
2510 rpmlog(
RPMLOG_DEBUG,
D_(
"========== tsorting packages (order, #predecessors, #succesors, tree, Ldepth, Rbreadth)\n"));
2517 while ((p =
rpmtsiNext(pi, oType)) != NULL) {
2526 addQ(p, &q, &r, prefcolor);
2532 for (; q != NULL; q =
rpmteTSI(q)->tsi_suc) {
2555 breadth = ((depth < npeer) ? peer[depth]++ : 0);
2561 treex, depth, breadth,
2577 while ((tsi = tsi_next) != NULL) {
2578 tsi_next = tsi->tsi_next;
2579 tsi->tsi_next = NULL;
2581 if (p && (--
rpmteTSI(p)->tsi_count) <= 0) {
2597 if (!_printed && loopcheck == qlen &&
rpmteTSI(q)->tsi_suc != NULL) {
2601 D_(
"========== successors only (%d bytes)\n"), (
int)tsbytes);
2606 while ((p =
rpmtsiNext(pi, oType)) != NULL) {
2614 tsi->tsi_suc = NULL;
2619 if (loopcheck != 0) {
2625 while ((q =
rpmtsiNext(qi, oType)) != NULL) {
2636 while ((q =
rpmtsiNext(qi, oType)) != NULL) {
2637 if ((tsi =
rpmteTSI(q)->tsi_next) == NULL)
2654 for (q =
rpmteTSI(r)->tsi_chain; q != NULL;
2663 while ((p = q) != NULL && (q =
rpmteTSI(p)->tsi_chain) != NULL) {
2670 #if defined(RPM_VENDOR_MANDRIVA)
2672 msglvl =
rpmExpandNumeric(
"%{?_loop_detection_loglevel}%{?!_loop_detection_loglevel:7}");
2689 rpmlog(msglvl,
" %-40s %s\n", (nevra ? nevra :
"???"),
2690 (dp ? dp :
"not found!?!"));
2697 for (p = r, q =
rpmteTSI(r)->tsi_chain; q != NULL;
2709 if (nzaps && nrescans-- > 0) {
2735 orderList =
xcalloc(numOrderList,
sizeof(*orderList));
2738 while ((p =
rpmtsiNext(pi, oType)) != NULL) {
2749 newOrder =
xcalloc(ts->orderCount,
sizeof(*newOrder));
2751 for (i = 0, newOrderCount = 0; i < orderingCount; i++)
2754 orderListIndex needle;
2756 key.
pkgKey = ordering[i];
2757 needle = bsearch(&key, orderList, numOrderList,
2762 j = needle->orIndex;
2763 if ((q = ts->order[j]) == NULL || needle->pkgKey ==
RPMAL_NOMATCH)
2766 newOrder[newOrderCount++] = q;
2767 ts->order[j] = NULL;
2770 assert(newOrderCount == ts->orderCount);
2773 ts->order =
_free(ts->order);
2775 ts->order = newOrder;
2776 ts->orderAlloced = ts->orderCount;
2777 orderList =
_free(orderList);
2791 const char * depName = NULL;
2796 int closeatexit = 0;
2807 closeatexit = (rc == 0);
2809 if (rc && (ourrc = rc) >= terminate)
2822 rpmds provides, requires, conflicts, dirnames, linktos;
2845 requires, conflicts, dirnames, linktos,
2847 if (rc && (ourrc = rc) >= terminate)
2852 if (provides != NULL)
2853 while (ourrc < terminate &&
rpmdsNext(provides) >= 0) {
2854 depName =
_free(depName);
2859 const char * EVR =
rpmdsEVR(provides);
2862 if (envPut(depName, EVR));
2871 if (rc && (ourrc = rc) >= terminate)
2876 while (ourrc < terminate &&
rpmfiNext(fi) >= 0) {
2877 depName =
_free(depName);
2883 if (rc && (ourrc = rc) >= terminate)
2887 if (rc && (ourrc = rc) >= terminate)
2905 if (provides != NULL)
2906 while (ourrc < terminate &&
rpmdsNext(provides) >= 0) {
2907 depName =
_free(depName);
2914 if (rc && (ourrc = rc) >= terminate)
2919 while (ourrc < terminate &&
rpmfiNext(fi) >= 0) {
2920 depName =
_free(depName);
2926 if (rc && (ourrc = rc) >= terminate)
2930 if (rc && (ourrc = rc) >= terminate)
2936 {
const char * tsNEVRA =
"transaction dependencies";
2941 const char * dep = NULL;
2946 if (rc && (ourrc = rc) >= terminate)
2952 depName =
_free(depName);
2958 #if defined(CACHE_DEPENDENCY_RESULT)
2959 else if (_cacheDependsRC)