Brute-force s/rpmTag/rpmTagVal/ in entire librpmbuild
[platform/upstream/rpm.git] / build / reqprov.c
1 /** \ingroup rpmbuild
2  * \file build/reqprov.c
3  *  Add dependency tags to package header(s).
4  */
5
6 #include "system.h"
7
8 #include <rpm/header.h>
9 #include <rpm/rpmstring.h>
10 #include "build/rpmbuild_misc.h"
11 #include "debug.h"
12
13 static int isNewDep(Header h, rpmTagVal nametag,
14                   const char *N, const char *EVR, rpmsenseFlags Flags,
15                   rpmTagVal indextag, uint32_t index)
16 {
17     int isnew = 1;
18     struct rpmtd_s idx;
19     rpmds ads = rpmdsNew(h, nametag, 0);
20     rpmds bds = rpmdsSingle(nametag, N, EVR, Flags);
21
22     if (indextag) {
23         headerGet(h, indextag, &idx, HEADERGET_MINMEM);
24     }
25
26     /* XXX there's no guarantee the ds is sorted here so rpmdsFind() wont do */
27     rpmdsInit(ads);
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;
34         isnew = 0;
35     }
36     
37     if (indextag) {
38         rpmtdFreeData(&idx);
39     }
40     rpmdsFree(ads);
41     rpmdsFree(bds);
42     return isnew;
43 }
44
45 int addReqProv(Header h, rpmTagVal tagN,
46                 const char * N, const char * EVR, rpmsenseFlags Flags,
47                 uint32_t index)
48 {
49     rpmTagVal versiontag = 0;
50     rpmTagVal flagtag = 0;
51     rpmTagVal indextag = 0;
52     rpmsenseFlags extra = RPMSENSE_ANY;
53
54     switch (tagN) {
55     case RPMTAG_PROVIDENAME:
56         versiontag = RPMTAG_PROVIDEVERSION;
57         flagtag = RPMTAG_PROVIDEFLAGS;
58         extra = Flags & RPMSENSE_FIND_PROVIDES;
59         break;
60     case RPMTAG_OBSOLETENAME:
61         versiontag = RPMTAG_OBSOLETEVERSION;
62         flagtag = RPMTAG_OBSOLETEFLAGS;
63         break;
64     case RPMTAG_CONFLICTNAME:
65         versiontag = RPMTAG_CONFLICTVERSION;
66         flagtag = RPMTAG_CONFLICTFLAGS;
67         break;
68     case RPMTAG_TRIGGERNAME:
69         versiontag = RPMTAG_TRIGGERVERSION;
70         flagtag = RPMTAG_TRIGGERFLAGS;
71         indextag = RPMTAG_TRIGGERINDEX;
72         extra = Flags & RPMSENSE_TRIGGER;
73         break;
74     case RPMTAG_REQUIRENAME:
75     default:
76         tagN = RPMTAG_REQUIRENAME;
77         versiontag = RPMTAG_REQUIREVERSION;
78         flagtag = RPMTAG_REQUIREFLAGS;
79         extra = Flags & _ALL_REQUIRES_MASK;
80     }
81
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;
86     }
87
88     Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
89
90     if (EVR == NULL)
91         EVR = "";
92     
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);
98         if (indextag) {
99             headerPutUint32(h, indextag, &index, 1);
100         }
101     }
102
103     return 0;
104 }
105
106 int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
107 {
108     char *reqname = NULL;
109     int res;
110
111     rasprintf(&reqname, "rpmlib(%s)", feature);
112
113     res = addReqProv(h, RPMTAG_REQUIRENAME, reqname, featureEVR,
114                      RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
115
116     free(reqname);
117
118     return res;
119 }