Main Page Modules Data Structures File List Data Fields Globals Related Pages

# lib/depends.c File Reference

More...

`#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 | badDeps_s
struct | orderListIndex

## 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)
char * | printDepend (const char *depend, const char *key, const char *keyEVR, int keyFlags)
| Return formatted dependency string. More...
void | alFreeIndex (availableList al)
| Destroy available item index. More...
void | alCreate (availableList al)
| Initialize available packckages, items, and directories list. More...
void | alFree (availableList al)
| Free available packages, items, and directories members. More...
int | dirInfoCompare (const void *one, const void *two)
| Compare two directory info entries by name (qsort/bsearch). More...
availablePackage * | alAddPackage (availableList al, Header h, const void *key, FD_t fd, rpmRelocation *relocs)
| Add package to available list. More...
int | indexcmp (const void *one, const void *two)
| Compare two available index entries by name (qsort/bsearch). More...
void | alMakeIndex (availableList al)
| Generate index for available list. More...
void | parseEVR (char *evr, const char **ep, const char **vp, const char **rp)
| Split EVR into epoch, version, and release components. More...
int | rpmRangesOverlap (const char *AName, const char *AEVR, int AFlags, const char *BName, const char *BEVR, int BFlags)
int | rangeMatchesDepFlags (Header h, const char *reqName, const char *reqEVR, int reqFlags)
int | headerMatchesDepFlags (Header h, const char *reqName, const char *reqEVR, int reqFlags)
rpmTransactionSet | rpmtransCreateSet (rpmdb rpmdb, const char *rootDir)
int | intcmp (const void *a, const void *b)
| Compare removed package instances (qsort/bsearch). More...
int | removePackage (rpmTransactionSet ts, int dboffset, int depends)
| Add removed package instance to ordered transaction set. More...
int | rpmtransAddPackage (rpmTransactionSet ts, Header h, FD_t fd, const void *key, int upgrade, rpmRelocation *relocs)
void | rpmtransAvailablePackage (rpmTransactionSet ts, Header h, const void *key)
int | rpmtransRemovePackage (rpmTransactionSet ts, int dboffset)
rpmTransactionSet | rpmtransFree (rpmTransactionSet ts)
rpmDependencyConflict | rpmdepFreeConflicts (rpmDependencyConflict conflicts, int numConflicts)
availablePackage ** | alAllFileSatisfiesDepend (const availableList al, const char *keyType, const char *fileName)
| Check added package file lists for package(s) that provide a file. More...
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. More...
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. More...
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. More...
int | checkPackageDeps (rpmTransactionSet ts, problemsSet psp, Header h, const char *keyName, uint_32 multiLib)
| Check header requires/conflicts against against installed+added packages. More...
int | checkPackageSet (rpmTransactionSet ts, problemsSet psp, const char *key, rpmdbMatchIterator mi)
| Check dependency against installed packages. More...
int | checkDependentPackages (rpmTransactionSet ts, problemsSet psp, const char *key)
| Erasing: check name/provides/filename key against requiredby matches. More...
int | checkDependentConflicts (rpmTransactionSet ts, problemsSet psp, const char *key)
| Adding: check name/provides key against conflicts matches. More...
int | ignoreDep (const struct availablePackage *p, const struct availablePackage *q)
| Check for dependency relations to be ignored. More...
void | markLoop (tsortInfo tsi, struct availablePackage *q)
| Recursively mark all nodes with their predecessors. More...
const char *const | identifyDepend (int_32 f)
const char * | zapRelation (struct availablePackage *q, struct availablePackage *p, int zap, int *nzaps)
| Find (and eliminate co-requisites) "q <- p" relation in dependency loop. More...
int | addRelation (const rpmTransactionSet ts, struct availablePackage *p, unsigned char *selected, int j)
| Record next "q <- p" relation (i.e. More...
int | orderListIndexCmp (const void *one, const void *two)
| Compare ordered list entries by index (qsort/bsearch). More...
void | addQ (struct availablePackage *p, struct availablePackage **qp, struct availablePackage **rp)
| Add element to list sorting by initial successor count. More...
int | rpmdepOrder (rpmTransactionSet ts)
int | rpmdbCloseDBI (rpmdb db, int rpmtag)
| Close a single database index. More...
int | rpmdepCheck (rpmTransactionSet ts, rpmDependencyConflict *conflicts, int *numConflicts)

## Variables

int | _depends_debug = 0
int | _cacheDependsRC = 1
const char * | rpmNAME = PACKAGE
const char * | rpmEVR = VERSION
int | rpmFLAGS = RPMSENSE_EQUAL
badDeps_s * | badDeps = NULL

## Detailed Description

Definition in file depends.c.

## Typedef Documentation

typedef int(* dbrecMatch_t)(Header h, const char *reqName, const char * reqEVR, int reqFlags)

| Definition at line 606 of file depends.c.

## Function Documentation

void addQ | ( | struct availablePackage * | p,
|  | struct availablePackage ** | qp,
|  | struct availablePackage ** | rp
| ) | `[static]`

Add element to list sorting by initial successor count.

Parameters:

  p | new element

Return values:

  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.

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").

Parameters:

  ts | transaction set
  p | predecessor (i.e. package that "Requires: q")
  selected | boolean package selected array
  j | relation index

Returns:
  0 always

Definition at line 1818 of file depends.c.

References alSatisfiesDepend, availablePackage::depth, ignoreDep, availablePackage::tsi, tsortInfo_s::tsi_next, tsortInfo_s::tsi_qcnt, and xmalloc.

Referenced by rpmdepOrder.

struct availablePackage* alAddPackage | ( | availableList | al,
|  | Header | h,
|  | const void * | key,
|  | FD_t | fd,
|  | rpmRelocation * | relocs
| ) | `[static]`

Add package to available list.

Parameters:

  al | available list
  h | package header
  key | package private data
  fd | package file handle
  relocs | package file relocations

Returns:
  available package pointer

Definition at line 241 of file depends.c.

References alFreeIndex, alloca, availablePackage::baseNames, availablePackage::depth, dirInfoCompare, dirInfo_s::dirName, dirInfo_s::dirNameLen, availablePackage::epoch, availablePackage::fd, fdLink, availablePackage::filesCount, availablePackage::h, headerLink, headerNVR, HFD_t, HGE_t, int_32, availablePackage::key, availablePackage::multiLib, availablePackage::name, rpmRelocation_s::newPath, availablePackage::npreds, rpmRelocation_s::oldPath, availablePackage::provideFlags, availablePackage::provides, availablePackage::providesCount, availablePackage::providesEVR, availablePackage::release, availablePackage::relocs, availablePackage::requireFlags, availablePackage::requires, availablePackage::requiresCount, availablePackage::requiresEVR, RPMTAG_BASENAMES, RPMTAG_DIRINDEXES, RPMTAG_DIRNAMES, RPMTAG_EPOCH, RPMTAG_FILEFLAGS, RPMTAG_MULTILIBS, RPMTAG_PROVIDEFLAGS, RPMTAG_PROVIDENAME, RPMTAG_PROVIDEVERSION, RPMTAG_REQUIREFLAGS, RPMTAG_REQUIRENAME, RPMTAG_REQUIREVERSION, rpmTagType, rpmVersionCompare, availablePackage::tsi, uint_32, availablePackage::version, xmalloc, xrealloc, and xstrdup.

Referenced by rpmtransAddPackage, and rpmtransAvailablePackage.

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.

Parameters:

  al | available list
  keyType | type of dependency
  fileName | file name to search for

Returns:
  available package pointer

Definition at line 963 of file depends.c.

References _, _free, dirInfoCompare, dirInfo_s::dirName, dirInfo_s::dirNameLen, isFileMULTILIB, availablePackage::multiLib, xrealloc, and xstrdup.

Referenced by alAllSatisfiesDepend.

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.

Parameters:

  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

Returns:
  available package pointer

Definition at line 1078 of file depends.c.

References _, alAllFileSatisfiesDepend, availableIndexEntry::entry, availableIndexEntry::entryIx, availableIndexEntry::entryLen, indexcmp, availableIndexEntry::package, availablePackage::provideFlags, availablePackage::provides, availablePackage::providesEVR, rpmRangesOverlap, availableIndexEntry::type, and xrealloc.

Referenced by alSatisfiesDepend, and unsatisfiedDepend.

void alCreate | ( | availableList | al | ) | `[static]`

Initialize available packckages, items, and directories list.

Parameters:

  al | available list

Definition at line 144 of file depends.c.

References xcalloc.

Referenced by rpmtransCreateSet.

void alFree | ( | availableList | al | ) | `[static]`

Free available packages, items, and directories members.

Parameters:

  al | available list

Definition at line 162 of file depends.c.

References _free, alFreeIndex, availablePackage::baseNames, availablePackage::fd, fdFree, availablePackage::h, headerFree, HFD_t, availablePackage::provides, availablePackage::providesEVR, availablePackage::relocs, availablePackage::requires, availablePackage::requiresEVR, availablePackage::tsi, and tsortInfo_s::tsi_next.

Referenced by rpmtransFree.

void alFreeIndex | ( | availableList | al | ) | `[static]`

Destroy available item index.

Parameters:

  al | available list

Definition at line 131 of file depends.c.

References _free.

Referenced by alAddPackage, and alFree.

void alMakeIndex | ( | availableList | al | ) | `[static]`

Generate index for available list.

Parameters:

  al | available list

Definition at line 444 of file depends.c.

References availableIndexEntry::entry, availableIndexEntry::entryIx, availableIndexEntry::entryLen, availableIndex::index, indexcmp, isDependsMULTILIB, availablePackage::multiLib, availableIndexEntry::package, availablePackage::provideFlags, availablePackage::provides, availablePackage::providesCount, availableIndex::size, availableIndexEntry::type, and xcalloc.

Referenced by rpmdepCheck, and rpmdepOrder.

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.

Todo:
  Eliminate.

Parameters:

  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

Returns:
  available package pointer

Definition at line 1159 of file depends.c.

References _free, and alAllSatisfiesDepend.

Referenced by addRelation, and unsatisfiedDepend.

int checkDependentConflicts | ( | rpmTransactionSet | ts,
|  | problemsSet | psp,
|  | const char * | key
| ) | `[static]`

Adding: check name/provides key against conflicts matches.

Parameters:

  ts | transaction set
  psp | dependency problems
  key | conflicts name

Returns:
  0 no problems found

Definition at line 1599 of file depends.c.

References checkPackageSet, rpmdbInitIterator, and RPMTAG_CONFLICTNAME.

Referenced by rpmdepCheck.

int checkDependentPackages | ( | rpmTransactionSet | ts,
|  | problemsSet | psp,
|  | const char * | key
| ) | `[static]`

Erasing: check name/provides/filename key against requiredby matches.

Parameters:

  ts | transaction set
  psp | dependency problems
  key | requires name

Returns:
  0 no problems found

Definition at line 1583 of file depends.c.

References checkPackageSet, rpmdbInitIterator, and RPMTAG_REQUIRENAME.

Referenced by rpmdepCheck.

int checkPackageDeps | ( | rpmTransactionSet | ts,
|  | problemsSet | psp,
|  | Header | h,
|  | const char * | keyName,
|  | uint_32 | multiLib
| ) | `[static]`

Check header requires/conflicts against against installed+added packages.

Parameters:

  ts | transaction set
  psp | dependency problems
  h | header to check
  keyName | dependency name
  multiLib | skip multilib colored dependencies?

Returns:
  0 no problems found

Definition at line 1371 of file depends.c.

References _, _free, rpmDependencyConflict_s::byHeader, rpmDependencyConflict_s::byName, rpmDependencyConflict_s::byRelease, rpmDependencyConflict_s::byVersion, headerLink, headerNVR, HFD_t, HGE_t, int_32, isDependsMULTILIB, availablePackage::key, rpmDependencyConflict_s::needsFlags, rpmDependencyConflict_s::needsName, rpmDependencyConflict_s::needsVersion, printDepend, RPM_STRING_ARRAY_TYPE, RPMTAG_CONFLICTFLAGS, RPMTAG_CONFLICTNAME, RPMTAG_CONFLICTVERSION, RPMTAG_REQUIREFLAGS, RPMTAG_REQUIRENAME, RPMTAG_REQUIREVERSION, rpmTagType, rpmDependencyConflict_s::sense, rpmDependencyConflict_s::suggestedPackages, uint_32, unsatisfiedDepend, xmalloc, xrealloc, and xstrdup.

Referenced by checkPackageSet, and rpmdepCheck.

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.

Parameters:

  ts | transaction set
  psp | dependency problems
  key | dependency name
  mi | rpm database iterator

Returns:
  0 no problems found

Definition at line 1556 of file depends.c.

References checkPackageDeps, rpmdbFreeIterator, rpmdbNextIterator, and rpmdbPruneIterator.

Referenced by checkDependentConflicts, and checkDependentPackages.

int dirInfoCompare | ( | const void * | one,
|  | const void * | two
| ) | `[static]`

Compare two directory info entries by name (qsort/bsearch).

Parameters:

  one | 1st directory info
  two | 2nd directory info

Returns:
  result of comparison

Definition at line 218 of file depends.c.

References dirInfo_s::dirName, and dirInfo_s::dirNameLen.

Referenced by alAddPackage, and alAllFileSatisfiesDepend.

const char* const identifyDepend | ( | int_32 | f | ) | `[inline, static]`

| Definition at line 1728 of file depends.c. References _notpre, int_32, isLegacyPreReq, RPMSENSE_FIND_REQUIRES, RPMSENSE_SCRIPT_POST, RPMSENSE_SCRIPT_POSTUN, RPMSENSE_SCRIPT_PRE, RPMSENSE_SCRIPT_PREUN, and RPMSENSE_SCRIPT_VERIFY. Referenced by zapRelation.

int ignoreDep | ( | const struct availablePackage * | p,
|  | const struct availablePackage * | q
| ) | `[static]`

Check for dependency relations to be ignored.

Parameters:

  p | successor package (i.e. with Requires: )
  q | predecessor package (i.e. with Provides: )

Returns:
  1 if dependency is to be ignored.

Definition at line 1659 of file depends.c.

References _, _free, badDeps_s::pname, poptParseArgvString, badDeps_s::qname, rpmExpand, xcalloc, and xstrdup.

Referenced by addRelation.

int indexcmp | ( | const void * | one,
|  | const void * | two
| ) | `[static]`

Compare two available index entries by name (qsort/bsearch).

Parameters:

  one | 1st available index entry
  two | 2nd available index entry

Returns:
  result of comparison

Definition at line 428 of file depends.c.

References availableIndexEntry::entry, and availableIndexEntry::entryLen.

Referenced by alAllSatisfiesDepend, and alMakeIndex.

int intcmp | ( | const void * | a,
|  | const void * | b
| ) | `[static]`

Compare removed package instances (qsort/bsearch).

Parameters:

  a | 1st instance address
  b | 2nd instance address

Returns:
  result of comparison

Definition at line 748 of file depends.c.

Referenced by removePackage.

void markLoop | ( | tsortInfo | tsi,
|  | struct availablePackage * | q
| ) | `[static]`

Recursively mark all nodes with their predecessors.

Parameters:

  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.

Referenced by rpmdepOrder.

int orderListIndexCmp | ( | const void * | one,
|  | const void * | two
| ) | `[static]`

Compare ordered list entries by index (qsort/bsearch).

Parameters:

  one | 1st ordered list entry
  two | 2nd ordered list entry

Returns:
  result of comparison

Definition at line 1871 of file depends.c.

Referenced by rpmdepOrder.

void parseEVR | ( | char * | evr,
|  | const char ** | ep,
|  | const char ** | vp,
|  | const char ** | rp
| ) | `[static]`

Split EVR into epoch, version, and release components.

Parameters:

  evr | [epoch:]version[-release] string

Return values:

  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.

char* printDepend | ( | const char * | depend,
|  | const char * | key,
|  | const char * | keyEVR,
|  | int | keyFlags
| ) | `[static]`

Return formatted dependency string.

Parameters:

  depend | type of dependency ("R" == Requires, "C" == Conflcts)
  key | dependency name string
  keyEVR | dependency [epoch:]version[-release] string
  keyFlags | dependency logical range qualifiers

Returns:
  formatted dependency (malloc'ed)

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.

int rangeMatchesDepFlags | ( | Header | h,
|  | const char * | reqName,
|  | const char * | reqEVR,
|  | int | reqFlags
| ) | `[static]`

| Definition at line 609 of file depends.c. References HFD_t, HGE_t, int_32, rpmRangesOverlap, RPMSENSE_SENSEMASK, RPMTAG_PROVIDEFLAGS, RPMTAG_PROVIDENAME, RPMTAG_PROVIDEVERSION, and rpmTagType. Referenced by unsatisfiedDepend.

int removePackage | ( | rpmTransactionSet | ts,
|  | int | dboffset,
|  | int | depends
| ) | `[static]`

Add removed package instance to ordered transaction set.

Parameters:

  ts | transaction set
  dboffset | rpm database instance
  depends | installed package of pair (or -1 on erase)

Returns:
  0 on success

Definition at line 763 of file depends.c.

References intcmp, and xrealloc.

Referenced by rpmtransAddPackage, and rpmtransRemovePackage.

int rpmdbCloseDBI | ( | rpmdb | db,
|  | int | rpmtag
| ) | `[static]`

Close a single database index.

Parameters:

  db | rpm database
  rpmtag | rpm tag

Returns:
  0 on success

Definition at line 2231 of file depends.c.

References dbiClose.

Referenced by rpmdepCheck.

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.

Todo:
  Eliminate rpmrc provides.

Parameters:

  ts | transaction set
  keyType | type of dependency
  keyDepend | dependency string representation
  keyName | dependency name string
  keyEVR | dependency [epoch:]version[-release] string
  keyFlags | dependency logical range qualifiers

Return values:

  suggestion | possible package(s) to resolve dependency

Returns:
  0 if satisfied, 1 if not satisfied, 2 if error

Definition at line 1188 of file depends.c.

References _, _cacheDependsRC, alAllSatisfiesDepend, alSatisfiesDepend, DBC, DBI_WRITECURSOR, dbiCclose, dbiCopen, dbiGet, dbiOpen, dbiPut, rangeMatchesDepFlags, rpmCheckRpmlibProvides, rpmdbFreeIterator, RPMDBI_DEPENDS, rpmdbInitIterator, rpmdbNextIterator, rpmdbPruneIterator, rpmGetVar, RPMSENSE_SENSEMASK, RPMTAG_BASENAMES, RPMTAG_NAME, RPMTAG_PROVIDENAME, RPMVAR_PROVIDES, and xisspace.

Referenced by checkPackageDeps.

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).

Parameters:

  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)?

Return values:

  nzaps | address of no. of relations removed

Returns:
  (possibly NULL) formatted "q <- p" releation (malloc'ed)

Definition at line 1760 of file depends.c.

References _, _free, identifyDepend, printDepend, RPMSENSE_PREREQ, tsortInfo_s::tsi_next, and tsortInfo_s::tsi_reqx.

Referenced by rpmdepOrder.

## Variable Documentation

int _cacheDependsRC = 1`[static]`

| Definition at line 29 of file depends.c. Referenced by unsatisfiedDepend.

int _depends_debug = 0`[static]`

| Definition at line 6 of file depends.c.

struct badDeps_s* badDeps = NULL`[static]`

| Definition at line 1649 of file depends.c.

const char* rpmEVR = VERSION

| Definition at line 526 of file depends.c.

int rpmFLAGS = RPMSENSE_EQUAL

| Definition at line 527 of file depends.c.

const char* rpmNAME = PACKAGE

| Definition at line 525 of file depends.c.