11 #define _RPMDB_INTERNAL
14 #define _RPMEVR_INTERNAL
23 #define _RPMTE_INTERNAL
26 #define _RPMTS_INTERNAL
33 #if STATFS_IN_SYS_STATVFS
35 #if defined(__LCLINT__)
37 extern int statvfs (
const char *
file,
struct statvfs * buf)
43 # include <sys/statvfs.h>
46 # if STATFS_IN_SYS_VFS
49 # if STATFS_IN_SYS_MOUNT
50 # include <sys/mount.h>
52 # if STATFS_IN_SYS_STATFS
53 # include <sys/statfs.h>
82 fprintf(stderr,
"--> ts %p -- %d %s at %s:%u\n", ts, ts->nrefs, msg, fn, ln);
93 fprintf(stderr,
"--> ts %p ++ %d %s at %s:%u\n", ts, ts->nrefs, msg, fn, ln);
102 if (ts->rdb != NULL) {
116 if (ts->rdb != NULL && ts->dbmode == dbmode)
124 rc =
rpmdbOpen(ts->rootDir, &ts->rdb, ts->dbmode, 0644);
127 dn =
rpmGetPath(ts->rootDir,
"%{_dbpath}", NULL);
129 _(
"cannot open Packages database in %s\n"), dn);
137 void *lock = rpmtsAcquireLock(ts);
139 lock = rpmtsFreeLock(lock);
145 void *lock = rpmtsAcquireLock(ts);
151 lock = rpmtsFreeLock(lock);
162 const void * keyp,
size_t keylen)
165 const char * arch = NULL;
168 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++)
250 const char * pubkeysource = NULL;
253 if (sig == NULL || dig == NULL || sigp == NULL || pubp == NULL)
257 fprintf(stderr,
"==> find sig id %08x %08x ts pubkey id %08x %08x\n",
263 if (memcmp(sigp->
signid, ts->pksignid,
sizeof(ts->pksignid))) {
265 fprintf(stderr,
"*** free pkt %p[%d] id %08x %08x\n", ts->pkpkt, ts->pkpktlen,
pgpGrab(ts->pksignid, 4),
pgpGrab(ts->pksignid+4, 4));
267 ts->pkpkt =
_free(ts->pkpkt);
269 memset(ts->pksignid, 0,
sizeof(ts->pksignid));
273 if (ts->pkpkt == NULL) {
282 const char ** pubkeys;
291 || b64decode(pubkeys[ix], (
void **) &ts->pkpkt, &ts->pkpktlen))
302 sprintf(hnum,
"h#%d", hx);
305 ts->pkpkt =
_free(ts->pkpkt);
312 if (ts->pkpkt == NULL) {
313 const char * fn =
rpmExpand(
"%{_hkp_keyserver_query}",
317 if (fn && *fn !=
'%') {
323 ts->pkpkt =
_free(ts->pkpkt);
327 pubkeysource =
xstrdup(
"keyserver");
334 if (ts->pkpkt == NULL) {
335 const char * fn =
rpmExpand(
"%{_gpg_pubkey}", NULL);
338 if (fn && *fn !=
'%')
342 ts->pkpkt =
_free(ts->pkpkt);
345 pubkeysource =
xstrdup(
"macro");
351 if (ts->pkpkt == NULL || ts->pkpktlen == 0)
355 xx =
pgpPrtPkts(ts->pkpkt, ts->pkpktlen, dig, 0);
369 memcpy(ts->pksignid, pubp->
signid,
sizeof(ts->pksignid));
383 pubkeysource =
_free(pubkeysource);
385 ts->pkpkt =
_free(ts->pkpkt);
395 if (ts->sdb != NULL) {
407 static int has_sdbpath = -1;
410 if (ts->sdb != NULL && ts->sdbmode == dbmode)
417 if (has_sdbpath <= 0)
422 rc =
rpmdbOpen(ts->rootDir, &ts->sdb, ts->sdbmode, 0644);
425 dn =
rpmGetPath(ts->rootDir,
"%{_dbpath}", NULL);
427 _(
"cannot open Solve database in %s\n"), dn);
443 static int sugcmp(
const void * a,
const void * b)
447 const char * astr = *(
const char **)a;
448 const char * bstr = *(
const char **)b;
450 return strcmp(astr, bstr);
457 const char * str = NULL;
462 size_t bhnamelen = 0;
471 if (ts->goal != TSM_INSTALL)
489 if (ts->sdb == NULL) {
510 hnamelen = strlen(hname);
515 if (hnamelen > bhnamelen)
530 bhnamelen = hnamelen;
539 qfmt =
rpmExpand(
"%{?_solve_name_fmt}", NULL);
540 if (qfmt == NULL || *qfmt ==
'\0')
554 fd =
Fopen(str,
"r");
555 if (fd == NULL ||
Ferror(fd)) {
589 if (ts->suggests != NULL && ts->nsuggests > 0) {
590 if (bsearch(&str, ts->suggests, ts->nsuggests,
591 sizeof(*ts->suggests),
sugcmp))
599 ts->suggests =
xrealloc(ts->suggests,
600 sizeof(*ts->suggests) * (ts->nsuggests + 2));
601 ts->suggests[ts->nsuggests] = str;
603 ts->suggests[ts->nsuggests] = NULL;
605 if (ts->nsuggests > 1)
606 qsort(ts->suggests, ts->nsuggests,
sizeof(*ts->suggests),
sugcmp);
620 if (ts->availablePackages == NULL)
627 if (sugkey[0] != NULL) {
628 ts->suggests =
xrealloc(ts->suggests,
629 sizeof(*ts->suggests) * (ts->nsuggests + 2));
630 ts->suggests[ts->nsuggests] = sugkey[0];
633 ts->suggests[ts->nsuggests] = NULL;
635 sugkey =
_free(sugkey);
642 int (*solve) (
rpmts ts,
rpmds key,
const void * data),
643 const void * solveData)
651 ts->solveData = solveData;
687 ts->addedPackages =
rpmalFree(ts->addedPackages);
688 ts->numAddedPackages = 0;
690 ts->erasedPackages =
rpmalFree(ts->erasedPackages);
691 ts->numErasedPackages = 0;
693 ts->suggests =
_free(ts->suggests);
715 ts->order[oc] =
rpmteFree(ts->order[oc]);
724 ts->numRemovedPackages = 0;
734 static unsigned int scale = (1000 * 1000);
735 if (op != NULL && op->
count > 0)
736 fprintf(stderr,
" %s %8d %6lu.%06lu MB %6lu.%06lu secs\n",
738 (
unsigned long)op->
bytes/scale, (
unsigned long)op->
bytes%scale,
788 ts->removedPackages =
_free(ts->removedPackages);
790 ts->availablePackages =
rpmalFree(ts->availablePackages);
791 ts->numAvailablePackages = 0;
793 ts->dsi =
_free(ts->dsi);
795 if (ts->scriptFd != NULL) {
796 ts->scriptFd =
fdFree(ts->scriptFd,
"rpmtsFree");
799 ts->rootDir =
_free(ts->rootDir);
800 ts->currDir =
_free(ts->currDir);
803 ts->order =
_free(ts->order);
805 ts->orderAlloced = 0;
807 if (ts->pkpkt != NULL)
808 ts->pkpkt =
_free(ts->pkpkt);
810 memset(ts->pksignid, 0,
sizeof(ts->pksignid));
828 vsflags = ts->vsflags;
836 ovsflags = ts->vsflags;
837 ts->vsflags = vsflags;
859 return ((ts != NULL) ? ts->type : 0);
870 return ((ts != NULL) ? ts->arbgoal : 0);
881 int unorderedSuccessors = 0;
883 unorderedSuccessors = ts->unorderedSuccessors;
885 ts->unorderedSuccessors = first;
887 return unorderedSuccessors;
892 const char * rootDir = NULL;
895 if (ts != NULL && ts->rootDir != NULL) {
920 ts->rootDir =
_free(ts->rootDir);
922 if (rootDir == NULL) {
928 rootLen = strlen(rootDir);
932 if (!(rootLen && rootDir[rootLen - 1] ==
'/')) {
933 char * t =
alloca(rootLen + 2);
939 ts->rootDir =
xstrdup(rootDir);
945 const char * currDir = NULL;
947 currDir = ts->currDir;
955 ts->currDir =
_free(ts->currDir);
957 ts->currDir =
xstrdup(currDir);
963 FD_t scriptFd = NULL;
965 scriptFd = ts->scriptFd;
976 if (ts->scriptFd != NULL) {
977 ts->scriptFd =
fdFree(ts->scriptFd,
"rpmtsSetScriptFd");
981 if (scriptFd != NULL)
982 ts->scriptFd =
fdLink((
void *)scriptFd,
"rpmtsSetScriptFd");
989 return (ts != NULL ? (ts->selinuxEnabled > 0) : 0);
994 return (ts != NULL ? ts->chrootDone : 0);
1001 ochrootDone = ts->chrootDone;
1002 if (ts->rdb != NULL)
1003 ts->rdb->db_chrootDone = chrootDone;
1004 ts->chrootDone = chrootDone;
1011 return ( (ts && ts->sx ?
rpmsxLink(ts->sx, __func__) : NULL) );
1049 sigtag = ts->sigtag;
1057 sigtype = ts->sigtype;
1063 const void * sig = NULL;
1073 siglen = ts->siglen;
1081 if (ts->sig && ts->sigtype)
1083 ts->sigtag = sigtag;
1084 ts->sigtype = (sig ? sigtype : 0);
1088 ts->siglen = siglen;
1096 if (ts->dig == NULL)
1099 if (ts->dig == NULL)
1107 if (dig == NULL)
return NULL;
1116 if (dig == NULL)
return NULL;
1136 return (ts != NULL ? ts->PRCO : NULL);
1142 rpmDiskSpaceInfo dsi;
1149 if (ts->filesystems != NULL)
1154 D_(
" i dev bsize bavail iavail mount point\n"));
1157 if (rc || ts->filesystems == NULL || ts->filesystemCount <= 0)
1162 ts->dsi =
_free(ts->dsi);
1163 ts->dsi =
xcalloc((ts->filesystemCount + 1),
sizeof(*ts->dsi));
1168 for (i = 0; (i < ts->filesystemCount) && dsi; i++, dsi++) {
1169 #if STATFS_IN_SYS_STATVFS
1171 memset(&sfb, 0,
sizeof(sfb));
1172 rc = statvfs(ts->filesystems[i], &sfb);
1175 memset(&sfb, 0,
sizeof(sfb));
1182 rc = statfs(ts->filesystems[i], &sfb,
sizeof(sfb), 0);
1184 rc = statfs(ts->filesystems[i], &sfb);
1190 rc = stat(ts->filesystems[i], &sb);
1193 dsi->dev = sb.st_dev;
1195 #if STATFS_IN_SYS_STATVFS
1196 dsi->f_frsize = sfb.f_frsize;
1197 dsi->f_fsid = sfb.f_fsid;
1198 dsi->f_flag = sfb.f_flag;
1199 dsi->f_favail = sfb.f_favail;
1200 dsi->f_namemax = sfb.f_namemax;
1202 dsi->f_fsid = sfb.f_fsid;
1203 dsi->f_namemax = sfb.f_namelen;
1206 dsi->f_bsize = sfb.f_bsize;
1207 dsi->f_blocks = sfb.f_blocks;
1208 dsi->f_bfree = sfb.f_bfree;
1209 dsi->f_files = sfb.f_files;
1210 dsi->f_ffree = sfb.f_ffree;
1214 #ifdef STATFS_HAS_F_BAVAIL
1215 dsi->f_bavail = sfb.f_bavail ? sfb.f_bavail : 1;
1216 if (sfb.f_ffree > 0 && sfb.f_files > 0 && sfb.f_favail > 0)
1217 dsi->f_favail = sfb.f_favail;
1219 dsi->f_favail = !(sfb.f_ffree == 0 && sfb.f_files == 0)
1226 dsi->f_bavail = sfb.f_blocks - sfb.f_bfree;
1228 dsi->f_favail = !(sfb.f_ffree == 0 && sfb.f_files == 0)
1232 #if !defined(ST_RDONLY)
1236 i, (
unsigned) dsi->dev, (
unsigned) dsi->f_bsize,
1237 (
signed long) dsi->f_bavail, (
signed long) dsi->f_favail,
1238 ((dsi->f_flag &
ST_RDONLY) ?
"ro" :
"rw"),
1239 ts->filesystems[i]);
1248 rpmDiskSpaceInfo dsi;
1249 unsigned long long bneeded;
1253 while (dsi->f_bsize && dsi->dev != dev)
1255 if (dsi->f_bsize == 0)
1261 bneeded = BLOCK_ROUND(fileSize, dsi->f_bsize);
1268 dsi->bneeded += bneeded;
1277 dsi->bneeded += bneeded;
1278 dsi->bneeded -= BLOCK_ROUND(prevSize, dsi->f_bsize);
1283 dsi->bneeded -= bneeded;
1291 dsi->bneeded -= BLOCK_ROUND(fixupSize, dsi->f_bsize);
1296 rpmDiskSpaceInfo dsi;
1301 if (ts->filesystems == NULL || ts->filesystemCount <= 0)
1312 for (i = 0; i < ts->filesystemCount; i++, dsi++) {
1314 if (dsi->f_bavail > 0 && adj_fs_blocks(dsi->bneeded) > dsi->f_bavail) {
1317 ts->filesystems[i], NULL, NULL,
1318 (adj_fs_blocks(dsi->bneeded) - dsi->f_bavail) * dsi->f_bsize);
1321 if (dsi->f_favail > 0 && adj_fs_blocks(dsi->ineeded) > dsi->f_favail) {
1324 ts->filesystems[i], NULL, NULL,
1325 (adj_fs_blocks(dsi->ineeded) - dsi->f_favail));
1328 if ((dsi->bneeded || dsi->ineeded) && (dsi->f_flag &
ST_RDONLY)) {
1331 ts->filesystems[i], NULL, NULL, 0);
1338 rpmCallbackType what,
unsigned long long amount,
unsigned long long total)
1341 if (ts && ts->notify && te) {
1342 assert(!(te->type ==
TR_ADDED && te->h == NULL));
1345 ptr = ts->notify(te->h, what, amount, total,
1356 if (ts != NULL && ts->order != NULL) {
1357 nelements = ts->orderCount;
1365 if (ts != NULL && ts->order != NULL) {
1366 if (ix >= 0 && ix < ts->orderCount)
1376 return (ts != NULL ? ts->ignoreSet : 0);
1381 return (ts != NULL ? ts->transFlags : 0);
1388 otransFlags = ts->transFlags;
1389 ts->transFlags = transFlags;
1396 return (ts != NULL ? ts->depFlags : 0);
1403 odepFlags = ts->depFlags;
1404 ts->depFlags = depFlags;
1418 Spec ospec = ts->spec;
1428 return ts->relocateElement;
1434 rpmte orelocateElement = ts->relocateElement;
1436 ts->relocateElement = relocateElement;
1438 return orelocateElement;
1443 return (ts != NULL ? ts->color : 0);
1458 return (ts != NULL ? ts->prefcolor : 0);
1476 ts->notify = notify;
1477 ts->notifyData = notifyData;
1488 memset(&ts->ops, 0,
sizeof(ts->ops));
1491 ts->goal = TSM_UNKNOWN;
1492 ts->filesystemCount = 0;
1493 ts->filesystems = NULL;
1497 ts->solveData = NULL;
1499 ts->suggests = NULL;
1502 {
const char * fn =
rpmGetPath(
"%{?_rpmds_sysinfo_path}", NULL);
1509 ts->sdbmode = O_RDONLY;
1512 ts->dbmode = O_RDONLY;
1514 ts->scriptFd = NULL;
1515 ts->tid = (
int_32) time(NULL);
1520 if (!ts->prefcolor) ts->prefcolor = 0x2;
1522 ts->numRemovedPackages = 0;
1523 ts->allocedRemovedPackages = ts->delta;
1524 ts->removedPackages =
xcalloc(ts->allocedRemovedPackages,
1525 sizeof(*ts->removedPackages));
1533 ts->numAddedPackages = 0;
1534 ts->addedPackages = NULL;
1536 ts->numErasedPackages = 0;
1537 ts->erasedPackages = NULL;
1539 ts->numAvailablePackages = 0;
1540 ts->availablePackages = NULL;
1542 ts->orderAlloced = 0;
1553 memset(ts->pksignid, 0,
sizeof(ts->pksignid));
1557 ts->arbgoal = 0xffffffff;