#include "system.h"
#include <rpmlib.h>
#include <rpmmacro.h>
#include "depends.h"
#include "rpmdb.h"
#include "debug.h"
Go to the source code of this file.
Data Structures | |
struct | orderListIndex |
struct | badDeps_s |
Typedefs | |
typedef int(*) | dbrecMatch_t (Header h, const char *reqName, const char *reqEVR, int reqFlags) |
Functions | |
int | headerNVR (Header h, const char **np, const char **vp, const char **rp) |
Return name, version, release strings from header. | |
static char * | printDepend (const char *depend, const char *key, const char *keyEVR, int keyFlags) |
Return formatted dependency string. | |
static void | alFreeIndex (availableList al) |
Destroy available item index. | |
static void | alCreate (availableList al) |
Initialize available packckages, items, and directories list. | |
static void | alFree (availableList al) |
Free available packages, items, and directories members. | |
static int | dirInfoCompare (const void *one, const void *two) |
Compare two directory info entries by name (qsort/bsearch). | |
static struct availablePackage * | alAddPackage (availableList al, Header h, const void *key, FD_t fd, rpmRelocation *relocs) |
Add package to available list. | |
static int | indexcmp (const void *one, const void *two) |
Compare two available index entries by name (qsort/bsearch). | |
static void | alMakeIndex (availableList al) |
Generate index for available list. | |
static void | parseEVR (char *evr, const char **ep, const char **vp, const char **rp) |
Split EVR into epoch, version, and release components. | |
int | rpmRangesOverlap (const char *AName, const char *AEVR, int AFlags, const char *BName, const char *BEVR, int BFlags) |
Compare two versioned dependency ranges, looking for overlap. | |
static int | rangeMatchesDepFlags (Header h, const char *reqName, const char *reqEVR, int reqFlags) |
int | headerMatchesDepFlags (Header h, const char *reqName, const char *reqEVR, int reqFlags) |
Compare package name-version-release from header with dependency, looking for overlap. | |
rpmTransactionSet | rpmtransCreateSet (rpmdb rpmdb, const char *rootDir) |
Create an empty transaction set. | |
static int | intcmp (const void *a, const void *b) |
Compare removed package instances (qsort/bsearch). | |
static int | removePackage (rpmTransactionSet ts, int dboffset, int depends) |
Add removed package instance to ordered transaction set. | |
int | rpmtransAddPackage (rpmTransactionSet ts, Header h, FD_t fd, const void *key, int upgrade, rpmRelocation *relocs) |
Add package to be installed to unordered transaction set. | |
void | rpmtransAvailablePackage (rpmTransactionSet ts, Header h, const void *key) |
Add package to universe of possible packages to install in transaction set. | |
int | rpmtransRemovePackage (rpmTransactionSet ts, int dboffset) |
Add package to be removed to unordered transaction set. | |
rpmTransactionSet | rpmtransFree (rpmTransactionSet ts) |
Destroy transaction set. | |
rpmDependencyConflict | rpmdepFreeConflicts (rpmDependencyConflict conflicts, int numConflicts) |
Destroy dependency conflicts storage. | |
static struct availablePackage ** | alAllFileSatisfiesDepend (const availableList al, const char *keyType, const char *fileName) |
Check added package file lists for package(s) that provide a file. | |
static struct availablePackage ** | alAllSatisfiesDepend (const availableList al, const char *keyType, const char *keyDepend, const char *keyName, const char *keyEVR, int keyFlags) |
Check added package file lists for package(s) that have a provide. | |
static struct availablePackage * | alSatisfiesDepend (const availableList al, const char *keyType, const char *keyDepend, const char *keyName, const char *keyEVR, int keyFlags) |
Check added package file lists for first package that has a provide. | |
static int | unsatisfiedDepend (rpmTransactionSet ts, const char *keyType, const char *keyDepend, const char *keyName, const char *keyEVR, int keyFlags, struct availablePackage ***suggestion) |
Check key for an unsatisfied dependency. | |
static int | checkPackageDeps (rpmTransactionSet ts, problemsSet psp, Header h, const char *keyName, uint_32 multiLib) |
Check header requires/conflicts against against installed+added packages. | |
static int | checkPackageSet (rpmTransactionSet ts, problemsSet psp, const char *key, rpmdbMatchIterator mi) |
Check dependency against installed packages. | |
static int | checkDependentPackages (rpmTransactionSet ts, problemsSet psp, const char *key) |
Erasing: check name/provides/filename key against requiredby matches. | |
static int | checkDependentConflicts (rpmTransactionSet ts, problemsSet psp, const char *key) |
Adding: check name/provides key against conflicts matches. | |
static int | ignoreDep (const struct availablePackage *p, const struct availablePackage *q) |
Check for dependency relations to be ignored. | |
static void | markLoop (tsortInfo tsi, struct availablePackage *q) |
Recursively mark all nodes with their predecessors. | |
static const char *const | identifyDepend (int_32 f) |
static const char * | zapRelation (struct availablePackage *q, struct availablePackage *p, int zap, int *nzaps) |
Find (and eliminate co-requisites) "q <- p" relation in dependency loop. | |
static int | addRelation (const rpmTransactionSet ts, struct availablePackage *p, unsigned char *selected, int j) |
Record next "q <- p" relation (i.e. | |
static int | orderListIndexCmp (const void *one, const void *two) |
Compare ordered list entries by index (qsort/bsearch). | |
static void | addQ (struct availablePackage *p, struct availablePackage **qp, struct availablePackage **rp) |
Add element to list sorting by initial successor count. | |
int | rpmdepOrder (rpmTransactionSet ts) |
Determine package order in a transaction set according to dependencies. | |
static int | rpmdbCloseDBI (rpmdb db, int rpmtag) |
Close a single database index. | |
int | rpmdepCheck (rpmTransactionSet ts, rpmDependencyConflict *conflicts, int *numConflicts) |
Check that all dependencies can be resolved. | |
Variables | |
static int | _depends_debug = 0 |
static int | _cacheDependsRC = 1 |
const char * | rpmNAME = PACKAGE |
const char * | rpmEVR = VERSION |
int | rpmFLAGS = RPMSENSE_EQUAL |
static struct badDeps_s * | badDeps = NULL |
Definition in file depends.c.
typedef int(*) dbrecMatch_t(Header h, const char *reqName, const char *reqEVR, int reqFlags) |
static void addQ | ( | struct availablePackage * | p, | |
struct availablePackage ** | qp, | |||
struct availablePackage ** | rp | |||
) | [static] |
Add element to list sorting by initial successor count.
p | new element |
qp | address of first element | |
rp | address of last element |
Definition at line 1884 of file depends.c.
References availablePackage::tsi, tsortInfo_s::tsi_qcnt, and tsortInfo_s::tsi_reqx.
Referenced by rpmdepOrder().
static int addRelation | ( | const rpmTransactionSet | ts, | |
struct availablePackage * | p, | |||
unsigned char * | selected, | |||
int | j | |||
) | [inline, static] |
Record next "q <- p" relation (i.e.
"p" requires "q").
ts | transaction set | |
p | predecessor (i.e. package that "Requires: q") | |
selected | boolean package selected array | |
j | relation index |
Definition at line 1818 of file depends.c.
References rpmTransactionSet_s::addedPackages, alSatisfiesDepend(), availablePackage::depth, ignoreDep(), availableList_s::list, availablePackage::requireFlags, availablePackage::requires, availablePackage::requiresEVR, availablePackage::tsi, tsortInfo_s::tsi_next, tsortInfo_s::tsi_qcnt, and xmalloc().
Referenced by rpmdepOrder().
static struct availablePackage* alAddPackage | ( | availableList | al, | |
Header | h, | |||
const void * | key, | |||
FD_t | fd, | |||
rpmRelocation * | relocs | |||
) | [static] |
Add package to available list.
al | available list | |
h | package header | |
key | package private data | |
fd | package file handle | |
relocs | package file relocations |
Definition at line 241 of file depends.c.
References availableList_s::alloced, availableList_s::delta, availablePackage::depth, availablePackage::epoch, availablePackage::h, headerFreeData(), headerGetEntryMinMemory(), headerLink(), headerNVR(), availableList_s::list, availablePackage::multiLib, availablePackage::name, availablePackage::npreds, availablePackage::provideFlags, availablePackage::provides, availablePackage::providesCount, availablePackage::providesEVR, availablePackage::release, RPMTAG_EPOCH, RPMTAG_MULTILIBS, RPMTAG_PROVIDENAME, rpmVersionCompare(), availableList_s::size, availablePackage::tsi, availablePackage::version, and xrealloc().
Referenced by rpmtransAddPackage(), and rpmtransAvailablePackage().
static struct availablePackage** alAllFileSatisfiesDepend | ( | const availableList | al, | |
const char * | keyType, | |||
const char * | fileName | |||
) | [static] |
Check added package file lists for package(s) that provide a file.
al | available list | |
keyType | type of dependency | |
fileName | file name to search for |
Definition at line 963 of file depends.c.
References _, _free(), dirInfoCompare(), dirInfo_s::dirName, dirName, dirInfo_s::dirNameLen, availableList_s::dirs, isFileMULTILIB, availableList_s::list, availablePackage::multiLib, availableList_s::numDirs, RPMMESS_DEBUG, rpmMessage, xrealloc(), and xstrdup().
Referenced by alAllSatisfiesDepend().
static struct availablePackage** alAllSatisfiesDepend | ( | const availableList | al, | |
const char * | keyType, | |||
const char * | keyDepend, | |||
const char * | keyName, | |||
const char * | keyEVR, | |||
int | keyFlags | |||
) | [static] |
Check added package file lists for package(s) that have a provide.
al | available list | |
keyType | type of dependency | |
keyDepend | dependency string representation | |
keyName | dependency name string | |
keyEVR | dependency [epoch:]version[-release] string | |
keyFlags | dependency logical range qualifiers |
Definition at line 1078 of file depends.c.
References _, alAllFileSatisfiesDepend(), availableIndexEntry::entry, availableIndexEntry::entryIx, availableIndexEntry::entryLen, availableIndex::index, availableList_s::index, indexcmp(), availableIndexEntry::package, availablePackage::provideFlags, availablePackage::provides, availablePackage::providesEVR, RPMMESS_DEBUG, rpmMessage, rpmRangesOverlap(), availableIndex::size, availableIndexEntry::type, and xrealloc().
Referenced by alSatisfiesDepend(), and unsatisfiedDepend().
static void alCreate | ( | availableList | al | ) | [static] |
Initialize available packckages, items, and directories list.
al | available list |
Definition at line 144 of file depends.c.
References availableList_s::alloced, availableList_s::delta, availableList_s::dirs, availableIndex::index, availableList_s::index, availableList_s::list, availableList_s::numDirs, availableIndex::size, availableList_s::size, and xcalloc().
Referenced by rpmtransCreateSet().
static void alFree | ( | availableList | al | ) | [static] |
Free available packages, items, and directories members.
al | available list |
Definition at line 162 of file depends.c.
References _free(), availablePackage::baseNames, availablePackage::fd, fdFree, availablePackage::h, headerFree(), headerFreeData(), availableList_s::list, rpmRelocation_s::newPath, rpmRelocation_s::oldPath, availablePackage::provides, availablePackage::providesEVR, availablePackage::relocs, availablePackage::requires, availablePackage::requiresEVR, availableList_s::size, availablePackage::tsi, and tsortInfo_s::tsi_next.
Referenced by rpmtransFree().
static void alFreeIndex | ( | availableList | al | ) | [static] |
Destroy available item index.
al | available list |
Definition at line 131 of file depends.c.
References _free(), availableIndex::index, availableList_s::index, and availableIndex::size.
static void alMakeIndex | ( | availableList | al | ) | [static] |
Generate index for available list.
al | available list |
Definition at line 444 of file depends.c.
References availableIndexEntry::entry, availableIndexEntry::entryIx, availableIndexEntry::entryLen, availableIndex::index, availableList_s::index, isDependsMULTILIB, availableList_s::list, availablePackage::multiLib, availableIndexEntry::package, availablePackage::provideFlags, availablePackage::provides, availablePackage::providesCount, availableList_s::size, availableIndex::size, availableIndexEntry::type, and xcalloc().
Referenced by rpmdepCheck(), and rpmdepOrder().
static struct availablePackage* alSatisfiesDepend | ( | const availableList | al, | |
const char * | keyType, | |||
const char * | keyDepend, | |||
const char * | keyName, | |||
const char * | keyEVR, | |||
int | keyFlags | |||
) | [inline, static] |
Check added package file lists for first package that has a provide.
al | available list | |
keyType | type of dependency | |
keyDepend | dependency string representation | |
keyName | dependency name string | |
keyEVR | dependency [epoch:]version[-release] string | |
keyFlags | dependency logical range qualifiers |
Definition at line 1159 of file depends.c.
References _free(), and alAllSatisfiesDepend().
Referenced by addRelation(), and unsatisfiedDepend().
static int checkDependentConflicts | ( | rpmTransactionSet | ts, | |
problemsSet | psp, | |||
const char * | key | |||
) | [static] |
Adding: check name/provides key against conflicts matches.
ts | transaction set | |
psp | dependency problems | |
key | conflicts name |
Definition at line 1599 of file depends.c.
References checkPackageSet(), rpmTransactionSet_s::rpmdb, rpmdbInitIterator(), and RPMTAG_CONFLICTNAME.
Referenced by rpmdepCheck().
static int checkDependentPackages | ( | rpmTransactionSet | ts, | |
problemsSet | psp, | |||
const char * | key | |||
) | [static] |
Erasing: check name/provides/filename key against requiredby matches.
ts | transaction set | |
psp | dependency problems | |
key | requires name |
Definition at line 1583 of file depends.c.
References checkPackageSet(), rpmTransactionSet_s::rpmdb, rpmdbInitIterator(), and RPMTAG_REQUIRENAME.
Referenced by rpmdepCheck().
static int checkPackageDeps | ( | rpmTransactionSet | ts, | |
problemsSet | psp, | |||
Header | h, | |||
const char * | keyName, | |||
uint_32 | multiLib | |||
) | [static] |
Check header requires/conflicts against against installed+added packages.
ts | transaction set | |
psp | dependency problems | |
h | header to check | |
keyName | dependency name | |
multiLib | skip multilib colored dependencies? |
Definition at line 1371 of file depends.c.
References _, _free(), problemsSet_s::alloced, rpmDependencyConflict_s::byHeader, rpmDependencyConflict_s::byName, rpmDependencyConflict_s::byRelease, rpmDependencyConflict_s::byVersion, availablePackage::h, headerFreeData(), headerGetEntryMinMemory(), headerLink(), headerNVR(), isDependsMULTILIB, availablePackage::key, name, rpmDependencyConflict_s::needsFlags, rpmDependencyConflict_s::needsName, rpmDependencyConflict_s::needsVersion, problemsSet_s::num, printDepend(), problemsSet_s::problems, availablePackage::release, availablePackage::requireFlags, availablePackage::requires, availablePackage::requiresCount, availablePackage::requiresEVR, RPM_STRING_ARRAY_TYPE, RPMMESS_DEBUG, rpmMessage, RPMTAG_CONFLICTFLAGS, RPMTAG_CONFLICTNAME, RPMTAG_CONFLICTVERSION, RPMTAG_REQUIREFLAGS, RPMTAG_REQUIRENAME, RPMTAG_REQUIREVERSION, rpmDependencyConflict_s::sense, rpmDependencyConflict_s::suggestedPackages, unsatisfiedDepend(), availablePackage::version, xmalloc(), xrealloc(), and xstrdup().
Referenced by checkPackageSet(), and rpmdepCheck().
static int checkPackageSet | ( | rpmTransactionSet | ts, | |
problemsSet | psp, | |||
const char * | key, | |||
rpmdbMatchIterator | mi | |||
) | [static] |
Check dependency against installed packages.
Adding: check name/provides key against each conflict match, Erasing: check name/provides/filename key against each requiredby match.
ts | transaction set | |
psp | dependency problems | |
key | dependency name | |
mi | rpm database iterator |
Definition at line 1556 of file depends.c.
References checkPackageDeps(), availablePackage::h, rpmTransactionSet_s::numRemovedPackages, rpmTransactionSet_s::removedPackages, rpmdbFreeIterator(), rpmdbNextIterator(), and rpmdbPruneIterator().
Referenced by checkDependentConflicts(), and checkDependentPackages().
static int dirInfoCompare | ( | const void * | one, | |
const void * | two | |||
) | [static] |
Compare two directory info entries by name (qsort/bsearch).
one | 1st directory info | |
two | 2nd directory info |
Definition at line 218 of file depends.c.
References dirInfo_s::dirName, and dirInfo_s::dirNameLen.
Referenced by alAllFileSatisfiesDepend().
static const char* const identifyDepend | ( | int_32 | f | ) | [inline, static] |
Definition at line 1728 of file depends.c.
References _notpre, isLegacyPreReq, RPMSENSE_FIND_REQUIRES, RPMSENSE_SCRIPT_POST, RPMSENSE_SCRIPT_POSTUN, RPMSENSE_SCRIPT_PRE, RPMSENSE_SCRIPT_PREUN, and RPMSENSE_SCRIPT_VERIFY.
Referenced by zapRelation().
static int ignoreDep | ( | const struct availablePackage * | p, | |
const struct availablePackage * | q | |||
) | [static] |
Check for dependency relations to be ignored.
p | successor package (i.e. with Requires: ) | |
q | predecessor package (i.e. with Provides: ) |
Definition at line 1659 of file depends.c.
References _, _free(), badDeps, availablePackage::name, badDeps_s::pname, poptParseArgvString(), badDeps_s::qname, rpmExpand(), RPMMESS_DEBUG, rpmMessage, xcalloc(), and xstrdup().
Referenced by addRelation().
static int indexcmp | ( | const void * | one, | |
const void * | two | |||
) | [static] |
Compare two available index entries by name (qsort/bsearch).
one | 1st available index entry | |
two | 2nd available index entry |
Definition at line 428 of file depends.c.
References availableIndexEntry::entry, and availableIndexEntry::entryLen.
Referenced by alAllSatisfiesDepend().
static int intcmp | ( | const void * | a, | |
const void * | b | |||
) | [static] |
Compare removed package instances (qsort/bsearch).
a | 1st instance address | |
b | 2nd instance address |
Definition at line 748 of file depends.c.
Referenced by removePackage().
static void markLoop | ( | tsortInfo | tsi, | |
struct availablePackage * | q | |||
) | [static] |
Recursively mark all nodes with their predecessors.
tsi | successor chain | |
q | predecessor |
Definition at line 1711 of file depends.c.
References availablePackage::tsi, tsortInfo_s::tsi_next, and tsortInfo_s::tsi_pkg.
static int orderListIndexCmp | ( | const void * | one, | |
const void * | two | |||
) | [static] |
static void parseEVR | ( | char * | evr, | |
const char ** | ep, | |||
const char ** | vp, | |||
const char ** | rp | |||
) | [static] |
Split EVR into epoch, version, and release components.
evr | [epoch:]version[-release] string |
*ep | pointer to epoch | |
*vp | pointer to version | |
*rp | pointer to release |
Definition at line 489 of file depends.c.
References xisdigit().
Referenced by rpmRangesOverlap().
static char* printDepend | ( | const char * | depend, | |
const char * | key, | |||
const char * | keyEVR, | |||
int | keyFlags | |||
) | [static] |
Return formatted dependency string.
depend | type of dependency ("R" == Requires, "C" == Conflcts) | |
key | dependency name string | |
keyEVR | dependency [epoch:]version[-release] string | |
keyFlags | dependency logical range qualifiers |
Definition at line 62 of file depends.c.
References RPMSENSE_EQUAL, RPMSENSE_GREATER, RPMSENSE_LESS, RPMSENSE_SENSEMASK, and xmalloc().
Referenced by checkPackageDeps(), rpmRangesOverlap(), and zapRelation().
static int rangeMatchesDepFlags | ( | Header | h, | |
const char * | reqName, | |||
const char * | reqEVR, | |||
int | reqFlags | |||
) | [static] |
Definition at line 609 of file depends.c.
References headerFreeData(), headerGetEntryMinMemory(), rpmRangesOverlap(), RPMSENSE_SENSEMASK, RPMTAG_PROVIDEFLAGS, RPMTAG_PROVIDENAME, and RPMTAG_PROVIDEVERSION.
Referenced by unsatisfiedDepend().
static int removePackage | ( | rpmTransactionSet | ts, | |
int | dboffset, | |||
int | depends | |||
) | [static] |
Add removed package instance to ordered transaction set.
ts | transaction set | |
dboffset | rpm database instance | |
depends | installed package of pair (or -1 on erase) |
Definition at line 763 of file depends.c.
References rpmTransactionSet_s::allocedRemovedPackages, rpmTransactionSet_s::delta, intcmp(), rpmTransactionSet_s::numRemovedPackages, rpmTransactionSet_s::order, rpmTransactionSet_s::orderAlloced, rpmTransactionSet_s::orderCount, transactionElement_s::removed, rpmTransactionSet_s::removedPackages, transactionElement_s::type, transactionElement_s::u, and xrealloc().
Referenced by rpmtransAddPackage(), and rpmtransRemovePackage().
static int rpmdbCloseDBI | ( | rpmdb | db, | |
int | rpmtag | |||
) | [static] |
Close a single database index.
db | rpm database | |
rpmtag | rpm tag |
Definition at line 2231 of file depends.c.
References dbiClose(), dbiTags, and dbiTagsMax.
static int unsatisfiedDepend | ( | rpmTransactionSet | ts, | |
const char * | keyType, | |||
const char * | keyDepend, | |||
const char * | keyName, | |||
const char * | keyEVR, | |||
int | keyFlags, | |||
struct availablePackage *** | suggestion | |||
) | [static] |
Check key for an unsatisfied dependency.
al | available list | |
keyType | type of dependency | |
keyDepend | dependency string representation | |
keyName | dependency name string | |
keyEVR | dependency [epoch:]version[-release] string | |
keyFlags | dependency logical range qualifiers |
suggestion | possible package(s) to resolve dependency |
Definition at line 1188 of file depends.c.
References _, _cacheDependsRC, rpmTransactionSet_s::addedPackages, alAllSatisfiesDepend(), alSatisfiesDepend(), rpmTransactionSet_s::availablePackages, DBC, DBI_WRITECURSOR, dbiCclose(), dbiCopen(), dbiGet(), dbiOpen(), dbiPut(), availablePackage::h, rpmTransactionSet_s::numRemovedPackages, rangeMatchesDepFlags(), rpmTransactionSet_s::removedPackages, rpmCheckRpmlibProvides(), rpmTransactionSet_s::rpmdb, rpmdbFreeIterator(), RPMDBI_DEPENDS, rpmdbInitIterator(), rpmdbNextIterator(), rpmdbPruneIterator(), rpmGetVar(), RPMMESS_DEBUG, rpmMessage, RPMSENSE_SENSEMASK, RPMTAG_BASENAMES, RPMTAG_NAME, RPMTAG_PROVIDENAME, RPMVAR_PROVIDES, and xisspace().
Referenced by checkPackageDeps().
static const char* zapRelation | ( | struct availablePackage * | q, | |
struct availablePackage * | p, | |||
int | zap, | |||
int * | nzaps | |||
) | [static] |
Find (and eliminate co-requisites) "q <- p" relation in dependency loop.
Search all successors of q for instance of p. Format the specific relation, (e.g. p contains "Requires: q"). Unlink and free co-requisite (i.e. pure Requires: dependencies) successor node(s).
q | sucessor (i.e. package required by p) | |
p | predecessor (i.e. package that "Requires: q") | |
zap | max. no. of co-requisites to remove (-1 is all)? |
nzaps | address of no. of relations removed |
Definition at line 1760 of file depends.c.
References _, _free(), identifyDepend(), availablePackage::name, printDepend(), availablePackage::release, availablePackage::requireFlags, availablePackage::requires, availablePackage::requiresEVR, RPMMESS_DEBUG, rpmMessage, RPMSENSE_PREREQ, availablePackage::tsi, tsortInfo_s::tsi_next, tsortInfo_s::tsi_reqx, and availablePackage::version.
int _cacheDependsRC = 1 [static] |
int _depends_debug = 0 [static] |
const char* rpmEVR = VERSION |