14 #include <rpmkeyring.h>
19 #define _RPMTAG_INTERNAL
23 #define _RPMDB_INTERNAL
32 #define _RPMTE_INTERNAL
35 #define _RPMTS_INTERNAL
36 #define _RPMBAG_INTERNAL
45 #if STATFS_IN_SYS_STATVFS
47 #if defined(__LCLINT__)
49 extern int statvfs (
const char *
file,
struct statvfs * buf)
55 # include <sys/statvfs.h>
58 # if STATFS_IN_SYS_VFS
61 # if STATFS_IN_SYS_MOUNT
62 # include <sys/mount.h>
64 # if STATFS_IN_SYS_STATFS
65 # include <sys/statfs.h>
86 GENfree(rpmDiskSpaceInfo)
105 if (ts->rdb != NULL) {
119 if (ts->rdb != NULL && ts->dbmode == dbmode)
127 rc =
rpmdbOpen(ts->rootDir, &ts->rdb, ts->dbmode, (mode_t)0644);
129 const char * dn =
rpmGetPath(ts->rootDir,
"%{_dbpath}", NULL);
138 void * lock = rpmtsAcquireLock(ts);
150 if (!(db->db_api == 3 || db->db_api == 4))
153 rc = rpmtxnCheckpoint(db);
157 for (dbix = 0; dbix < db->db_ndbi; dbix++) {
161 switch (dbiTags->tag) {
175 fn =
rpmGetPath(db->db_root, db->db_home,
"/",
176 (dbiTags->str != NULL ? dbiTags->str :
tagName(dbiTags->tag)),
185 (void)
dbiOpen(db, dbiTags->tag, db->db_flags);
195 (
unsigned)db->db_maxkey);
196 fn =
rpmGetPath(db->db_root, db->db_home,
"/Seqno", NULL);
202 rc = rpmtxnCheckpoint(db);
207 lock = rpmtsFreeLock(lock);
213 const void * keyp,
size_t keylen)
217 :
rpmmiInit(ts->rdb, rpmtag, keyp, keylen);
224 rpmbag bag = ts->bag;
228 rpmsdb * sdbp = bag->sdbp;
235 sdb = (
rpmdb) sdbp[i]->_db;
245 (void) rpmbagDel(bag, i);
247 ts->bag = rpmbagFree(ts->bag);
254 static int has_sdbpath = -1;
255 rpmbag bag = ts->bag;
256 rpmsdb * sdbp = NULL;
258 int sdbmode = O_RDONLY;
259 const char * s = NULL;
261 const char * rootDir = ts->rootDir;
263 const char * rootDir =
"/";
272 bag = ts->bag = rpmbagNew(NULL, 0);
277 sdb = (
rpmdb) (sdbp[0] ? sdbp[0]->_db : NULL);
278 sdbmode = (sdbp[0] ? sdbp[0]->dbmode : O_RDONLY);
280 if (sdb != NULL && sdbmode == dbmode) {
289 if (has_sdbpath <= 0) {
294 s =
rpmExpand(
"%{?_solve_dbpath}", NULL);
298 for (i = 0; i < ac; i++) {
302 if (av[i] == NULL || *av[i] ==
'\0')
310 xx =
rpmdbOpen(rootDir, &sdb, dbmode, (mode_t)0644);
314 const char * dn =
rpmGetPath(rootDir,
"/", fn, NULL);
325 xx = rpmbagAdd(bag, sdb, dbmode);
333 fprintf(stderr,
"<-- %s(%p, 0%o) rc %d\n", __FUNCTION__, ts, dbmode, rc);
343 static int sugcmp(
const void * a,
const void * b)
346 const char * astr = *(
const char **)a;
347 const char * bstr = *(
const char **)b;
348 return strcmp(astr, bstr);
354 rpmbag bag = ts->bag;
355 rpmsdb * sdbp = NULL;
356 const char * errstr = NULL;
357 const char * str = NULL;
361 size_t bhnamelen = 0;
371 fprintf(stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, ts, ds, data);
404 for (i = 0; i < (int)bag->nsdbp; i++) {
409 sdb = (
rpmdb) sdbp[i]->_db;
415 mi =
rpmmiInit(sdb, rpmtag, keyp, keylen);
425 hnamelen = ((xx && he->
p.
str) ? strlen(he->
p.
str) : 0);
429 if (bhnamelen > 0 && hnamelen > bhnamelen)
446 bhnamelen = hnamelen;
464 const char * qfmt =
rpmExpand(
"%{?_solve_name_fmt}", NULL);
465 if (qfmt == NULL || *qfmt ==
'\0')
482 fd =
Fopen(str,
"r.fdio");
483 if (fd == NULL ||
Ferror(fd)) {
518 if (ts->suggests != NULL && ts->nsuggests > 0) {
519 if (bsearch(&str, ts->suggests, ts->nsuggests,
520 sizeof(*ts->suggests),
sugcmp))
528 ts->suggests = (
const void **)
xrealloc(ts->suggests,
529 sizeof(*ts->suggests) * (ts->nsuggests + 2));
530 ts->suggests[ts->nsuggests] = str;
532 ts->suggests[ts->nsuggests] = NULL;
534 if (ts->nsuggests > 1)
535 qsort(ts->suggests, ts->nsuggests,
sizeof(*ts->suggests),
sugcmp);
539 fprintf(stderr,
"<-- %s(%p,%p,%p) rc %d N %s EVR %s F 0x%x\n", __FUNCTION__, ts, ds, data, rc,
rpmdsN(ds),
rpmdsEVR(ds),
rpmdsFlags(ds));
548 if (ts->availablePackages == NULL)
555 if (sugkey[0] != NULL) {
556 ts->suggests = (
const void **)
xrealloc(ts->suggests,
557 sizeof(*ts->suggests) * (ts->nsuggests + 2));
558 ts->suggests[ts->nsuggests] = sugkey[0];
561 ts->suggests[ts->nsuggests] = NULL;
563 sugkey =
_free(sugkey);
568 int (*solve) (
rpmts ts,
rpmds key,
const void * data),
569 const void * solveData)
576 ts->solveData = solveData;
584 static const char msg[] =
"rpmtsProblems";
587 if (ts->probs == NULL)
609 ts->addedPackages =
rpmalFree(ts->addedPackages);
610 ts->numAddedPackages = 0;
612 ts->erasedPackages =
rpmalFree(ts->erasedPackages);
613 ts->numErasedPackages = 0;
615 ts->suggests =
_free(ts->suggests);
637 ts->order[oc] =
rpmteFree(ts->order[oc]);
641 ts->numAddedFiles = 0;
642 ts->numErasedFiles = 0;
648 ts->numRemovedPackages = 0;
658 static unsigned int scale = (1000 * 1000);
659 if (op != NULL && op->
count > 0)
660 fprintf(stderr,
" %s %8d %6lu.%06lu MB %6lu.%06lu secs\n",
662 (
unsigned long)op->
bytes/scale, (
unsigned long)op->
bytes%scale,
715 yarnRelease(ts->_item.use);
719 yarnPossess(ts->_item.use);
726 assert(ts->txn == NULL);
731 (void) rpmbfFree(ts->rbf);
733 ts->removedPackages =
_free(ts->removedPackages);
735 ts->availablePackages =
rpmalFree(ts->availablePackages);
736 ts->numAvailablePackages = 0;
738 ts->dsi =
_free(ts->dsi);
740 if (ts->scriptFd != NULL) {
742 ts->scriptFd =
fdFree(ts->scriptFd, __FUNCTION__);
746 ts->rootDir =
_free(ts->rootDir);
747 ts->currDir =
_free(ts->currDir);
750 ts->order =
_free(ts->order);
752 ts->orderAlloced = 0;
754 ts->keyring = rpmKeyringFree(ts->keyring);
755 (void) rpmhkpFree(ts->hkp);
762 const char ** av = NULL;
780 if (_rpmtsPool == NULL) {
781 _rpmtsPool =
rpmioNewPool(
"ts",
sizeof(*ts), -1, _rpmts_debug,
786 memset(((
char *)ts)+
sizeof(ts->_item), 0,
sizeof(*ts)-
sizeof(ts->_item));
792 rpmKeyring keyring = NULL;
795 if (ts->keyring == NULL && autoload)
797 keyring = rpmKeyringLink(ts->keyring);
799 keyring = ts->keyring;
803 return (
void *)keyring;
809 rpmKeyring keyring = (rpmKeyring) _keyring;
824 ts->keyring = rpmKeyringFree(ts->keyring);
828 ts->keyring = rpmKeyringLink(keyring);
831 ts->keyring = keyring;
870 return (
rpmTSType) ((ts != NULL) ? ts->type : 0);
881 return ((ts != NULL) ? ts->arbgoal : 0);
892 int unorderedSuccessors = 0;
894 unorderedSuccessors = ts->unorderedSuccessors;
896 ts->unorderedSuccessors = first;
898 return unorderedSuccessors;
903 const char * rootDir = NULL;
905 if (ts != NULL && ts->rootDir != NULL) {
930 ts->rootDir =
_free(ts->rootDir);
932 if (rootDir == NULL) {
938 rootLen = strlen(rootDir);
941 if (!(rootLen && rootDir[rootLen - 1] ==
'/')) {
942 char * t = (
char *)
alloca(rootLen + 2);
947 ts->rootDir =
xstrdup(rootDir);
953 const char * currDir = NULL;
955 currDir = ts->currDir;
963 ts->currDir =
_free(ts->currDir);
965 ts->currDir =
xstrdup(currDir);
971 FD_t scriptFd = NULL;
973 scriptFd = ts->scriptFd;
984 if (ts->scriptFd != NULL) {
986 ts->scriptFd =
fdFree(ts->scriptFd,
"rpmtsSetScriptFd");
991 if (scriptFd != NULL)
992 ts->scriptFd =
fdLink((
void *)scriptFd,
"rpmtsSetScriptFd");
999 int selinuxEnabled = 0;
1001 selinuxEnabled = (ts->selinuxEnabled > 0);
1002 return selinuxEnabled;
1007 return (ts != NULL ? ts->chrootDone : 0);
1012 int ochrootDone = 0;
1014 ochrootDone = ts->chrootDone;
1015 if (ts->rdb != NULL)
1016 ts->rdb->db_chrootDone = chrootDone;
1017 ts->chrootDone = chrootDone;
1047 static int oneshot = 0;
1049 const char * fn =
rpmGetPath(
"%{?_rpmds_sysinfo_path}", NULL);
1067 rpmDiskSpaceInfo dsi;
1074 if (ts->filesystems != NULL)
1079 D_(
" i dev bsize bavail iavail mount point\n"));
1082 if (rc || ts->filesystems == NULL || ts->filesystemCount == 0)
1087 ts->dsi =
_free(ts->dsi);
1088 ts->dsi = (rpmDiskSpaceInfo)
xcalloc((ts->filesystemCount + 1),
sizeof(*ts->dsi));
1093 for (i = 0; (i < ts->filesystemCount) && dsi; i++, dsi++) {
1094 #if STATFS_IN_SYS_STATVFS
1096 memset(&sfb, 0,
sizeof(sfb));
1097 rc = statvfs(ts->filesystems[i], &sfb);
1100 memset(&sfb, 0,
sizeof(sfb));
1107 rc = statfs(ts->filesystems[i], &sfb,
sizeof(sfb), 0);
1109 rc = statfs(ts->filesystems[i], &sfb);
1115 rc = stat(ts->filesystems[i], &sb);
1118 dsi->dev = sb.st_dev;
1120 #if STATFS_IN_SYS_STATVFS
1121 dsi->f_frsize = sfb.f_frsize;
1122 #if defined(RPM_OS_AIX)
1125 dsi->f_fsid = sfb.f_fsid;
1127 dsi->f_flag = sfb.f_flag;
1128 dsi->f_favail = (
long long) sfb.f_favail;
1129 dsi->f_namemax = sfb.f_namemax;
1130 #elif defined(__APPLE__) && defined(__MACH__) && !defined(_SYS_STATVFS_H_)
1132 dsi->f_namemax = pathconf(ts->filesystems[i], _PC_NAME_MAX);
1133 #elif defined(__OpenBSD__)
1135 dsi->f_namemax = pathconf(ts->filesystems[i], _PC_NAME_MAX);
1137 dsi->f_fsid = sfb.f_fsid;
1138 dsi->f_namemax = sfb.f_namelen;
1141 dsi->f_bsize = sfb.f_bsize;
1142 dsi->f_blocks = (
unsigned long long)sfb.f_blocks;
1143 dsi->f_bfree = (
unsigned long long)sfb.f_bfree;
1144 dsi->f_files = (
unsigned long long)sfb.f_files;
1145 dsi->f_ffree = (
unsigned long long)sfb.f_ffree;
1149 #ifdef STATFS_HAS_F_BAVAIL
1150 dsi->f_bavail = (
long long)(sfb.f_bavail ? sfb.f_bavail : 1);
1151 if (sfb.f_ffree > 0 && sfb.f_files > 0 && sfb.f_favail > 0)
1152 dsi->f_favail = (
long long)sfb.f_favail;
1154 dsi->f_favail = !(sfb.f_ffree == 0 && sfb.f_files == 0)
1155 ? (
signed long long) sfb.f_ffree : -1;
1161 dsi->f_bavail = sfb.f_blocks - sfb.f_bfree;
1163 dsi->f_favail = !(sfb.f_ffree == 0 && sfb.f_files == 0)
1167 #if !defined(ST_RDONLY)
1171 (
unsigned)i, (
unsigned) dsi->dev, (
unsigned) dsi->f_bsize,
1172 (
signed long) dsi->f_bavail, (
signed long) dsi->f_favail,
1173 ((dsi->f_flag &
ST_RDONLY) ?
"ro" :
"rw"),
1174 ts->filesystems[i]);
1184 rpmDiskSpaceInfo dsi;
1189 while (dsi->f_bsize && dsi->dev != dev)
1191 if (dsi->f_bsize == 0)
1197 bneeded = BLOCK_ROUND(fileSize, dsi->f_bsize);
1204 dsi->bneeded += bneeded;
1213 dsi->bneeded += bneeded;
1214 dsi->bneeded -= BLOCK_ROUND(prevSize, dsi->f_bsize);
1219 dsi->bneeded -= bneeded;
1227 dsi->bneeded -= BLOCK_ROUND(fixupSize, dsi->f_bsize);
1232 rpmDiskSpaceInfo dsi;
1237 if (ts->filesystems == NULL || ts->filesystemCount == 0)
1248 for (i = 0; i < ts->filesystemCount; i++, dsi++) {
1250 if (dsi->f_bavail > 0 && adj_fs_blocks(dsi->bneeded) > dsi->f_bavail) {
1251 if (dsi->bneeded != dsi->obneeded) {
1254 ts->filesystems[i], NULL, NULL,
1255 (adj_fs_blocks(dsi->bneeded) - dsi->f_bavail) * dsi->f_bsize);
1256 dsi->obneeded = dsi->bneeded;
1260 if (dsi->f_favail > 0 && adj_fs_blocks(dsi->ineeded) > dsi->f_favail) {
1261 if (dsi->ineeded != dsi->oineeded) {
1264 ts->filesystems[i], NULL, NULL,
1265 (adj_fs_blocks(dsi->ineeded) - dsi->f_favail));
1266 dsi->oineeded = dsi->ineeded;
1270 if ((dsi->bneeded || dsi->ineeded) && (dsi->f_flag &
ST_RDONLY)) {
1273 ts->filesystems[i], NULL, NULL, 0);
1283 if (ts && ts->notify) {
1297 ptr = ts->notify(h, what, amount, total, cbkey, ts->notifyData);
1309 if (ts != NULL && ts->order != NULL) {
1310 nelements = ts->orderCount;
1318 if (ts != NULL && ts->order != NULL) {
1319 if (ix >= 0 && ix < ts->orderCount)
1336 transFlags = ts->transFlags;
1349 otransFlags = ts->transFlags;
1356 ts->transFlags = transFlags;
1363 return (
rpmdepFlags) (ts != NULL ? ts->depFlags : 0);
1370 odepFlags = ts->depFlags;
1371 ts->depFlags = depFlags;
1385 Spec ospec = ts->spec;
1395 return ts->relocateElement;
1401 rpmte orelocateElement = ts->relocateElement;
1403 ts->relocateElement = relocateElement;
1405 return orelocateElement;
1425 return (ts != NULL ? ts->dbmode : 0);
1432 odbmode = ts->dbmode;
1433 ts->dbmode = dbmode;
1440 return (ts != NULL ? ts->color : 0);
1455 return (ts != NULL ? ts->prefcolor : 0);
1462 ts->notify = notify;
1463 ts->notifyData = notifyData;
1473 memset(&ts->ops, 0,
sizeof(ts->ops));
1477 ts->filesystemCount = 0;
1478 ts->filesystems = NULL;
1482 ts->solveData = NULL;
1484 ts->suggests = NULL;
1491 ts->dbmode = O_RDONLY;
1494 ts->scriptFd = NULL;
1495 {
struct timeval tv;
1496 xx = gettimeofday(&tv, NULL);
1504 if (!ts->prefcolor) ts->prefcolor = 0x2;
1507 ts->numRemovedPackages = 0;
1508 ts->allocedRemovedPackages = ts->delta;
1509 ts->removedPackages = (uint32_t *)
xcalloc(ts->allocedRemovedPackages,
1510 sizeof(*ts->removedPackages));
1518 ts->numAddedPackages = 0;
1519 ts->addedPackages = NULL;
1521 ts->numErasedPackages = 0;
1522 ts->erasedPackages = NULL;
1524 ts->numAvailablePackages = 0;
1525 ts->availablePackages = NULL;
1527 ts->orderAlloced = 0;
1540 ts->arbgoal = 0xffffffff;