lib/depends.c File Reference

#include "system.h"
#include <rpmio.h>
#include <rpmcli.h>
#include <rpmmacro.h>
#include <envvar.h>
#include <ugid.h>
#include "rpmdb.h"
#include "rpmds.h"
#include "rpmfi.h"
#include "debug.h"
Include dependency graph for depends.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  orderListIndex_s
struct  badDeps_s

Defines

#define _RPMTE_INTERNAL
#define _RPMTS_INTERNAL
#define _RPMEVR_INTERNAL
#define isAuto(_x)   (1)

Typedefs

typedef struct orderListIndex_sorderListIndex

Functions

static int intcmp (const void *a, const void *b)
 Compare removed package instances (qsort/bsearch).
static int removePackage (rpmts ts, Header h, int dboffset, int *indexp, alKey depends)
 Add removed package instance to ordered transaction set.
static int rpmHeadersIdentical (Header first, Header second)
 Are two headers identical?
int rpmtsAddInstallElement (rpmts ts, Header h, fnpyKey key, int upgrade, rpmRelocation relocs)
 Add package to be installed to transaction set.
int rpmtsAddEraseElement (rpmts ts, Header h, int dboffset)
 Add package to be erased to transaction set.
void rpmnsClean (void)
 Clean global name space dependency sets.
static int unsatisfiedDepend (rpmts ts, rpmds dep, int adding)
 Check dep for an unsatisfied dependency.
static int checkPackageDeps (rpmts ts, const char *pkgNEVRA, rpmds requires, rpmds conflicts, rpmds dirnames, rpmds linktos, const char *depName, uint32_t tscolor, int adding)
 Check added requires/conflicts against against installed+added packages.
static int checkPackageSet (rpmts ts, const char *depName, rpmdbMatchIterator mi, int adding)
 Check dependency against installed packages.
static int checkDependentPackages (rpmts ts, const char *depName)
 Check to-be-erased dependencies against installed requires.
static int checkDependentConflicts (rpmts ts, const char *depName)
 Check to-be-added dependencies against installed conflicts.
static void freeBadDeps (void)
static int ignoreDep (const rpmts ts, const rpmte p, const rpmte q)
 Check for dependency relations to be ignored.
static void markLoop (tsortInfo tsi, rpmte q)
 Recursively mark all nodes with their predecessors.
static const char * identifyDepend (uint32_t f)
static const char * zapRelation (rpmte q, rpmte p, int zap, int *nzaps, int msglvl)
 Find (and eliminate co-requisites) "q <- p" relation in dependency loop.
static int addRelation (rpmts ts, rpmte p, unsigned char *selected, rpmds requires)
 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 (rpmte p, rpmte *qp, rpmte *rp, uint32_t prefcolor)
 Add element to list sorting by tsi_qcnt.
int rpmtsOrder (rpmts ts)
 Determine package order in a transaction set according to dependencies.
int rpmtsCheck (rpmts ts)
 Perform dependency resolution on the transaction set.

Variables

const char * rpmNAME = PACKAGE
const char * rpmEVR = VERSION
int rpmFLAGS = RPMSENSE_EQUAL
static rpmTag _upgrade_tag
static rpmTag _obsolete_tag
static char * sysinfo_path = NULL
static rpmds rpmlibP = NULL
static rpmds cpuinfoP = NULL
static rpmds getconfP = NULL
static rpmds unameP = NULL
static int badDepsInitialized = 0
static struct badDeps_sbadDeps = NULL
static uint32_t _autobits = 0xffffffff

Detailed Description

Definition in file depends.c.


Define Documentation

#define _RPMEVR_INTERNAL

Definition at line 23 of file depends.c.

#define _RPMTE_INTERNAL

Definition at line 8 of file depends.c.

#define _RPMTS_INTERNAL

Definition at line 9 of file depends.c.

#define isAuto ( _x   )     (1)

Definition at line 1932 of file depends.c.

Referenced by rpmtsOrder().


Typedef Documentation

Definition at line 38 of file depends.c.


Function Documentation

