X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Frpmds.h;h=bceed0081baa22b811f9195042716fe5e0cf31bc;hb=531803c3909b16a45c3ef72205c866dafb395a1e;hp=a843f9a1a75054fe55a00f87bfe11c93269d6580;hpb=0abf36fd4d042c1ee93aa0bdd23b96999952868b;p=platform%2Fupstream%2Frpm.git diff --git a/lib/rpmds.h b/lib/rpmds.h index a843f9a..bceed00 100644 --- a/lib/rpmds.h +++ b/lib/rpmds.h @@ -3,223 +3,130 @@ /** \ingroup rpmdep rpmtrans * \file lib/rpmds.h - * Structure used for handling a dependency set. + * Structure(s) used for dependency tag sets. */ -/** - * A package filename set. - */ -struct rpmFNSet_s { - int i; /*!< File index. */ - -/*@observer@*/ - const char * Type; /*!< Tag name. */ - - rpmTag tagN; /*!< Header tag. */ -/*@refcounted@*/ /*@null@*/ - Header h; /*!< Header for file name set (or NULL) */ - -/*@only@*/ /*@null@*/ - const char ** bnl; /*!< Base name(s) (from header) */ -/*@only@*/ /*@null@*/ - const char ** dnl; /*!< Directory name(s) (from header) */ - -/*@only@*/ /*@null@*/ - const char ** fmd5s; /*!< File MD5 sum(s) (from header) */ -/*@only@*/ /*@null@*/ - const char ** flinks; /*!< File link(s) (from header) */ -/*@only@*/ /*@null@*/ - const char ** flangs; /*!< File lang(s) */ - -/*@only@*/ /*@null@*/ - const uint_32 * dil; /*!< Directory indice(s) (from header) */ -/*@only@*/ /*@null@*/ - const uint_32 * fflags; /*!< File flag(s) (from header) */ -/*@only@*/ /*@null@*/ - const uint_32 * fsizes; /*!< File size(s) (from header) */ -/*@only@*/ /*@null@*/ - const uint_32 * fmtimes; /*!< File modification time(s) (from header) */ -/*@only@*/ /*@null@*/ - const uint_16 * fmodes; /*!< File mode(s) (from header) */ -/*@only@*/ /*@null@*/ - const uint_16 * frdevs; /*!< File rdev(s) (from header) */ - -/*@only@*/ /*@null@*/ - const char ** fuser; /*!< File owner(s) */ -/*@only@*/ /*@null@*/ - const char ** fgroup; /*!< File group(s) */ -/*@only@*/ /*@null@*/ - uid_t * fuids; /*!< File uid(s) */ -/*@only@*/ /*@null@*/ - gid_t * fgids; /*!< File gid(s) */ - -/*@only@*/ /*@null@*/ - char * fstates; /*!< File state(s) (from header) */ - - int_32 dc; /*!< No. of directories. */ - int_32 fc; /*!< No. of files. */ -/*@refs@*/ int nrefs; /*!< Reference count. */ -}; +#include -/** - * A package dependency set. - */ -struct rpmDepSet_s { - int i; /*!< Element index. */ - -/*@observer@*/ - const char * Type; /*!< Tag name. */ -/*@only@*/ /*@null@*/ - const char * DNEVR; /*!< Formatted dependency string. */ - - rpmTag tagN; /*!< Header tag. */ -/*@refcounted@*/ /*@null@*/ - Header h; /*!< Header for dependency set (or NULL) */ - -/*@only@*/ - const char ** N; /*!< Name. */ -/*@only@*/ - const char ** EVR; /*!< Epoch-Version-Release. */ -/*@only@*/ - int_32 * Flags; /*!< Flags identifying context/comparison. */ - rpmTagType Nt, EVRt, Ft; /*!< Tag data types. */ - int_32 Count; /*!< No. of elements */ -/*@refs@*/ int nrefs; /*!< Reference count. */ -}; +#include +#include #ifdef __cplusplus extern "C" { #endif /** - * Unreference a file info set instance. - * @param fns file info set - * @return NULL always - */ -/*@unused@*/ /*@null@*/ -rpmFNSet rpmfnsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmFNSet fns, - /*@null@*/ const char * msg) - /*@modifies fns @*/; - -/** @todo Remove debugging entry from the ABI. */ -/*@-exportlocal@*/ -/*@null@*/ -rpmFNSet XrpmfnsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmFNSet fns, - /*@null@*/ const char * msg, const char * fn, unsigned ln) - /*@modifies fns @*/; -/*@=exportlocal@*/ -#define rpmfnsUnlink(_fns, _msg) XrpmfnsUnlink(_fns, _msg, __FILE__, __LINE__) - -/** - * Reference a file info set instance. - * @param fns file info set - * @return new file info set reference */ -/*@unused@*/ -rpmFNSet rpmfnsLink (/*@null@*/ rpmFNSet fns, /*@null@*/ const char * msg) - /*@modifies fns @*/; - -/** @todo Remove debugging entry from the ABI. */ -rpmFNSet XrpmfnsLink (/*@null@*/ rpmFNSet fns, /*@null@*/ const char * msg, - const char * fn, unsigned ln) - /*@modifies fns @*/; -#define rpmfnsLink(_fns, _msg) XrpmfnsLink(_fns, _msg, __FILE__, __LINE__) +extern int _rpmds_nopromote; -/** - * Destroy a file name set. - * @param ds file name set - * @return NULL always - */ -/*@null@*/ -rpmFNSet fnsFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmFNSet fns) - /*@modifies fns@*/; - -/** - * Create and load a file name set. - * @param h header - * @param tagN RPMTAG_BASENAMES - * @param scareMem Use pointers to refcounted header memory? - * @return new file name set - */ -/*@null@*/ -rpmFNSet fnsNew(Header h, rpmTag tagN, int scareMem) - /*@modifies h @*/; - -/** - * Unreference a dependency set instance. - * @param ds dependency set - * @return NULL always +/** \ingroup rpmds + * Dependency Attributes. */ -/*@unused@*/ /*@null@*/ -rpmDepSet rpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmDepSet ds, - /*@null@*/ const char * msg) - /*@modifies ds @*/; - -/** @todo Remove debugging entry from the ABI. */ -/*@-exportlocal@*/ -/*@null@*/ -rpmDepSet XrpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmDepSet ds, - /*@null@*/ const char * msg, const char * fn, unsigned ln) - /*@modifies ds @*/; -/*@=exportlocal@*/ -#define rpmdsUnlink(_ds, _msg) XrpmdsUnlink(_ds, _msg, __FILE__, __LINE__) +enum rpmsenseFlags_e { + RPMSENSE_ANY = 0, + RPMSENSE_LESS = (1 << 1), + RPMSENSE_GREATER = (1 << 2), + RPMSENSE_EQUAL = (1 << 3), + /* bit 4 unused */ + RPMSENSE_POSTTRANS = (1 << 5), /*!< %posttrans dependency */ + RPMSENSE_PREREQ = (1 << 6), /* legacy prereq dependency */ + RPMSENSE_PRETRANS = (1 << 7), /*!< Pre-transaction dependency. */ + RPMSENSE_INTERP = (1 << 8), /*!< Interpreter used by scriptlet. */ + RPMSENSE_SCRIPT_PRE = (1 << 9), /*!< %pre dependency. */ + RPMSENSE_SCRIPT_POST = (1 << 10), /*!< %post dependency. */ + RPMSENSE_SCRIPT_PREUN = (1 << 11), /*!< %preun dependency. */ + RPMSENSE_SCRIPT_POSTUN = (1 << 12), /*!< %postun dependency. */ + RPMSENSE_SCRIPT_VERIFY = (1 << 13), /*!< %verify dependency. */ + RPMSENSE_FIND_REQUIRES = (1 << 14), /*!< find-requires generated dependency. */ + RPMSENSE_FIND_PROVIDES = (1 << 15), /*!< find-provides generated dependency. */ + + RPMSENSE_TRIGGERIN = (1 << 16), /*!< %triggerin dependency. */ + RPMSENSE_TRIGGERUN = (1 << 17), /*!< %triggerun dependency. */ + RPMSENSE_TRIGGERPOSTUN = (1 << 18), /*!< %triggerpostun dependency. */ + RPMSENSE_MISSINGOK = (1 << 19), /*!< suggests/enhances hint. */ + /* bits 20-23 unused */ + RPMSENSE_RPMLIB = (1 << 24), /*!< rpmlib(feature) dependency. */ + RPMSENSE_TRIGGERPREIN = (1 << 25), /*!< %triggerprein dependency. */ + RPMSENSE_KEYRING = (1 << 26), + RPMSENSE_STRONG = (1 << 27), + RPMSENSE_CONFIG = (1 << 28) +}; -/** +typedef rpmFlags rpmsenseFlags; + +#define RPMSENSE_SENSEMASK 15 /* Mask to get senses, ie serial, */ + /* less, greater, equal. */ + +#define RPMSENSE_TRIGGER \ + (RPMSENSE_TRIGGERPREIN | RPMSENSE_TRIGGERIN | RPMSENSE_TRIGGERUN | RPMSENSE_TRIGGERPOSTUN) + +#define _ALL_REQUIRES_MASK (\ + RPMSENSE_INTERP | \ + RPMSENSE_SCRIPT_PRE | \ + RPMSENSE_SCRIPT_POST | \ + RPMSENSE_SCRIPT_PREUN | \ + RPMSENSE_SCRIPT_POSTUN | \ + RPMSENSE_SCRIPT_VERIFY | \ + RPMSENSE_FIND_REQUIRES | \ + RPMSENSE_RPMLIB | \ + RPMSENSE_KEYRING | \ + RPMSENSE_PRETRANS | \ + RPMSENSE_POSTTRANS | \ + RPMSENSE_PREREQ | \ + RPMSENSE_MISSINGOK | \ + RPMSENSE_STRONG) + +#define _notpre(_x) ((_x) & ~RPMSENSE_PREREQ) +#define _INSTALL_ONLY_MASK \ + _notpre(RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_RPMLIB|RPMSENSE_KEYRING|RPMSENSE_PRETRANS|RPMSENSE_POSTTRANS) +#define _ERASE_ONLY_MASK \ + _notpre(RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN) + +#define isLegacyPreReq(_x) (((_x) & _ALL_REQUIRES_MASK) == RPMSENSE_PREREQ) +#define isInstallPreReq(_x) ((_x) & _INSTALL_ONLY_MASK) +#define isErasePreReq(_x) ((_x) & _ERASE_ONLY_MASK) + +/** \ingroup rpmds * Reference a dependency set instance. * @param ds dependency set * @return new dependency set reference */ -/*@unused@*/ -rpmDepSet rpmdsLink (/*@null@*/ rpmDepSet ds, /*@null@*/ const char * msg) - /*@modifies ds @*/; +rpmds rpmdsLink(rpmds ds); -/** @todo Remove debugging entry from the ABI. */ -rpmDepSet XrpmdsLink (/*@null@*/ rpmDepSet ds, /*@null@*/ const char * msg, - const char * fn, unsigned ln) - /*@modifies ds @*/; -#define rpmdsLink(_ds, _msg) XrpmdsLink(_ds, _msg, __FILE__, __LINE__) - -/** +/** \ingroup rpmds * Destroy a dependency set. * @param ds dependency set * @return NULL always */ -/*@null@*/ -rpmDepSet dsFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmDepSet ds) - /*@modifies ds@*/; -/** +rpmds rpmdsFree(rpmds ds); + +/** \ingroup rpmds * Create and load a dependency set. * @param h header * @param tagN type of dependency - * @param scareMem Use pointers to refcounted header memory? + * @param flags unused * @return new dependency set */ -/*@null@*/ -rpmDepSet dsNew(Header h, rpmTag tagN, int scareMem) - /*@modifies h @*/; +rpmds rpmdsNew(Header h, rpmTagVal tagN, int flags); -/** +/** \ingroup rpmds * Return new formatted dependency string. * @param dspfx formatted dependency string prefix * @param ds dependency set * @return new formatted dependency (malloc'ed) */ -/*@only@*/ -char * dsDNEVR(const char * dspfx, const rpmDepSet ds) - /*@*/; +char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds); -/** +/** \ingroup rpmds * Create, load and initialize a dependency for this header. * @param h header * @param tagN type of dependency * @param Flags comparison flags * @return new dependency set */ -/*@null@*/ -rpmDepSet dsThis(Header h, rpmTag tagN, int_32 Flags) - /*@*/; +rpmds rpmdsThis(Header h, rpmTagVal tagN, rpmsenseFlags Flags); -/** +/** \ingroup rpmds * Create, load and initialize a dependency set of size 1. * @param tagN type of dependency * @param N name @@ -227,133 +134,210 @@ rpmDepSet dsThis(Header h, rpmTag tagN, int_32 Flags) * @param Flags comparison flags * @return new dependency set */ -/*@null@*/ -rpmDepSet dsSingle(rpmTag tagN, const char * N, const char * EVR, int_32 Flags) - /*@*/; +rpmds rpmdsSingle(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags); -/** +/** \ingroup rpmds + * Return a new dependency set of size 1 from the current iteration index + * @param ds dependency set + * @return new dependency set + */ +rpmds rpmdsCurrent(rpmds ds); + +/** \ingroup rpmds * Return dependency set count. * @param ds dependency set * @return current count */ -int dsiGetCount(/*@null@*/ rpmDepSet ds) - /*@*/; +int rpmdsCount(const rpmds ds); -/** +/** \ingroup rpmds * Return dependency set index. * @param ds dependency set * @return current index */ -int dsiGetIx(/*@null@*/ rpmDepSet ds) - /*@*/; +int rpmdsIx(const rpmds ds); -/** +/** \ingroup rpmds * Set dependency set index. * @param ds dependency set * @param ix new index * @return current index */ -int dsiSetIx(/*@null@*/ rpmDepSet ds, int ix) - /*@modifies ds @*/; +int rpmdsSetIx(rpmds ds, int ix); -/** +/** \ingroup rpmds * Return current formatted dependency string. * @param ds dependency set * @return current dependency DNEVR, NULL on invalid */ -/*@null@*/ -const char * dsiGetDNEVR(/*@null@*/ rpmDepSet ds) - /*@*/; +const char * rpmdsDNEVR(const rpmds ds); -/** +/** \ingroup rpmds * Return current dependency name. * @param ds dependency set * @return current dependency name, NULL on invalid */ -/*@null@*/ -const char * dsiGetN(/*@null@*/ rpmDepSet ds) - /*@*/; +const char * rpmdsN(const rpmds ds); -/** +/** \ingroup rpmds * Return current dependency epoch-version-release. * @param ds dependency set * @return current dependency EVR, NULL on invalid */ -/*@null@*/ -const char * dsiGetEVR(/*@null@*/ rpmDepSet ds) - /*@*/; +const char * rpmdsEVR(const rpmds ds); -/** - * Return current dependency Flags. +/** \ingroup rpmds + * Return current dependency flags. * @param ds dependency set - * @return current dependency EVR, 0 on invalid + * @return current dependency flags, 0 on invalid */ -int_32 dsiGetFlags(/*@null@*/ rpmDepSet ds) - /*@*/; +rpmsenseFlags rpmdsFlags(const rpmds ds); -/** - * Notify of results of dependency match; +/** \ingroup rpmds + * Return current dependency type. + * @param ds dependency set + * @return current dependency type, 0 on invalid + */ +rpmTagVal rpmdsTagN(const rpmds ds); + +/** \ingroup rpmds + * Return dependency header instance, ie whether the dependency comes from + * an installed header or not. + * @param ds dependency set + * @return header instance of dependency (0 for not installed) + */ +unsigned int rpmdsInstance(rpmds ds); + +/** \ingroup rpmds + * Return current "Don't promote Epoch:" flag. + * + * This flag controls for Epoch: promotion when a dependency set is + * compared. If the flag is set (for already installed packages), then + * an unspecified value will be treated as Epoch: 0. Otherwise (for added + * packages), the Epoch: portion of the comparison is skipped if the value + * is not specified, i.e. an unspecified Epoch: is assumed to be equal + * in dependency comparisons. + * + * @param ds dependency set + * @return current "Don't promote Epoch:" flag + */ +int rpmdsNoPromote(const rpmds ds); + +/** \ingroup rpmds + * Set "Don't promote Epoch:" flag. + * @param ds dependency set + * @param nopromote Should an unspecified Epoch: be treated as Epoch: 0? + * @return previous "Don't promote Epoch:" flag + */ +int rpmdsSetNoPromote(rpmds ds, int nopromote); + +/** \ingroup rpmds + * Return current dependency color. + * @param ds dependency set + * @return current dependency color + */ +rpm_color_t rpmdsColor(const rpmds ds); + +/** \ingroup rpmds + * Return current dependency color. + * @param ds dependency set + * @param color new dependency color + * @return previous dependency color + */ +rpm_color_t rpmdsSetColor(const rpmds ds, rpm_color_t color); + +/** \ingroup rpmds + * Notify of results of dependency match. * @param ds dependency set * @param where where dependency was resolved (or NULL) * @param rc 0 == YES, otherwise NO */ -/*@-globuse@*/ /* FIX: rpmMessage annotation is a lie */ -void dsiNotify(/*@null@*/ rpmDepSet ds, /*@null@*/ const char * where, int rc) - /*@globals fileSystem @*/ - /*@modifies fileSystem @*/; -/*@=globuse@*/ +/* FIX: rpmMessage annotation is a lie */ +void rpmdsNotify(rpmds ds, const char * where, int rc); -/** +/** \ingroup rpmds * Return next dependency set iterator index. * @param ds dependency set * @return dependency set iterator index, -1 on termination */ -int dsiNext(/*@null@*/ rpmDepSet ds) - /*@modifies ds @*/; +int rpmdsNext(rpmds ds); -/** +/** \ingroup rpmds * Initialize dependency set iterator. * @param ds dependency set * @return dependency set */ -/*@null@*/ -rpmDepSet dsiInit(/*@returned@*/ /*@null@*/ rpmDepSet ds) - /*@modifies ds @*/; +rpmds rpmdsInit(rpmds ds); -/** +/** \ingroup rpmds + * Find a dependency set element using binary search. + * @param ds dependency set to search + * @param ods dependency set element to find. + * @return dependency index (or -1 if not found) + */ +int rpmdsFind(rpmds ds, const rpmds ods); + +/** \ingroup rpmds + * Merge a dependency set maintaining (N,EVR,Flags) sorted order. + * @retval *dsp (merged) dependency set + * @param ods dependency set to merge + * @return (merged) dependency index + */ +int rpmdsMerge(rpmds * dsp, rpmds ods); + +/** \ingroup rpmds + * Search a sorted dependency set for an element that overlaps. + * A boolean result is saved (if allocated) and accessible through + * rpmdsResult(ods) afterwards. + * @param ds dependency set to search + * @param ods dependency set element to find. + * @return dependency index (or -1 if not found) + **/ +int rpmdsSearch(rpmds ds, rpmds ods); + +/** \ingroup rpmds * Compare two versioned dependency ranges, looking for overlap. * @param A 1st dependency * @param B 2nd dependency * @return 1 if dependencies overlap, 0 otherwise */ -int dsCompare(const rpmDepSet A, const rpmDepSet B) - /*@*/; +int rpmdsCompare(const rpmds A, const rpmds B); -/** - * Report a Requires: or Conflicts: dependency problem. +/** \ingroup rpmds + * Compare package provides dependencies from header with a single dependency. + * @param h header + * @param req dependency set + * @param nopromote Don't promote Epoch: in comparison? + * @return 1 if any dependency overlaps, 0 otherwise */ -void dsProblem(/*@null@*/ rpmProblemSet tsprobs, - const char * pkgNEVR, const rpmDepSet ds, - /*@only@*/ /*@null@*/ const fnpyKey * suggestedKeys) - /*@modifies tsprobs @*/; +int rpmdsAnyMatchesDep (const Header h, const rpmds req, int nopromote); -/** +/** \ingroup rpmds * Compare package provides dependencies from header with a single dependency. * @param h header - * @param ds dependency set + * @param ix index in header provides + * @param req dependency set + * @param nopromote Don't promote Epoch: in comparison? + * @return 1 if any dependency overlaps, 0 otherwise */ -int rangeMatchesDepFlags (Header h, const rpmDepSet req) - /*@modifies h @*/; +int rpmdsMatchesDep (const Header h, int ix, const rpmds req, int nopromote); -/** +/** \ingroup rpmds * Compare package name-version-release from header with a single dependency. - * @deprecated Remove from API when obsoletes is correctly implemented. * @param h header - * @param req dependency + * @param req dependency set + * @param nopromote Don't promote Epoch: in comparison? * @return 1 if dependency overlaps, 0 otherwise */ -int headerMatchesDepFlags(Header h, const rpmDepSet req) - /*@*/; +int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote); + +/** + * Load rpmlib provides into a dependency set. + * @retval *dsp (loaded) depedency set + * @param tblp rpmlib provides table (NULL uses internal table) + * @return 0 on success + */ +int rpmdsRpmlib(rpmds * dsp, const void * tblp); #ifdef __cplusplus }