16 #define _RPMDB_INTERNAL
19 #define _RPMEVR_INTERNAL
23 #define _RPMTE_INTERNAL
25 #define _RPMTS_INTERNAL
35 #define CACHE_DEPENDENCY_RESULT 1
36 #if defined(CACHE_DEPENDENCY_RESULT)
56 static int uintcmp(
const void * a,
const void * b)
59 const uint32_t * aptr = (
const uint32_t *) a;
60 const uint32_t * bptr = (
const uint32_t *) b;
61 int rc = (*aptr - *bptr);
84 if (ts->numRemovedPackages > 0 && ts->removedPackages != NULL) {
85 uint32_t * needle = NULL;
86 needle = (uint32_t *) bsearch(&hdrNum,
87 ts->removedPackages, ts->numRemovedPackages,
88 sizeof(*ts->removedPackages),
uintcmp);
92 *indexp = needle - ts->removedPackages;
97 if (ts->rbf == NULL) {
98 static size_t n = 10000;
99 static double e = 1.0e-4;
102 rpmbfParams(n, e, &m, &k);
103 ts->rbf = rpmbfNew(m, k, 0);
106 if (ts->numRemovedPackages == ts->allocedRemovedPackages) {
107 ts->allocedRemovedPackages += ts->delta;
108 ts->removedPackages = (uint32_t *)
xrealloc(ts->removedPackages,
109 sizeof(ts->removedPackages) * ts->allocedRemovedPackages);
112 assert(ts->removedPackages != NULL);
113 xx = rpmbfAdd(ts->rbf, &hdrNum,
sizeof(hdrNum));
115 ts->removedPackages[ts->numRemovedPackages] = hdrNum;
116 ts->numRemovedPackages++;
117 if (ts->numRemovedPackages > 1)
118 qsort(ts->removedPackages, ts->numRemovedPackages,
119 sizeof(*ts->removedPackages),
uintcmp);
121 if (ts->orderCount >= ts->orderAlloced) {
122 ts->orderAlloced += (ts->orderCount - ts->orderAlloced) + ts->delta;
124 ts->order = (
rpmte *)
xrealloc(ts->order,
sizeof(*ts->order) * ts->orderAlloced);
129 ts->order[ts->orderCount] = p;
132 *indexp = ts->orderCount;
151 const char * one, * two;
163 rc = ((strcmp(one, two) == 0) ? 1 : 0);
164 else if (one && !two)
166 else if (!one && two)
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];
314 size_t flen = strlen(fn);
315 size_t slen = strlen(suffix);
316 return (flen > slen && !strcmp(fn + flen - slen, suffix));
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))
465 xx =
rpmmiPrune(mi, ts->removedPackages, ts->numRemovedPackages, 1);
476 if (tscolor && hcolor && ohcolor && !(hcolor & ohcolor))
490 assert(lastx >= 0 && lastx < ts->orderCount);
491 q = ts->order[lastx];
509 #if defined(RPM_VENDOR_WINDRIVER)
511 int _isCompatibleArch(
const char * arch,
const char * compat)
513 const char * compatArch =
rpmExpand(compat,
" %{?_", compat,
"_compat_arch}", NULL);
514 const char * p, * pe, * t;
518 if (arch[0] ==
'i' && arch[2] ==
'8' && arch[3] ==
'6') {
519 if ((arch[0] == compat[0]) &&
520 (arch[2] == compat[2]) &&
521 (arch[3] == compat[3]))
524 if (!strcmp(compat,
"x86_32"))
528 for ( p = pe = compatArch ; *pe && match == 0 ; ) {
530 pe = p ;
while (*pe && !
xisspace(*pe)) pe++;
533 t = strndup(p, (pe - p));
536 if (!strcmp(arch, t))
540 compatArch =
_free(compatArch);
555 const char * arch = NULL;
556 const char * os = NULL;
557 rpmds oldChk, newChk;
604 platform = he->
p.
str;
605 if (!xx || platform == NULL)
606 platform =
rpmExpand(arch,
"-unknown-", os, NULL);
610 #if defined(RPM_VENDOR_MANDRIVA)
617 platform =
_free(platform);
618 platform =
rpmExpand(arch,
"-unknown-", os, NULL);
626 assert(he->
p.
str != NULL);
629 platform, NULL, NULL, 0);
642 platform =
_free(platform);
676 if (arch == NULL || (parch =
rpmteA(p)) == NULL)
678 #if defined(RPM_VENDOR_WINDRIVER)
680 if (!_isCompatibleArch(arch, parch))
684 if (arch[0] ==
'i' && arch[2] ==
'8' && arch[3] ==
'6') {
685 if (arch[0] != parch[0])
continue;
686 if (arch[2] != parch[2])
continue;
687 if (arch[3] != parch[3])
continue;
690 else if (strcmp(arch, parch))
692 if (os == NULL || (pos =
rpmteO(p)) == NULL)
710 _(
"package %s was already added, skipping %s\n"),
711 (pkgNEVR ? pkgNEVR + 2 :
"?pkgNEVR?"),
712 (addNEVR ? addNEVR + 2 :
"?addNEVR?"));
724 _(
"package %s was already added, replacing with %s\n"),
725 (pkgNEVR ? pkgNEVR + 2 :
"?pkgNEVR?"),
726 (addNEVR ? addNEVR + 2 :
"?addNEVR?"));
743 if (oc >= ts->orderAlloced) {
744 ts->orderAlloced += (oc - ts->orderAlloced) + ts->delta;
746 ts->order = (
rpmte *)
xrealloc(ts->order, ts->orderAlloced *
sizeof(*ts->order));
753 if (duplicate && oc < ts->orderCount) {
756 ts->order[oc] =
rpmteFree(ts->order[oc]);
771 ts->order[oc] =
rpmteFree(ts->order[oc]);
772 ts->teInstall = NULL;
779 ts->numAddedPackages++;
782 ts->teInstall = ts->order[oc];
789 if (!(upgrade & 0x1))
836 if (rc == 0 && oc >= 0 && oc < ts->orderCount) {
838 ts->teErase = ts->order[oc];
871 sysinfo_path =
_free(sysinfo_path);
894 #if defined(CACHE_DEPENDENCY_RESULT)
895 int _cacheThisRC = 1;
901 if ((Name =
rpmdsN(dep)) == NULL)
906 #if defined(CACHE_DEPENDENCY_RESULT)
920 DBC * dbcursor = NULL;
923 size_t DNEVRlen = strlen(DNEVR);
925 xx = dbiCopen(dbi, dbiTxnid(dbi), &dbcursor, 0);
927 memset(key, 0,
sizeof(*key));
928 key->
data = (
void *) DNEVR;
929 key->
size = DNEVRlen;
930 memset(data, 0,
sizeof(*data));
932 data->
size = datalen;
934 xx = dbiGet(dbi, dbcursor, key, data,
DB_SET);
936 DNEVR = (
char *) key->
data;
937 DNEVRlen = key->
size;
939 datalen = data->
size;
941 if (xx == 0 && datap && datalen == 4)
942 memcpy(&rc, datap, datalen);
943 xx = dbiCclose(dbi, dbcursor, 0);
961 if (Flags & RPMSENSE_MISSINGOK)
971 s = Name;
while (*s &&
xisdigit(*s)) s++;
976 uid = strtol(Name, NULL, 10);
979 rc = (xx >= 0 ? 0 : 1);
980 if (Flags & RPMSENSE_MISSINGOK)
988 s = Name;
while (*s &&
xisdigit(*s)) s++;
993 gid = strtol(Name, NULL, 10);
996 rc = (xx >= 0 ? 0 : 1);
997 if (Flags & RPMSENSE_MISSINGOK)
1006 if (Flags & RPMSENSE_MISSINGOK)
1014 const char ** fs = NULL;
1019 fs = ts->filesystems;
1020 nfs = ts->filesystemCount;
1023 for (i = 0; i < nfs; i++) {
1024 if (!strcmp(fs[i], Name))
1027 rc = (i < nfs ? 0 : 1);
1028 if (Flags & RPMSENSE_MISSINGOK)
1035 size_t nb = strlen(Name);
1036 rpmDiskSpaceInfo dsi = NULL;
1037 const char ** fs = NULL;
1038 size_t fslen = 0, longest = 0;
1043 fs = ts->filesystems;
1044 nfs = ts->filesystemCount;
1047 for (i = 0; i < nfs; i++) {
1048 fslen = strlen(fs[i]);
1051 if (strncmp(fs[i], Name, fslen))
1053 if (fslen > 1 && Name[fslen] !=
'/' && Name[fslen] !=
'\0')
1055 if (fslen < longest)
1069 if (strchr(
"Gg", end[0]) && strchr(
"Bb", end[1]) && !end[2])
1070 needed *= 1024 * 1024 * 1024;
1071 if (strchr(
"Mm", end[0]) && strchr(
"Bb", end[1]) && !end[2])
1072 needed *= 1024 * 1024;
1073 if (strchr(
"Kk", end[0]) && strchr(
"Bb", end[1]) && !end[2])
1076 needed *= 1024 * 1024;
1078 needed = BLOCK_ROUND(needed, dsi->f_bsize);
1079 xx = (dsi->f_bavail - needed);
1085 if (Flags & RPMSENSE_MISSINGOK)
1093 const char *filename;
1101 if ((cp = (
char *) strchr(filename,
':')) != NULL) {
1103 digestHashAlgo = algo;
1108 fd =
Fopen(filename,
"r.fdio");
1111 const char * digest = NULL;
1112 size_t digestlen = 0;
1114 size_t nbuf = 8 * BUFSIZ;
1115 char * buf = (
char *)
alloca(nbuf);
1118 while ((nb =
Fread(buf,
sizeof(buf[0]), nbuf, fd)) > 0)
1120 xx =
Fclose(fd); fd = NULL;
1123 xx = (EVR && *EVR && digest && *digest) ? strcasecmp(EVR, digest) : -1;
1127 if (Flags & RPMSENSE_MISSINGOK)
1151 if (Flags & RPMSENSE_MISSINGOK)
1165 if (!strcmp(Name,
"*"))
1167 else if (Name[0] ==
'/')
1172 if (!(Name[0] ==
'/' || !strcmp(Name,
"*")))
1182 if (Flags & RPMSENSE_MISSINGOK)
1190 if (!(EVR && *EVR)) {
1191 static const char gnupg_pre[] =
"%(%{__gpg} --batch --no-tty --quiet --verify ";
1192 static const char gnupg_post[] =
" 2>/dev/null; echo $?)";
1193 const char * t =
rpmExpand(gnupg_pre, Name, gnupg_post, NULL);
1194 rc = (t && t[0] ==
'0') ? 0 : 1;
1198 static const char gnupg_pre[] =
"%(%{__gpg} --batch --no-tty --quiet --verify ";
1199 static const char gnupg_post[] =
" 2>&1 | grep '^Primary key fingerprint:' | sed -e 's;^.*: *;;' -e 's; *;;g')";
1200 const char * t =
rpmExpand(gnupg_pre, Name, gnupg_post, NULL);
1201 rc = ((Flags &
RPMSENSE_EQUAL) && strcasecmp(EVR, t) == 0) ? 0 : 1;
1204 if (Flags & RPMSENSE_MISSINGOK)
1211 static const char macro_pre[] =
"%{?";
1212 static const char macro_post[] =
":0}";
1213 const char * a =
rpmExpand(macro_pre, Name, macro_post, NULL);
1215 rc = (a && a[0] ==
'0') ? 0 : 1;
1217 if (Flags & RPMSENSE_MISSINGOK)
1224 const char * a = envGet(Name);
1231 int sense = (a && *a) ? strcmp(a, b) : -1;
1245 if (Flags & RPMSENSE_MISSINGOK)
1253 pid_t pid = strtol(Name, &t, 10);
1255 if (t == NULL || *t !=
'\0') {
1256 const char * fn =
rpmGetPath(
"%{_varrun}/", Name,
".pid", NULL);
1259 if (fn && *fn !=
'%' && (fd =
Fopen(fn,
"r.fdio")) && !
Ferror(fd)) {
1261 size_t nb =
Fread(buf,
sizeof(buf[0]),
sizeof(buf), fd);
1264 pid = strtol(buf, &t, 10);
1271 rc = (pid > 0 ? (kill(pid, 0) < 0 &&
errno == ESRCH) : 1);
1272 if (Flags & RPMSENSE_MISSINGOK)
1294 if (Flags & RPMSENSE_MISSINGOK)
1315 if (Flags & RPMSENSE_MISSINGOK)
1322 if (sysinfo_path == NULL) {
1323 sysinfo_path =
rpmExpand(
"%{?_rpmds_sysinfo_path}", NULL);
1324 if (!(sysinfo_path != NULL && *sysinfo_path ==
'/')) {
1325 sysinfo_path =
_free(sysinfo_path);
1349 static int oneshot = -1;
1353 if (rpmlibP == NULL)
1364 static int oneshot = -1;
1366 if (oneshot && cpuinfoP == NULL)
1368 if (cpuinfoP == NULL)
1379 static int oneshot = -1;
1383 if (getconfP == NULL)
1394 static int oneshot = -1;
1409 rpmds sonameP = NULL;
1411 char * fn = strcpy((
char *)
alloca(strlen(Name)+1), Name);
1418 fn[strlen(fn)-1] =
'\0';
1423 if (!(xx == 0 && sonameP != NULL))
1443 #if defined(CACHE_DEPENDENCY_RESULT)
1457 if (Name[0] ==
'/' && Name[1] ==
'\0') {
1461 if (Name[0] ==
'/') {
1464 ts->removedPackages, ts->numRemovedPackages, 1);
1475 ts->removedPackages, ts->numRemovedPackages, 1);
1490 if (ts->solve != NULL) {
1491 xx = (*ts->solve) (ts, dep, ts->solveData);
1503 if (Flags & RPMSENSE_MISSINGOK) {
1505 #if defined(CACHE_DEPENDENCY_RESULT)
1518 #if defined(CACHE_DEPENDENCY_RESULT)
1528 DBC * dbcursor = NULL;
1529 size_t DNEVRlen = strlen(DNEVR);
1533 memset(key, 0,
sizeof(*key));
1534 key->
data = (
void *) DNEVR;
1535 key->
size = DNEVRlen;
1536 memset(data, 0,
sizeof(*data));
1538 data->
size =
sizeof(rc);
1541 xx = dbiPut(dbi, dbcursor, key, data, 0);
1572 const char * depName,
1585 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK) || defined(RPM_OPTIONAL_DIRNAME_AND_SYMLINK_DEPS)
1591 if (requires != NULL)
1592 while (ourrc < terminate &&
rpmdsNext(requires) >= 0) {
1594 if ((Name =
rpmdsN(requires)) == NULL)
1598 if (depName != NULL && strcmp(depName, Name))
1603 if (tscolor && dscolor && !(tscolor & dscolor))
1612 {
fnpyKey * suggestedKeys = NULL;
1614 if (ts->availablePackages != NULL) {
1619 rpmdsProblem(ps, pkgNEVRA, requires, suggestedKeys, adding);
1632 if (conflicts != NULL)
1633 while (ourrc < terminate &&
rpmdsNext(conflicts) >= 0) {
1635 if ((Name =
rpmdsN(conflicts)) == NULL)
1639 if (depName != NULL && strcmp(depName, Name))
1644 if (tscolor && dscolor && !(tscolor & dscolor))
1664 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK) || defined(RPM_OPTIONAL_DIRNAME_AND_SYMLINK_DEPS)
1665 dirname_deps =
rpmExpandNumeric(
"%{?_check_dirname_deps}%{?!_check_dirname_deps:1}");
1669 if (dirnames != NULL)
1670 while (ourrc < terminate &&
rpmdsNext(dirnames) >= 0) {
1672 if ((Name =
rpmdsN(dirnames)) == NULL)
1676 if (depName != NULL && strcmp(depName, Name))
1681 if (tscolor && dscolor && !(tscolor & dscolor))
1690 {
fnpyKey * suggestedKeys = NULL;
1692 if (ts->availablePackages != NULL) {
1697 rpmdsProblem(ps, pkgNEVRA, dirnames, suggestedKeys, adding);
1708 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK) || defined(RPM_OPTIONAL_DIRNAME_AND_SYMLINK_DEPS)
1711 symlink_deps =
rpmExpandNumeric(
"%{?_check_symlink_deps}%{?!_check_symlink_deps:1}");
1715 if (linktos != NULL)
1716 while (ourrc < terminate &&
rpmdsNext(linktos) >= 0) {
1718 if ((Name =
rpmdsN(linktos)) == NULL)
1724 if (depName != NULL && strcmp(depName, Name))
1729 if (tscolor && dscolor && !(tscolor & dscolor))
1738 {
fnpyKey * suggestedKeys = NULL;
1740 if (ts->availablePackages != NULL) {
1745 rpmdsProblem(ps, pkgNEVRA, linktos, suggestedKeys, adding);
1756 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK) || defined(RPM_OPTIONAL_DIRNAME_AND_SYMLINK_DEPS)
1775 rpmmi mi,
int adding)
1788 ts->removedPackages, ts->numRemovedPackages, 1);
1789 while (ourrc < terminate && (h =
rpmmiNext(mi)) != NULL) {
1790 rpmds requires = NULL;
1791 rpmds conflicts = NULL;
1792 rpmds dirnames = NULL;
1793 rpmds linktos = NULL;
1800 if (ourrc >= terminate) {
1820 requires, conflicts, dirnames, linktos,
1821 depName, tscolor, adding);
1886 const char * depName = NULL;
1891 int closeatexit = 0;
1898 fprintf(stderr,
"--> %s(%p) tsFlags 0x%x\n", __FUNCTION__, ts,
rpmtsFlags(ts));
1905 closeatexit = (rc == 0);
1907 if (rc && (ourrc = rc) >= terminate)
1920 rpmds provides, requires, conflicts, dirnames, linktos;
1943 requires, conflicts, dirnames, linktos,
1945 if (rc && (ourrc = rc) >= terminate)
1950 if (provides != NULL)
1951 while (ourrc < terminate &&
rpmdsNext(provides) >= 0) {
1952 depName =
_free(depName);
1957 const char * EVR =
rpmdsEVR(provides);
1960 if (envPut(depName, EVR));
1969 if (rc && (ourrc = rc) >= terminate)
1974 while (ourrc < terminate &&
rpmfiNext(fi) >= 0) {
1975 depName =
_free(depName);
1981 if (rc && (ourrc = rc) >= terminate)
1985 if (rc && (ourrc = rc) >= terminate)
2003 if (provides != NULL)
2004 while (ourrc < terminate &&
rpmdsNext(provides) >= 0) {
2005 depName =
_free(depName);
2012 if (rc && (ourrc = rc) >= terminate)
2017 while (ourrc < terminate &&
rpmfiNext(fi) >= 0) {
2018 depName =
_free(depName);
2024 if (rc && (ourrc = rc) >= terminate)
2028 if (rc && (ourrc = rc) >= terminate)
2034 {
const char * tsNEVRA =
"transaction dependencies";
2039 const char * dep = NULL;
2044 if (rc && (ourrc = rc) >= terminate)
2050 depName =
_free(depName);
2056 #if defined(CACHE_DEPENDENCY_RESULT)