1 #ifndef H_RPMDS 2 #define H_RPMDS 3 4 /** \ingroup rpmdep rpmtrans 5 * \file lib/rpmds.h 6 * Structure(s) used for dependency tag sets. 7 */ 8 9 #include <time.h> 10 11 #include <rpm/rpmtypes.h> 12 #include <rpm/rpmps.h> 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 17 18 /** 19 */ 20 extern int _rpmds_nopromote; 21 22 /** \ingroup rpmds 23 * Dependency Attributes. 24 */ 25 enum rpmsenseFlags_e { 26 RPMSENSE_ANY = 0, 27 RPMSENSE_LESS = (1 << 1), 28 RPMSENSE_GREATER = (1 << 2), 29 RPMSENSE_EQUAL = (1 << 3), 30 /* bit 4 unused */ 31 RPMSENSE_POSTTRANS = (1 << 5), /*!< %posttrans dependency */ 32 RPMSENSE_PREREQ = (1 << 6), /* legacy prereq dependency */ 33 RPMSENSE_PRETRANS = (1 << 7), /*!< Pre-transaction dependency. */ 34 RPMSENSE_INTERP = (1 << 8), /*!< Interpreter used by scriptlet. */ 35 RPMSENSE_SCRIPT_PRE = (1 << 9), /*!< %pre dependency. */ 36 RPMSENSE_SCRIPT_POST = (1 << 10), /*!< %post dependency. */ 37 RPMSENSE_SCRIPT_PREUN = (1 << 11), /*!< %preun dependency. */ 38 RPMSENSE_SCRIPT_POSTUN = (1 << 12), /*!< %postun dependency. */ 39 RPMSENSE_SCRIPT_VERIFY = (1 << 13), /*!< %verify dependency. */ 40 RPMSENSE_FIND_REQUIRES = (1 << 14), /*!< find-requires generated dependency. */ 41 RPMSENSE_FIND_PROVIDES = (1 << 15), /*!< find-provides generated dependency. */ 42 43 RPMSENSE_TRIGGERIN = (1 << 16), /*!< %triggerin dependency. */ 44 RPMSENSE_TRIGGERUN = (1 << 17), /*!< %triggerun dependency. */ 45 RPMSENSE_TRIGGERPOSTUN = (1 << 18), /*!< %triggerpostun dependency. */ 46 RPMSENSE_MISSINGOK = (1 << 19), /*!< suggests/enhances hint. */ 47 /* bits 20-23 unused */ 48 RPMSENSE_RPMLIB = (1 << 24), /*!< rpmlib(feature) dependency. */ 49 RPMSENSE_TRIGGERPREIN = (1 << 25), /*!< %triggerprein dependency. */ 50 RPMSENSE_KEYRING = (1 << 26), 51 /* bit 27 unused */ 52 RPMSENSE_CONFIG = (1 << 28), 53 RPMSENSE_META = (1 << 29), /*!< meta dependency. */ 54 }; 55 56 typedef rpmFlags rpmsenseFlags; 57 58 #define RPMSENSE_SENSEMASK 15 /* Mask to get senses, ie serial, */ 59 /* less, greater, equal. */ 60 61 #define RPMSENSE_TRIGGER \ 62 (RPMSENSE_TRIGGERPREIN | RPMSENSE_TRIGGERIN | RPMSENSE_TRIGGERUN | RPMSENSE_TRIGGERPOSTUN) 63 64 #define _ALL_REQUIRES_MASK (\ 65 RPMSENSE_INTERP | \ 66 RPMSENSE_SCRIPT_PRE | \ 67 RPMSENSE_SCRIPT_POST | \ 68 RPMSENSE_SCRIPT_PREUN | \ 69 RPMSENSE_SCRIPT_POSTUN | \ 70 RPMSENSE_SCRIPT_VERIFY | \ 71 RPMSENSE_FIND_REQUIRES | \ 72 RPMSENSE_RPMLIB | \ 73 RPMSENSE_KEYRING | \ 74 RPMSENSE_PRETRANS | \ 75 RPMSENSE_POSTTRANS | \ 76 RPMSENSE_PREREQ | \ 77 RPMSENSE_META | \ 78 RPMSENSE_MISSINGOK) 79 80 #define _notpre(_x) ((_x) & ~RPMSENSE_PREREQ) 81 #define _INSTALL_ONLY_MASK \ 82 _notpre(RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_RPMLIB|RPMSENSE_KEYRING|RPMSENSE_PRETRANS|RPMSENSE_POSTTRANS) 83 #define _ERASE_ONLY_MASK \ 84 _notpre(RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN) 85 #define _UNORDERED_ONLY_MASK \ 86 _notpre(RPMSENSE_RPMLIB|RPMSENSE_CONFIG|RPMSENSE_PRETRANS|RPMSENSE_POSTTRANS|RPMSENSE_SCRIPT_VERIFY|RPMSENSE_META) 87 #define _FORCE_ORDER_ONLY_MASK \ 88 _notpre(RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN) 89 90 #define isLegacyPreReq(_x) (((_x) & _ALL_REQUIRES_MASK) == RPMSENSE_PREREQ) 91 #define isInstallPreReq(_x) ((_x) & _INSTALL_ONLY_MASK) 92 #define isErasePreReq(_x) ((_x) & _ERASE_ONLY_MASK) 93 #define isUnorderedReq(_x) ((_x) & _UNORDERED_ONLY_MASK && \ 94 !((_x) & _FORCE_ORDER_ONLY_MASK)) 95 #define isTransientReq(_x) (isInstallPreReq(_x) && \ 96 !isErasePreReq(_x) && \ 97 !((_x) & RPMSENSE_META)) 98 99 /** \ingroup rpmds 100 * Return only those flags allowed for given type of dependencies 101 * @param tagN type of dependency 102 * @param Flags flags 103 * @return flags filtered to allowed bits 104 */ 105 rpmsenseFlags rpmSanitizeDSFlags(rpmTagVal tagN, rpmsenseFlags Flags); 106 107 /** \ingroup rpmds 108 * Convert a string to the sense flags 109 * @param str the string 110 * @param len length of the string 111 * @return flags, zero for unknown relations 112 */ 113 rpmsenseFlags rpmParseDSFlags(const char *str, size_t len); 114 115 /** \ingroup rpmds 116 * Reference a dependency set instance. 117 * @param ds dependency set 118 * @return new dependency set reference 119 */ 120 rpmds rpmdsLink(rpmds ds); 121 122 /** \ingroup rpmds 123 * Destroy a dependency set. 124 * @param ds dependency set 125 * @return NULL always 126 */ 127 rpmds rpmdsFree(rpmds ds); 128 129 /** \ingroup rpmds 130 * Create and load a dependency set. 131 * @param h header 132 * @param tagN type of dependency 133 * @param flags unused 134 * @return new dependency set 135 */ 136 rpmds rpmdsNew(Header h, rpmTagVal tagN, int flags); 137 138 /** \ingroup rpmds 139 * Return new formatted dependency string. 140 * @param dspfx formatted dependency string prefix 141 * @param ds dependency set 142 * @return new formatted dependency (malloc'ed) 143 */ 144 char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds); 145 146 /** \ingroup rpmds 147 * Create, load and initialize a dependency for this header. 148 * @param h header 149 * @param tagN type of dependency 150 * @param Flags comparison flags 151 * @return new dependency set 152 */ 153 rpmds rpmdsThis(Header h, rpmTagVal tagN, rpmsenseFlags Flags); 154 155 /** \ingroup rpmds 156 * Create, load and initialize a dependency set of size 1. 157 * @param tagN type of dependency 158 * @param N name 159 * @param EVR epoch:version-release 160 * @param Flags comparison flags 161 * @return new dependency set 162 */ 163 rpmds rpmdsSingle(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags); 164 165 /** \ingroup rpmds 166 * Return a new dependency set of size 1 from the current iteration index 167 * @param ds dependency set 168 * @return new dependency set 169 */ 170 rpmds rpmdsCurrent(rpmds ds); 171 172 /** \ingroup rpmds 173 * Write content of the dependency set to the header 174 * @param ds dependency set 175 * @param h header 176 * @return 0 on success 177 */ 178 int rpmdsPutToHeader(rpmds ds, Header h); 179 180 /** \ingroup rpmds 181 * Return dependency set count. 182 * @param ds dependency set 183 * @return current count 184 */ 185 int rpmdsCount(const rpmds ds); 186 187 /** \ingroup rpmds 188 * Return dependency set index. 189 * @param ds dependency set 190 * @return current index 191 */ 192 int rpmdsIx(const rpmds ds); 193 194 /** \ingroup rpmds 195 * Set dependency set index. 196 * @param ds dependency set 197 * @param ix new index 198 * @return current index 199 */ 200 int rpmdsSetIx(rpmds ds, int ix); 201 202 /** \ingroup rpmds 203 * Return current formatted dependency string. 204 * @param ds dependency set 205 * @return current dependency DNEVR, NULL on invalid 206 */ 207 const char * rpmdsDNEVR(const rpmds ds); 208 209 /** \ingroup rpmds 210 * Return one char indicating the type of the dependency. 211 * @param ds dependency set 212 * @return character 213 */ 214 char rpmdsD(const rpmds ds); 215 216 /** \ingroup rpmds 217 * Return matching tagN for one char dependency type description. 218 * @param deptype character 219 * @return type of dependency 220 */ 221 rpmTagVal rpmdsDToTagN(char deptype); 222 223 /** \ingroup rpmds 224 * Return current dependency name. 225 * @param ds dependency set 226 * @return current dependency name, NULL on invalid 227 */ 228 const char * rpmdsN(const rpmds ds); 229 230 /** \ingroup rpmds 231 * Return current dependency epoch-version-release. 232 * @param ds dependency set 233 * @return current dependency EVR, NULL on invalid 234 */ 235 const char * rpmdsEVR(const rpmds ds); 236 237 /** \ingroup rpmds 238 * Return current dependency triggerindex. 239 * @param ds dependency set 240 * @return current dependency trigger index, 0 on invalid 241 */ 242 int rpmdsTi(const rpmds ds); 243 244 /** \ingroup rpmds 245 * Return current dependency flags. 246 * @param ds dependency set 247 * @return current dependency flags, 0 on invalid 248 */ 249 rpmsenseFlags rpmdsFlags(const rpmds ds); 250 251 /** \ingroup rpmds 252 * Return current dependency type. 253 * @param ds dependency set 254 * @return current dependency type, 0 on invalid 255 */ 256 rpmTagVal rpmdsTagN(const rpmds ds); 257 258 /** \ingroup rpmds 259 * Return current dependency type. 260 * @param ds dependency set 261 * @return current dependency type version tag, 0 on invalid 262 */ 263 rpmTagVal rpmdsTagEVR(const rpmds ds); 264 265 /** \ingroup rpmds 266 * Return current dependency type. 267 * @param ds dependency set 268 * @return current dependency type flags tag, 0 on invalid 269 */ 270 rpmTagVal rpmdsTagF(const rpmds ds); 271 272 /** \ingroup rpmds 273 * Return current dependency type. 274 * @param ds dependency set 275 * @return current dependency type trigger index tag, 0 on invalid 276 */ 277 rpmTagVal rpmdsTagTi(const rpmds ds); 278 279 /** \ingroup rpmds 280 * Return dependency header instance, ie whether the dependency comes from 281 * an installed header or not. 282 * @param ds dependency set 283 * @return header instance of dependency (0 for not installed) 284 */ 285 unsigned int rpmdsInstance(rpmds ds); 286 287 /** \ingroup rpmds 288 * Return whether dependency is weak 289 * @param ds dependency set 290 * @return 1 if weak, 0 if not 291 */ 292 int rpmdsIsWeak(rpmds ds); 293 294 /** \ingroup rpmds 295 * Return whether dependency is reversed 296 * @param ds dependency set 297 * @return 1 if reversed, 0 if not 298 */ 299 int rpmdsIsReverse(rpmds ds); 300 301 /** \ingroup rpmds 302 * Obsolete, do not use. 303 * @param ds unused 304 * @return 1 always 305 */ 306 int rpmdsNoPromote(const rpmds ds); 307 308 /** \ingroup rpmds 309 * Obsolete, do not use. 310 * @param ds unused 311 * @param nopromote unused 312 * @return 1 always 313 */ 314 int rpmdsSetNoPromote(rpmds ds, int nopromote); 315 316 /** \ingroup rpmds 317 * Return current dependency color. 318 * @param ds dependency set 319 * @return current dependency color 320 */ 321 rpm_color_t rpmdsColor(const rpmds ds); 322 323 /** \ingroup rpmds 324 * Return current dependency color. 325 * @param ds dependency set 326 * @param color new dependency color 327 * @return previous dependency color 328 */ 329 rpm_color_t rpmdsSetColor(const rpmds ds, rpm_color_t color); 330 331 /** \ingroup rpmds 332 * Return next dependency set iterator index. 333 * @param ds dependency set 334 * @return dependency set iterator index, -1 on termination 335 */ 336 int rpmdsNext(rpmds ds); 337 338 /** \ingroup rpmds 339 * Initialize dependency set iterator. 340 * @param ds dependency set 341 * @return dependency set 342 */ 343 rpmds rpmdsInit(rpmds ds); 344 345 /** \ingroup rpmds 346 * Find a dependency set element using binary search. 347 * @param ds dependency set to search 348 * @param ods dependency set element to find. 349 * @return dependency index (or -1 if not found) 350 */ 351 int rpmdsFind(rpmds ds, const rpmds ods); 352 353 /** \ingroup rpmds 354 * Merge a dependency set maintaining (N,EVR,Flags) sorted order. 355 * @retval *dsp (merged) dependency set 356 * @param ods dependency set to merge 357 * @return number of merged dependencies, -1 on error 358 */ 359 int rpmdsMerge(rpmds * dsp, rpmds ods); 360 361 /** \ingroup rpmds 362 * Search a sorted dependency set for an element that overlaps. 363 * A boolean result is saved (if allocated) and accessible through 364 * rpmdsResult(ods) afterwards. 365 * @param ds dependency set to search 366 * @param ods dependency set element to find. 367 * @return dependency index (or -1 if not found) 368 **/ 369 int rpmdsSearch(rpmds ds, rpmds ods); 370 371 /** \ingroup rpmds 372 * Compare two versioned dependency ranges, looking for overlap. 373 * @param A 1st dependency 374 * @param B 2nd dependency 375 * @return 1 if dependencies overlap, 0 otherwise 376 */ 377 int rpmdsCompare(const rpmds A, const rpmds B); 378 379 /** \ingroup rpmds 380 * Compare package provides dependencies from header with a single dependency. 381 * @param h header 382 * @param req dependency set 383 * @param nopromote unused 384 * @return 1 if any dependency overlaps, 0 otherwise 385 */ 386 int rpmdsAnyMatchesDep (const Header h, const rpmds req, int nopromote); 387 388 /** \ingroup rpmds 389 * Compare package provides dependencies from header with a single dependency. 390 * @param h header 391 * @param ix index in header provides 392 * @param req dependency set 393 * @param nopromote unused 394 * @return 1 if any dependency overlaps, 0 otherwise 395 */ 396 int rpmdsMatchesDep (const Header h, int ix, const rpmds req, int nopromote); 397 398 /** \ingroup rpmds 399 * Compare package name-version-release from header with a single dependency. 400 * @param h header 401 * @param req dependency set 402 * @param nopromote unused 403 * @return 1 if dependency overlaps, 0 otherwise 404 */ 405 int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote); 406 407 /** 408 * Load rpmlib provides into a dependency set. 409 * @retval *dsp (loaded) dependency set 410 * @param tblp rpmlib provides table (NULL uses internal table) 411 * @return 0 on success 412 */ 413 int rpmdsRpmlib(rpmds * dsp, const void * tblp); 414 415 /** \ingroup rpmds 416 * Create and load a dependency set. 417 * @param pool shared string pool (or NULL for private pool) 418 * @param h header 419 * @param tagN type of dependency 420 * @param flags unused 421 * @return new dependency set 422 */ 423 rpmds rpmdsNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, int flags); 424 425 /** \ingroup rpmds 426 * Create, load and initialize a dependency for this header. 427 * @param pool string pool (or NULL for private pool) 428 * @param h header 429 * @param tagN type of dependency 430 * @param Flags comparison flags 431 * @return new dependency set 432 */ 433 rpmds rpmdsThisPool(rpmstrPool pool, 434 Header h, rpmTagVal tagN, rpmsenseFlags Flags); 435 436 /** \ingroup rpmds 437 * Create, load and initialize a dependency set of size 1. 438 * @param pool string pool (or NULL for private pool) 439 * @param tagN type of dependency 440 * @param N name 441 * @param EVR epoch:version-release 442 * @param Flags comparison flags 443 * @return new dependency set 444 */ 445 rpmds rpmdsSinglePool(rpmstrPool pool, rpmTagVal tagN, 446 const char * N, const char * EVR, rpmsenseFlags Flags); 447 448 /** \ingroup rpmds 449 * Create, load and initialize a trigger dependency set of size 1. 450 * @param pool string pool (or NULL for private pool) 451 * @param tagN type of dependency 452 * @param N name 453 * @param EVR epoch:version-release 454 * @param Flags comparison flags 455 * @param triggerIndex trigger index 456 * @return new dependency set 457 */ 458 rpmds rpmdsSinglePoolTix(rpmstrPool pool, rpmTagVal tagN, 459 const char * N, const char * EVR, 460 rpmsenseFlags Flags, int triggerIndex); 461 462 /** 463 * Load rpmlib provides into a dependency set. 464 * @param pool shared string pool (or NULL for private pool) 465 * @retval *dsp (loaded) dependency set 466 * @param tblp rpmlib provides table (NULL uses internal table) 467 * @return 0 on success 468 */ 469 int rpmdsRpmlibPool(rpmstrPool pool, rpmds * dsp, const void * tblp); 470 471 472 typedef enum rpmrichOp_e { 473 RPMRICHOP_SINGLE = 1, 474 RPMRICHOP_AND = 2, 475 RPMRICHOP_OR = 3, 476 RPMRICHOP_IF = 4, 477 RPMRICHOP_ELSE = 5, 478 RPMRICHOP_WITH = 6, 479 RPMRICHOP_WITHOUT = 7, 480 RPMRICHOP_UNLESS = 8 481 } rpmrichOp; 482 483 typedef enum rpmrichParseType_e { 484 RPMRICH_PARSE_SIMPLE = 1, /* standard N <=> EVR dep */ 485 RPMRICH_PARSE_ENTER = 2, /* entering sub-dependency */ 486 RPMRICH_PARSE_LEAVE = 3, /* leaving sub-dependency */ 487 RPMRICH_PARSE_OP = 4 /* parsed a rich dependency op */ 488 } rpmrichParseType; 489 490 typedef rpmRC (*rpmrichParseFunction) (void *cbdata, rpmrichParseType type, 491 const char *n, int nl, const char *e, int el, rpmsenseFlags sense, 492 rpmrichOp op, char **emsg); 493 494 /** 495 * Parse a rich dependency string 496 * @param dstrp pointer to sting, will be updated 497 * @param emsg returns the error string, can be NULL 498 * @param cb callback function 499 * @param cbdata callback function data 500 * @return RPMRC_OK on success 501 */ 502 rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata); 503 504 /** 505 * Parse a rich dependency string for a specific tag 506 * @param dstrp pointer to sting, will be updated 507 * @param emsg returns the error string, can be NULL 508 * @param cb callback function 509 * @param cbdata callback function data 510 * @param tagN type of dependency 511 * @return RPMRC_OK on success 512 */ 513 rpmRC rpmrichParseForTag(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata, rpmTagVal tagN); 514 515 516 /** 517 * Return if current depenency is rich 518 * @param dep the dependency 519 * @return 1 is dependency is a rich 0 otherwise 520 */ 521 int rpmdsIsRich(rpmds dep); 522 523 /** 524 * Return a string representation of the rich dependency op 525 * @param op the dependency op 526 * @return constant string, do not free 527 */ 528 const char *rpmrichOpStr(rpmrichOp op); 529 530 /** 531 * Parse a rich dependency string 532 * @param dep the dependency 533 * @param leftds returns the left dependency 534 * @param rightds returns the right dependency 535 * @param op returns the rich dep op 536 * @param emsg returns the error string 537 * @return RPMRC_OK on success 538 */ 539 rpmRC rpmdsParseRichDep(rpmds dep, rpmds *leftds, rpmds *rightds, rpmrichOp *op, char **emsg); 540 541 #ifdef __cplusplus 542 } 543 #endif 544 545 #endif /* H_RPMDS */ 546