2 * \file build/reqprov.c
3 * Add dependency tags to package header(s).
8 #include <rpm/header.h>
9 #include <rpm/rpmstring.h>
10 #include "build/rpmbuild_misc.h"
13 static int isNewDep(Header h, rpmTagVal nametag,
14 const char *N, const char *EVR, rpmsenseFlags Flags,
15 rpmTagVal indextag, uint32_t index)
19 rpmds ads = rpmdsNew(h, nametag, 0);
20 rpmds bds = rpmdsSingle(nametag, N, EVR, Flags);
23 headerGet(h, indextag, &idx, HEADERGET_MINMEM);
26 /* XXX there's no guarantee the ds is sorted here so rpmdsFind() wont do */
28 while (isnew && rpmdsNext(ads) >= 0) {
29 if (!rstreq(rpmdsN(ads), rpmdsN(bds))) continue;
30 if (!rstreq(rpmdsEVR(ads), rpmdsEVR(bds))) continue;
31 if (rpmdsFlags(ads) != rpmdsFlags(bds)) continue;
32 if (indextag && rpmtdSetIndex(&idx, rpmdsIx(ads)) >= 0 &&
33 rpmtdGetNumber(&idx) != index) continue;
45 int addReqProv(Header h, rpmTagVal tagN,
46 const char * N, const char * EVR, rpmsenseFlags Flags,
49 rpmTagVal versiontag = 0;
50 rpmTagVal flagtag = 0;
51 rpmTagVal indextag = 0;
52 rpmsenseFlags extra = RPMSENSE_ANY;
55 case RPMTAG_PROVIDENAME:
56 versiontag = RPMTAG_PROVIDEVERSION;
57 flagtag = RPMTAG_PROVIDEFLAGS;
58 extra = Flags & RPMSENSE_FIND_PROVIDES;
60 case RPMTAG_OBSOLETENAME:
61 versiontag = RPMTAG_OBSOLETEVERSION;
62 flagtag = RPMTAG_OBSOLETEFLAGS;
64 case RPMTAG_CONFLICTNAME:
65 versiontag = RPMTAG_CONFLICTVERSION;
66 flagtag = RPMTAG_CONFLICTFLAGS;
68 case RPMTAG_TRIGGERNAME:
69 versiontag = RPMTAG_TRIGGERVERSION;
70 flagtag = RPMTAG_TRIGGERFLAGS;
71 indextag = RPMTAG_TRIGGERINDEX;
72 extra = Flags & RPMSENSE_TRIGGER;
74 case RPMTAG_REQUIRENAME:
76 tagN = RPMTAG_REQUIRENAME;
77 versiontag = RPMTAG_REQUIREVERSION;
78 flagtag = RPMTAG_REQUIREFLAGS;
79 extra = Flags & _ALL_REQUIRES_MASK;
82 /* rpmlib() dependency sanity: only requires permitted, ensure sense bit */
83 if (rstreqn(N, "rpmlib(", sizeof("rpmlib(")-1)) {
84 if (tagN != RPMTAG_REQUIRENAME) return 1;
85 extra |= RPMSENSE_RPMLIB;
88 Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
93 /* Avoid adding duplicate dependencies. */
94 if (isNewDep(h, tagN, N, EVR, Flags, indextag, index)) {
95 headerPutString(h, tagN, N);
96 headerPutString(h, versiontag, EVR);
97 headerPutUint32(h, flagtag, &Flags, 1);
99 headerPutUint32(h, indextag, &index, 1);
106 int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
108 char *reqname = NULL;
111 rasprintf(&reqname, "rpmlib(%s)", feature);
113 res = addReqProv(h, RPMTAG_REQUIRENAME, reqname, featureEVR,
114 RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);