14 #include <rpmkeyring.h>
20 #define _RPMDB_INTERNAL
29 #define _RPMTE_INTERNAL
32 #define _RPMTS_INTERNAL
41 #if STATFS_IN_SYS_STATVFS
43 #if defined(__LCLINT__)
45 extern int statvfs (
const char *
file,
struct statvfs * buf)
51 # include <sys/statvfs.h>
54 # if STATFS_IN_SYS_VFS
57 # if STATFS_IN_SYS_MOUNT
58 # include <sys/mount.h>
60 # if STATFS_IN_SYS_STATFS
61 # include <sys/statfs.h>
95 if (ts->rdb != NULL) {
109 if (ts->rdb != NULL && ts->dbmode == dbmode)
117 rc =
rpmdbOpen(ts->rootDir, &ts->rdb, ts->dbmode, 0644);
120 dn =
rpmGetPath(ts->rootDir,
"%{_dbpath}", NULL);
122 _(
"cannot open Packages database in %s\n"), dn);
130 #if defined(SUPPORT_INITDB)
131 void *lock = rpmtsAcquireLock(ts);
133 lock = rpmtsFreeLock(lock);
142 void * lock = rpmtsAcquireLock(ts);
148 lock = rpmtsFreeLock(lock);
154 #if defined(SUPPORT_VERIFYDB)
163 const void * keyp,
size_t keylen)
166 const char * arch = NULL;
169 if (ts->rdb == NULL &&
rpmtsOpenDB(ts, ts->dbmode))
174 const char * s = keyp;
176 size_t slen = strlen(s);
182 while ((c = *s++) !=
'\0') {
194 for (se = s; *se &&
xisdigit(*se); se++)
229 mi =
rpmmiInit(ts->rdb, rpmtag, keyp, keylen);
246 if (ts->sdb != NULL) {
258 static int has_sdbpath = -1;
261 if (ts->sdb != NULL && ts->sdbmode == dbmode)
268 if (has_sdbpath <= 0)
273 rc =
rpmdbOpen(ts->rootDir, &ts->sdb, ts->sdbmode, 0644);
276 dn =
rpmGetPath(ts->rootDir,
"%{_dbpath}", NULL);
278 _(
"cannot open Solve database in %s\n"), dn);
294 static int sugcmp(
const void * a,
const void * b)
297 const char * astr = *(
const char **)a;
298 const char * bstr = *(
const char **)b;
299 return strcmp(astr, bstr);
304 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
306 const char * str = NULL;
311 size_t bhnamelen = 0;
338 if (ts->sdb == NULL) {
345 mi =
rpmmiInit(ts->sdb, rpmtag, keyp, keylen);
355 hnamelen = ((xx && he->
p.
str) ? strlen(he->
p.
str) : 0);
359 if (bhnamelen > 0 && hnamelen > bhnamelen)
376 bhnamelen = hnamelen;
385 qfmt =
rpmExpand(
"%{?_solve_name_fmt}", NULL);
386 if (qfmt == NULL || *qfmt ==
'\0')
401 fd =
Fopen(str,
"r.fdio");
402 if (fd == NULL ||
Ferror(fd)) {
437 if (ts->suggests != NULL && ts->nsuggests > 0) {
438 if (bsearch(&str, ts->suggests, ts->nsuggests,
439 sizeof(*ts->suggests),
sugcmp))
447 ts->suggests =
xrealloc(ts->suggests,
448 sizeof(*ts->suggests) * (ts->nsuggests + 2));
449 ts->suggests[ts->nsuggests] = str;
451 ts->suggests[ts->nsuggests] = NULL;
453 if (ts->nsuggests > 1)
454 qsort(ts->suggests, ts->nsuggests,
sizeof(*ts->suggests),
sugcmp);
467 if (ts->availablePackages == NULL)
474 if (sugkey[0] != NULL) {
475 ts->suggests =
xrealloc(ts->suggests,
476 sizeof(*ts->suggests) * (ts->nsuggests + 2));
477 ts->suggests[ts->nsuggests] = sugkey[0];
480 ts->suggests[ts->nsuggests] = NULL;
482 sugkey =
_free(sugkey);
489 int (*solve) (
rpmts ts,
rpmds key,
const void * data),
490 const void * solveData)
497 ts->solveData = solveData;
505 static const char msg[] =
"rpmtsProblems";
508 if (ts->probs == NULL)
530 ts->addedPackages =
rpmalFree(ts->addedPackages);
531 ts->numAddedPackages = 0;
533 ts->erasedPackages =
rpmalFree(ts->erasedPackages);
534 ts->numErasedPackages = 0;
536 ts->suggests =
_free(ts->suggests);
558 ts->order[oc] = rpmteFree(ts->order[oc]);
567 ts->numRemovedPackages = 0;
577 static unsigned int scale = (1000 * 1000);
578 if (op != NULL && op->
count > 0)
579 fprintf(stderr,
" %s %8d %6lu.%06lu MB %6lu.%06lu secs\n",
581 (
unsigned long)op->
bytes/scale, (
unsigned long)op->
bytes%scale,
634 yarnRelease(ts->_item.use);
638 yarnPossess(ts->_item.use);
650 ts->removedPackages =
_free(ts->removedPackages);
652 ts->availablePackages =
rpmalFree(ts->availablePackages);
653 ts->numAvailablePackages = 0;
655 ts->dsi =
_free(ts->dsi);
657 if (ts->scriptFd != NULL) {
659 ts->scriptFd =
fdFree(ts->scriptFd, __FUNCTION__);
663 ts->rootDir =
_free(ts->rootDir);
664 ts->currDir =
_free(ts->currDir);
667 ts->order =
_free(ts->order);
669 ts->orderAlloced = 0;
671 ts->keyring = rpmKeyringFree(ts->keyring);
672 ts->pkpkt =
_free(ts->pkpkt);
674 memset(ts->pksignid, 0,
sizeof(ts->pksignid));
680 const char ** av = NULL;
698 if (_rpmtsPool == NULL) {
708 rpmKeyring keyring = NULL;
711 if (ts->keyring == NULL && autoload)
713 keyring = rpmKeyringLink(ts->keyring);
715 keyring = ts->keyring;
719 return (
void *)keyring;
725 rpmKeyring keyring = _keyring;
740 ts->keyring = rpmKeyringFree(ts->keyring);
744 ts->keyring = rpmKeyringLink(keyring);
747 ts->keyring = keyring;
786 return ((ts != NULL) ? ts->type : 0);
797 return ((ts != NULL) ? ts->arbgoal : 0);
808 int unorderedSuccessors = 0;
810 unorderedSuccessors = ts->unorderedSuccessors;
812 ts->unorderedSuccessors = first;
814 return unorderedSuccessors;
819 const char * rootDir = NULL;
821 if (ts != NULL && ts->rootDir != NULL) {
845 ts->rootDir =
_free(ts->rootDir);
847 if (rootDir == NULL) {
853 rootLen = strlen(rootDir);
856 if (!(rootLen && rootDir[rootLen - 1] ==
'/')) {
857 char * t =
alloca(rootLen + 2);
862 ts->rootDir =
xstrdup(rootDir);
868 const char * currDir = NULL;
870 currDir = ts->currDir;
878 ts->currDir =
_free(ts->currDir);
880 ts->currDir =
xstrdup(currDir);
886 FD_t scriptFd = NULL;
888 scriptFd = ts->scriptFd;
899 if (ts->scriptFd != NULL) {
901 ts->scriptFd =
fdFree(ts->scriptFd,
"rpmtsSetScriptFd");
906 if (scriptFd != NULL)
907 ts->scriptFd =
fdLink((
void *)scriptFd,
"rpmtsSetScriptFd");
914 int selinuxEnabled = 0;
916 selinuxEnabled = (ts->selinuxEnabled > 0);
917 return selinuxEnabled;
922 return (ts != NULL ? ts->chrootDone : 0);
929 ochrootDone = ts->chrootDone;
931 ts->rdb->db_chrootDone = chrootDone;
932 ts->chrootDone = chrootDone;
962 static int oneshot = 0;
964 const char * fn =
rpmGetPath(
"%{?_rpmds_sysinfo_path}", NULL);
982 rpmDiskSpaceInfo dsi;
989 if (ts->filesystems != NULL)
994 D_(
" i dev bsize bavail iavail mount point\n"));
997 if (rc || ts->filesystems == NULL || ts->filesystemCount == 0)
1002 ts->dsi =
_free(ts->dsi);
1003 ts->dsi =
xcalloc((ts->filesystemCount + 1),
sizeof(*ts->dsi));
1008 for (i = 0; (i < ts->filesystemCount) && dsi; i++, dsi++) {
1009 #if STATFS_IN_SYS_STATVFS
1011 memset(&sfb, 0,
sizeof(sfb));
1012 rc = statvfs(ts->filesystems[i], &sfb);
1015 memset(&sfb, 0,
sizeof(sfb));
1022 rc = statfs(ts->filesystems[i], &sfb,
sizeof(sfb), 0);
1024 rc = statfs(ts->filesystems[i], &sfb);
1030 rc = stat(ts->filesystems[i], &sb);
1033 dsi->dev = sb.st_dev;
1035 #if STATFS_IN_SYS_STATVFS
1036 dsi->f_frsize = sfb.f_frsize;
1037 #if defined(RPM_OS_AIX)
1040 dsi->f_fsid = sfb.f_fsid;
1042 dsi->f_flag = sfb.f_flag;
1043 dsi->f_favail = (
long long) sfb.f_favail;
1044 dsi->f_namemax = sfb.f_namemax;
1045 #elif defined(__APPLE__) && defined(__MACH__) && !defined(_SYS_STATVFS_H_)
1047 dsi->f_namemax = pathconf(ts->filesystems[i], _PC_NAME_MAX);
1048 #elif defined(__OpenBSD__)
1050 dsi->f_namemax = pathconf(ts->filesystems[i], _PC_NAME_MAX);
1052 dsi->f_fsid = sfb.f_fsid;
1053 dsi->f_namemax = sfb.f_namelen;
1056 dsi->f_bsize = sfb.f_bsize;
1057 dsi->f_blocks = (
unsigned long long)sfb.f_blocks;
1058 dsi->f_bfree = (
unsigned long long)sfb.f_bfree;
1059 dsi->f_files = (
unsigned long long)sfb.f_files;
1060 dsi->f_ffree = (
unsigned long long)sfb.f_ffree;
1064 #ifdef STATFS_HAS_F_BAVAIL
1065 dsi->f_bavail = (
long long)(sfb.f_bavail ? sfb.f_bavail : 1);
1066 if (sfb.f_ffree > 0 && sfb.f_files > 0 && sfb.f_favail > 0)
1067 dsi->f_favail = (
long long)sfb.f_favail;
1069 dsi->f_favail = !(sfb.f_ffree == 0 && sfb.f_files == 0)
1070 ? (
signed long long) sfb.f_ffree : -1;
1076 dsi->f_bavail = sfb.f_blocks - sfb.f_bfree;
1078 dsi->f_favail = !(sfb.f_ffree == 0 && sfb.f_files == 0)
1082 #if !defined(ST_RDONLY)
1086 (
unsigned)i, (
unsigned) dsi->dev, (
unsigned) dsi->f_bsize,
1087 (
signed long) dsi->f_bavail, (
signed long) dsi->f_favail,
1088 ((dsi->f_flag &
ST_RDONLY) ?
"ro" :
"rw"),
1089 ts->filesystems[i]);
1099 rpmDiskSpaceInfo dsi;
1104 while (dsi->f_bsize && dsi->dev != dev)
1106 if (dsi->f_bsize == 0)
1112 bneeded = BLOCK_ROUND(fileSize, dsi->f_bsize);
1119 dsi->bneeded += bneeded;
1128 dsi->bneeded += bneeded;
1129 dsi->bneeded -= BLOCK_ROUND(prevSize, dsi->f_bsize);
1134 dsi->bneeded -= bneeded;
1142 dsi->bneeded -= BLOCK_ROUND(fixupSize, dsi->f_bsize);
1147 rpmDiskSpaceInfo dsi;
1152 if (ts->filesystems == NULL || ts->filesystemCount == 0)
1163 for (i = 0; i < ts->filesystemCount; i++, dsi++) {
1165 if (dsi->f_bavail > 0 && adj_fs_blocks(dsi->bneeded) > dsi->f_bavail) {
1168 ts->filesystems[i], NULL, NULL,
1169 (adj_fs_blocks(dsi->bneeded) - dsi->f_bavail) * dsi->f_bsize);
1172 if (dsi->f_favail > 0 && adj_fs_blocks(dsi->ineeded) > dsi->f_favail) {
1175 ts->filesystems[i], NULL, NULL,
1176 (adj_fs_blocks(dsi->ineeded) - dsi->f_favail));
1179 if ((dsi->bneeded || dsi->ineeded) && (dsi->f_flag &
ST_RDONLY)) {
1182 ts->filesystems[i], NULL, NULL, 0);
1192 if (ts && ts->notify) {
1206 ptr = ts->notify(h, what, amount, total, cbkey, ts->notifyData);
1218 if (ts != NULL && ts->order != NULL) {
1219 nelements = ts->orderCount;
1227 if (ts != NULL && ts->order != NULL) {
1228 if (ix >= 0 && ix < ts->orderCount)
1238 return (ts != NULL ? ts->ignoreSet : 0);
1245 transFlags = ts->transFlags;
1258 otransFlags = ts->transFlags;
1263 ts->transFlags = transFlags;
1270 return (ts != NULL ? ts->depFlags : 0);
1277 odepFlags = ts->depFlags;
1278 ts->depFlags = depFlags;
1292 Spec ospec = ts->spec;
1302 return ts->relocateElement;
1308 rpmte orelocateElement = ts->relocateElement;
1310 ts->relocateElement = relocateElement;
1312 return orelocateElement;
1332 return (ts != NULL ? ts->dbmode : 0);
1339 odbmode = ts->dbmode;
1340 ts->dbmode = dbmode;
1347 return (ts != NULL ? ts->color : 0);
1362 return (ts != NULL ? ts->prefcolor : 0);
1369 ts->notify = notify;
1370 ts->notifyData = notifyData;
1380 memset(&ts->ops, 0,
sizeof(ts->ops));
1384 ts->filesystemCount = 0;
1385 ts->filesystems = NULL;
1389 ts->solveData = NULL;
1391 ts->suggests = NULL;
1396 ts->sdbmode = O_RDONLY;
1399 ts->dbmode = O_RDONLY;
1401 ts->scriptFd = NULL;
1402 {
struct timeval tv;
1403 xx = gettimeofday(&tv, NULL);
1411 if (!ts->prefcolor) ts->prefcolor = 0x2;
1413 ts->numRemovedPackages = 0;
1414 ts->allocedRemovedPackages = ts->delta;
1415 ts->removedPackages =
xcalloc(ts->allocedRemovedPackages,
1416 sizeof(*ts->removedPackages));
1424 ts->numAddedPackages = 0;
1425 ts->addedPackages = NULL;
1427 ts->numErasedPackages = 0;
1428 ts->erasedPackages = NULL;
1430 ts->numAvailablePackages = 0;
1431 ts->availablePackages = NULL;
1433 ts->orderAlloced = 0;
1444 memset(ts->pksignid, 0,
sizeof(ts->pksignid));
1448 ts->arbgoal = 0xffffffff;