2 * \file build/reqprov.c
3 * Add dependency tags to package header(s).
8 #include <rpm/header.h>
9 #include <rpm/rpmbuild.h>
12 static int isNewDep(Header h, rpmTag nametag,
13 const char *N, const char *EVR, rpmsenseFlags Flags,
14 rpmTag indextag, uint32_t index)
18 rpmds ads = rpmdsNew(h, nametag, 0);
19 rpmds bds = rpmdsSingle(nametag, N, EVR, Flags);
22 headerGet(h, indextag, &idx, HEADERGET_MINMEM);
25 /* XXX there's no guarantee the ds is sorted here so rpmdsFind() wont do */
27 while (new && rpmdsNext(ads) >= 0) {
28 if (!rstreq(rpmdsN(ads), rpmdsN(bds))) continue;
29 if (!rstreq(rpmdsEVR(ads), rpmdsEVR(bds))) continue;
30 if (rpmdsFlags(ads) != rpmdsFlags(bds)) continue;
31 if (indextag && rpmtdSetIndex(&idx, rpmdsIx(ads)) >= 0 &&
32 rpmtdGetNumber(&idx) != index) continue;
44 int addReqProv(rpmSpec spec, Header h, rpmTag tagN,
45 const char * N, const char * EVR, rpmsenseFlags Flags,
49 rpmTag versiontag = 0;
52 rpmsenseFlags extra = RPMSENSE_ANY;
54 if (Flags & RPMSENSE_PROVIDES) {
55 nametag = RPMTAG_PROVIDENAME;
56 versiontag = RPMTAG_PROVIDEVERSION;
57 flagtag = RPMTAG_PROVIDEFLAGS;
58 extra = Flags & RPMSENSE_FIND_PROVIDES;
59 } else if (Flags & RPMSENSE_OBSOLETES) {
60 nametag = RPMTAG_OBSOLETENAME;
61 versiontag = RPMTAG_OBSOLETEVERSION;
62 flagtag = RPMTAG_OBSOLETEFLAGS;
63 } else if (Flags & RPMSENSE_CONFLICTS) {
64 nametag = RPMTAG_CONFLICTNAME;
65 versiontag = RPMTAG_CONFLICTVERSION;
66 flagtag = RPMTAG_CONFLICTFLAGS;
67 } else if (Flags & RPMSENSE_PREREQ) {
68 nametag = RPMTAG_REQUIRENAME;
69 versiontag = RPMTAG_REQUIREVERSION;
70 flagtag = RPMTAG_REQUIREFLAGS;
71 extra = Flags & _ALL_REQUIRES_MASK;
72 } else if (Flags & RPMSENSE_TRIGGER) {
73 nametag = RPMTAG_TRIGGERNAME;
74 versiontag = RPMTAG_TRIGGERVERSION;
75 flagtag = RPMTAG_TRIGGERFLAGS;
76 indextag = RPMTAG_TRIGGERINDEX;
77 extra = Flags & RPMSENSE_TRIGGER;
79 nametag = RPMTAG_REQUIRENAME;
80 versiontag = RPMTAG_REQUIREVERSION;
81 flagtag = RPMTAG_REQUIREFLAGS;
82 extra = Flags & _ALL_REQUIRES_MASK;
85 Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
90 /* Avoid adding duplicate dependencies. */
91 if (isNewDep(h, nametag, N, EVR, Flags, indextag, index)) {
92 headerPutString(h, nametag, N);
93 headerPutString(h, versiontag, EVR);
94 headerPutUint32(h, flagtag, &Flags, 1);
96 headerPutUint32(h, indextag, &index, 1);
103 int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
105 char *reqname = NULL;
108 rasprintf(&reqname, "rpmlib(%s)", feature);
110 /* XXX 1st arg is unused */
111 res = addReqProv(NULL, h, RPMTAG_REQUIRENAME, reqname, featureEVR,
112 RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);