static void addQ ( rpmte  p,
rpmte qp,
rpmte rp,
uint32_t  prefcolor 
) [static]

Add element to list sorting by tsi_qcnt.

Parameters:
p new element
Return values:
*qp first element
*rp last element
Parameters:
prefcolor preferred color

Definition at line 1875 of file depends.c.

References rpmteColor(), rpmteTSI(), rpmteType(), and TR_REMOVED.

Referenced by rpmtsOrder().

static int addRelation ( rpmts  ts,
rpmte  p,
unsigned char *  selected,
rpmds  requires 
) [inline, static]
static int checkDependentConflicts ( rpmts  ts,
const char *  depName 
) [static]

Check to-be-added dependencies against installed conflicts.

Parameters:
ts transaction set
depName conflicts name
Returns:
0 no problems found

Definition at line 1503 of file depends.c.

References checkPackageSet(), rpmtsGetRdb(), and rpmtsInitIterator().

Referenced by rpmtsCheck().

static int checkDependentPackages ( rpmts  ts,
const char *  depName 
) [static]

Check to-be-erased dependencies against installed requires.

Parameters:
ts transaction set
depName requires name
Returns:
0 no problems found

Definition at line 1482 of file depends.c.

References checkPackageSet(), rpmtsGetRdb(), and rpmtsInitIterator().

Referenced by rpmtsCheck().

static int checkPackageDeps ( rpmts  ts,
const char *  pkgNEVRA,
rpmds  requires,
rpmds  conflicts,
rpmds  dirnames,
rpmds  linktos,
const char *  depName,
uint32_t  tscolor,
int  adding 
) [static]

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

Parameters:
ts transaction set
pkgNEVRA package name-version-release.arch
requires Requires: dependencies (or NULL)
conflicts Conflicts: dependencies (or NULL)
dirnames Dirnames: dependencies (or NULL)
linktos Filelinktos: dependencies (or NULL)
depName dependency name to filter (or NULL)
tscolor color bits for transaction set (0 disables)
adding dependency is from added package set?
Returns:
0 = deps ok, 1 = dep problems, 2 = error

Definition at line 1223 of file depends.c.

References rpmalAllSatisfiesDepend(), rpmdsColor(), rpmdsInit(), rpmdsN(), rpmdsNext(), rpmdsProblem(), rpmpsFree(), rpmtsProblems(), and unsatisfiedDepend().

Referenced by checkPackageSet(), and rpmtsCheck().

static int checkPackageSet ( rpmts  ts,
const char *  depName,
rpmdbMatchIterator  mi,
int  adding 
) [static]

Check dependency against installed packages.

Adding: check name/provides dep against each conflict match, Erasing: check name/provides/filename dep against each requiredby match.

Parameters:
ts transaction set
depName dependency name
mi rpm database iterator
adding dependency is from added package set?
Returns:
0 no problems found

Definition at line 1413 of file depends.c.

References _free(), _rpmds_nopromote, alloca(), checkPackageDeps(), headerGet(), _HE_s::p, rpmdbFreeIterator(), rpmdbNextIterator(), rpmdbPruneIterator(), RPMDEPS_FLAG_NOCONFLICTS, RPMDEPS_FLAG_NOLINKTOS, RPMDEPS_FLAG_NOPARENTDIRS, RPMDEPS_FLAG_NOREQUIRES, rpmdsFree(), rpmdsNew(), rpmdsSetNoPromote(), rpmtsColor(), rpmtsDFlags(), rpmDataType_u::str, and _HE_s::tag.

Referenced by checkDependentConflicts(), and checkDependentPackages().

static void freeBadDeps ( void   )  [static]

Definition at line 1544 of file depends.c.

References _free(), badDepsInitialized, badDeps_s::pname, and badDeps_s::qname.

Referenced by rpmtsOrder().

static const char* identifyDepend ( uint32_t  f  )  [inline, static]

Definition at line 1651 of file depends.c.

Referenced by zapRelation().

static int ignoreDep ( const rpmts  ts,
const rpmte  p,
const rpmte  q 
) [static]

Check for dependency relations to be ignored.

Parameters:
ts transaction set
p successor element (i.e. with Requires: )
q predecessor element (i.e. with Provides: )
Returns:
1 if dependency is to be ignored.

Definition at line 1566 of file depends.c.

References _, _free(), badDepsInitialized, badDeps_s::pname, badDeps_s::qname, RPMDEPS_FLAG_ANACONDA, RPMDEPS_FLAG_DEPLOOPS, rpmExpand(), rpmlog(), RPMLOG_DEBUG, RPMLOG_WARNING, rpmteN(), rpmtsDFlags(), xcalloc(), and xstrdup().

Referenced by addRelation().

static 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 69 of file depends.c.

Referenced by removePackage().

static void markLoop ( tsortInfo  tsi,
rpmte  q 
) [static]

Recursively mark all nodes with their predecessors.

Parameters:
tsi successor chain
q predecessor

Definition at line 1627 of file depends.c.

References rpmteTSI().

Referenced by rpmtsOrder().

static 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 1858 of file depends.c.

Referenced by rpmtsOrder().

static int removePackage ( rpmts  ts,
Header  h,
int  dboffset,
int *  indexp,
alKey  depends 
) [static]

Add removed package instance to ordered transaction set.

Parameters:
ts transaction set
h header
dboffset rpm database instance
Return values:
*indexp removed element index (if not NULL)
Parameters:
depends installed package of pair (or RPMAL_NOMATCH on erase)
Returns:
0 on success

Definition at line 87 of file depends.c.

References intcmp(), rpmteNew(), TR_REMOVED, and xrealloc().

Referenced by rpmtsAddEraseElement(), and rpmtsAddInstallElement().

static int rpmHeadersIdentical ( Header  first,
Header  second 
) [static]

Are two headers identical?

Parameters:
first first header
second second header
Returns:
1 if headers are identical, 0 otherwise

Definition at line 146 of file depends.c.

References _free(), alloca(), headerGet(), _HE_s::p, rpmdsCompare(), rpmdsFree(), rpmdsThis(), RPMSENSE_EQUAL, RPMTAG_HDRID, rpmDataType_u::str, and _HE_s::tag.

Referenced by rpmtsAddInstallElement().

void rpmnsClean ( void   ) 

Clean global name space dependency sets.

Definition at line 553 of file depends.c.

References _free(), _sysinfo_path, cpuinfoP, getconfP, rpmdsFree(), rpmlibP, sysinfo_path, and unameP.

Referenced by rpmcliFini().

static int unsatisfiedDepend ( rpmts  ts,
rpmds  dep,
int  adding 
) [static]

Check dep for an unsatisfied dependency.

Parameters:
ts transaction set
dep dependency
adding dependency is from added package set?
Returns:
0 if satisfied, 1 if not satisfied, 2 if error

Definition at line 572 of file depends.c.

References _, _free(), _rpmds_nopromote, alloca(), argvAdd(), argvFree(), argvSplit(), cpuinfoP, __db_dbt::data, DB_SET, DB_WRITECURSOR, dbiOpen(), errno, Fclose(), Ferror(), Fopen(), Fread(), getconfP, gidToGname(), gnameToGid(), headerIsEntry(), PGPHASHALGO_MD5, pgpHashAlgoStringToNumber(), R_OK, rpmalMakeIndex(), rpmalSatisfiesDepend(), rpmdbFreeIterator(), RPMDBI_DEPENDS, rpmdbNextIterator(), rpmdbPruneIterator(), RPMDEPS_FLAG_NOSUGGEST, RPMDIGEST_NONE, rpmDigestFinal(), rpmDigestInit(), rpmDigestUpdate(), rpmdsAnyMatchesDep(), rpmdsCpuinfo(), rpmdsDNEVR(), rpmdsELF(), rpmdsEVR(), rpmdsFlags(), rpmdsFree(), rpmdsFreePRCO(), rpmdsFromPRCO(), rpmdsGetconf(), rpmdsMergePRCO(), rpmdsN(), rpmdsNegateRC(), rpmdsNewPRCO(), rpmdsNotify(), rpmdsNSType(), rpmdsRpmlib(), rpmdsSearch(), rpmdsSingle(), rpmdsTagN(), rpmdsUname(), rpmExpand(), rpmExpandNumeric(), rpmGetPath(), rpmioAccess(), rpmlibP, RPMNS_TYPE_ACCESS, RPMNS_TYPE_CPUINFO, RPMNS_TYPE_DIGEST, RPMNS_TYPE_DISKSPACE, RPMNS_TYPE_ENVVAR, RPMNS_TYPE_FUNCTION, RPMNS_TYPE_GETCONF, RPMNS_TYPE_GNUPG, RPMNS_TYPE_GROUP, RPMNS_TYPE_MACRO, RPMNS_TYPE_MOUNTED, RPMNS_TYPE_RPMLIB, RPMNS_TYPE_RUNNING, RPMNS_TYPE_SANITY, RPMNS_TYPE_SIGNATURE, RPMNS_TYPE_SONAME, RPMNS_TYPE_UNAME, RPMNS_TYPE_USER, RPMNS_TYPE_VCHECK, rpmnsProbeSignature(), RPMRC_OK, RPMSENSE_EQUAL, RPMSENSE_GREATER, RPMSENSE_LESS, RPMSENSE_NOTEQUAL, RPMSENSE_SENSEMASK, rpmtsDFlags(), rpmtsGetRdb(), rpmtsInitDSI(), rpmtsInitIterator(), __db_dbt::size, SYSCONFIGDIR, sysinfo_path, uidToUname(), unameP, unameToUid(), X_OK, xisdigit(), and xstrdup().

Referenced by checkPackageDeps().

static const char* zapRelation ( rpmte  q,
rpmte  p,
int  zap,
int *  nzaps,
int  msglvl 
) [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
Parameters:
msglvl message level at which to spew
Returns:
(possibly NULL) formatted "q <- p" releation (malloc'ed)

Definition at line 1686 of file depends.c.

References _, _free(), identifyDepend(), rpmdsFlags(), rpmdsNewDNEVR(), rpmdsSetIx(), rpmlog(), rpmteDS(), rpmteNEVRA(), and rpmteTSI().

Referenced by rpmtsOrder().


Variable Documentation

uint32_t _autobits = 0xffffffff [static]

Definition at line 1931 of file depends.c.

Referenced by rpmtsOrder().

Definition at line 183 of file depends.c.

Referenced by rpmtsAddInstallElement().

rpmTag _upgrade_tag [static]

Definition at line 181 of file depends.c.

Referenced by rpmtsAddInstallElement().

struct badDeps_s* badDeps = NULL [static]

Definition at line 1538 of file depends.c.

int badDepsInitialized = 0 [static]

Definition at line 1535 of file depends.c.

Referenced by freeBadDeps(), and ignoreDep().

rpmds cpuinfoP = NULL [static]

Definition at line 547 of file depends.c.

Referenced by rpmnsClean(), and unsatisfiedDepend().

rpmds getconfP = NULL [static]

Definition at line 549 of file depends.c.

Referenced by rpmnsClean(), and unsatisfiedDepend().

const char* rpmEVR = VERSION

Definition at line 58 of file depends.c.

Referenced by printVersion().

int rpmFLAGS = RPMSENSE_EQUAL

Definition at line 61 of file depends.c.

rpmds rpmlibP = NULL [static]

Definition at line 545 of file depends.c.

Referenced by rpmnsClean(), and unsatisfiedDepend().

const char* rpmNAME = PACKAGE

Definition at line 55 of file depends.c.

char* sysinfo_path = NULL [static]

Definition at line 542 of file depends.c.

Referenced by rpmnsClean(), and unsatisfiedDepend().

rpmds unameP = NULL [static]

Definition at line 551 of file depends.c.

Referenced by rpmnsClean(), and unsatisfiedDepend().

Generated on Sun Mar 7 02:01:50 2010 for rpm by  doxygen 1.6.3