Add rpmdsMatchesDep() as alternative to rpmdsAnyMatchesDep() to make use of the tag...
[platform/upstream/rpm.git] / lib / rpmds.h
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 };
54
55 typedef rpmFlags rpmsenseFlags;
56
57 #define RPMSENSE_SENSEMASK      15       /* Mask to get senses, ie serial, */
58                                          /* less, greater, equal.          */
59
60 #define RPMSENSE_TRIGGER        \
61         (RPMSENSE_TRIGGERPREIN | RPMSENSE_TRIGGERIN | RPMSENSE_TRIGGERUN | RPMSENSE_TRIGGERPOSTUN)
62
63 #define _ALL_REQUIRES_MASK      (\
64     RPMSENSE_INTERP | \
65     RPMSENSE_SCRIPT_PRE | \
66     RPMSENSE_SCRIPT_POST | \
67     RPMSENSE_SCRIPT_PREUN | \
68     RPMSENSE_SCRIPT_POSTUN | \
69     RPMSENSE_SCRIPT_VERIFY | \
70     RPMSENSE_FIND_REQUIRES | \
71     RPMSENSE_RPMLIB | \
72     RPMSENSE_KEYRING | \
73     RPMSENSE_PRETRANS | \
74     RPMSENSE_POSTTRANS | \
75     RPMSENSE_PREREQ)
76
77 #define _notpre(_x)             ((_x) & ~RPMSENSE_PREREQ)
78 #define _INSTALL_ONLY_MASK \
79     _notpre(RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_RPMLIB|RPMSENSE_KEYRING|RPMSENSE_PRETRANS|RPMSENSE_POSTTRANS)
80 #define _ERASE_ONLY_MASK  \
81     _notpre(RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN)
82
83 #define isLegacyPreReq(_x)  (((_x) & _ALL_REQUIRES_MASK) == RPMSENSE_PREREQ)
84 #define isInstallPreReq(_x)     ((_x) & _INSTALL_ONLY_MASK)
85 #define isErasePreReq(_x)       ((_x) & _ERASE_ONLY_MASK)
86
87 /** \ingroup rpmds
88  * Reference a dependency set instance.
89  * @param ds            dependency set
90  * @return              new dependency set reference
91  */
92 rpmds rpmdsLink(rpmds ds);
93
94 /** \ingroup rpmds
95  * Destroy a dependency set.
96  * @param ds            dependency set
97  * @return              NULL always
98  */
99 rpmds rpmdsFree(rpmds ds);
100 /** \ingroup rpmds
101  * Create and load a dependency set.
102  * @param h             header
103  * @param tagN          type of dependency
104  * @param flags         unused
105  * @return              new dependency set
106  */
107 rpmds rpmdsNew(Header h, rpmTagVal tagN, int flags);
108
109 /** \ingroup rpmds
110  * Return new formatted dependency string.
111  * @param dspfx         formatted dependency string prefix
112  * @param ds            dependency set
113  * @return              new formatted dependency (malloc'ed)
114  */
115 char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds);
116
117 /** \ingroup rpmds
118  * Create, load and initialize a dependency for this header. 
119  * @param h             header
120  * @param tagN          type of dependency
121  * @param Flags         comparison flags
122  * @return              new dependency set
123  */
124 rpmds rpmdsThis(Header h, rpmTagVal tagN, rpmsenseFlags Flags);
125
126 /** \ingroup rpmds
127  * Create, load and initialize a dependency set of size 1.
128  * @param tagN          type of dependency
129  * @param N             name
130  * @param EVR           epoch:version-release
131  * @param Flags         comparison flags
132  * @return              new dependency set
133  */
134 rpmds rpmdsSingle(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags);
135
136 /** \ingroup rpmds
137  * Return a new dependency set of size 1 from the current iteration index
138  * @param ds            dependency set
139  * @return              new dependency set
140  */
141 rpmds rpmdsCurrent(rpmds ds);
142
143 /** \ingroup rpmds
144  * Return dependency set count.
145  * @param ds            dependency set
146  * @return              current count
147  */
148 int rpmdsCount(const rpmds ds);
149
150 /** \ingroup rpmds
151  * Return dependency set index.
152  * @param ds            dependency set
153  * @return              current index
154  */
155 int rpmdsIx(const rpmds ds);
156
157 /** \ingroup rpmds
158  * Set dependency set index.
159  * @param ds            dependency set
160  * @param ix            new index
161  * @return              current index
162  */
163 int rpmdsSetIx(rpmds ds, int ix);
164
165 /** \ingroup rpmds
166  * Return current formatted dependency string.
167  * @param ds            dependency set
168  * @return              current dependency DNEVR, NULL on invalid
169  */
170 const char * rpmdsDNEVR(const rpmds ds);
171
172 /** \ingroup rpmds
173  * Return current dependency name.
174  * @param ds            dependency set
175  * @return              current dependency name, NULL on invalid
176  */
177 const char * rpmdsN(const rpmds ds);
178
179 /** \ingroup rpmds
180  * Return current dependency epoch-version-release.
181  * @param ds            dependency set
182  * @return              current dependency EVR, NULL on invalid
183  */
184 const char * rpmdsEVR(const rpmds ds);
185
186 /** \ingroup rpmds
187  * Return current dependency flags.
188  * @param ds            dependency set
189  * @return              current dependency flags, 0 on invalid
190  */
191 rpmsenseFlags rpmdsFlags(const rpmds ds);
192
193 /** \ingroup rpmds
194  * Return current dependency type.
195  * @param ds            dependency set
196  * @return              current dependency type, 0 on invalid
197  */
198 rpmTagVal rpmdsTagN(const rpmds ds);
199
200 /** \ingroup rpmds
201  * Return dependency header instance, ie whether the dependency comes from 
202  * an installed header or not.
203  * @param ds            dependency set
204  * @return              header instance of dependency (0 for not installed)
205  */
206 unsigned int rpmdsInstance(rpmds ds);
207
208 /** \ingroup rpmds
209  * Return current "Don't promote Epoch:" flag.
210  *
211  * This flag controls for Epoch: promotion when a dependency set is
212  * compared. If the flag is set (for already installed packages), then
213  * an unspecified value will be treated as Epoch: 0. Otherwise (for added
214  * packages), the Epoch: portion of the comparison is skipped if the value
215  * is not specified, i.e. an unspecified Epoch: is assumed to be equal
216  * in dependency comparisons.
217  *
218  * @param ds            dependency set
219  * @return              current "Don't promote Epoch:" flag
220  */
221 int rpmdsNoPromote(const rpmds ds);
222
223 /** \ingroup rpmds
224  * Set "Don't promote Epoch:" flag.
225  * @param ds            dependency set
226  * @param nopromote     Should an unspecified Epoch: be treated as Epoch: 0?
227  * @return              previous "Don't promote Epoch:" flag
228  */
229 int rpmdsSetNoPromote(rpmds ds, int nopromote);
230
231 /** \ingroup rpmds
232  * Return current dependency color.
233  * @param ds            dependency set
234  * @return              current dependency color
235  */
236 rpm_color_t rpmdsColor(const rpmds ds);
237
238 /** \ingroup rpmds
239  * Return current dependency color.
240  * @param ds            dependency set
241  * @param color         new dependency color
242  * @return              previous dependency color
243  */
244 rpm_color_t rpmdsSetColor(const rpmds ds, rpm_color_t color);
245
246 /** \ingroup rpmds
247  * Notify of results of dependency match.
248  * @param ds            dependency set
249  * @param where         where dependency was resolved (or NULL)
250  * @param rc            0 == YES, otherwise NO
251  */
252 /* FIX: rpmMessage annotation is a lie */
253 void rpmdsNotify(rpmds ds, const char * where, int rc);
254
255 /** \ingroup rpmds
256  * Return next dependency set iterator index.
257  * @param ds            dependency set
258  * @return              dependency set iterator index, -1 on termination
259  */
260 int rpmdsNext(rpmds ds);
261
262 /** \ingroup rpmds
263  * Initialize dependency set iterator.
264  * @param ds            dependency set
265  * @return              dependency set
266  */
267 rpmds rpmdsInit(rpmds ds);
268
269 /** \ingroup rpmds
270  * Find a dependency set element using binary search.
271  * @param ds            dependency set to search
272  * @param ods           dependency set element to find.
273  * @return              dependency index (or -1 if not found)
274  */
275 int rpmdsFind(rpmds ds, const rpmds ods);
276
277 /** \ingroup rpmds
278  * Merge a dependency set maintaining (N,EVR,Flags) sorted order.
279  * @retval *dsp         (merged) dependency set
280  * @param ods           dependency set to merge
281  * @return              (merged) dependency index
282  */
283 int rpmdsMerge(rpmds * dsp, rpmds ods);
284
285 /** \ingroup rpmds
286  * Search a sorted dependency set for an element that overlaps.
287  * A boolean result is saved (if allocated) and accessible through
288  * rpmdsResult(ods) afterwards.
289  * @param ds            dependency set to search
290  * @param ods           dependency set element to find.
291  * @return              dependency index (or -1 if not found)
292  **/
293 int rpmdsSearch(rpmds ds, rpmds ods);
294
295 /** \ingroup rpmds
296  * Compare two versioned dependency ranges, looking for overlap.
297  * @param A             1st dependency
298  * @param B             2nd dependency
299  * @return              1 if dependencies overlap, 0 otherwise
300  */
301 int rpmdsCompare(const rpmds A, const rpmds B);
302
303 /** \ingroup rpmds
304  * Compare package provides dependencies from header with a single dependency.
305  * @param h             header
306  * @param req           dependency set
307  * @param nopromote     Don't promote Epoch: in comparison?
308  * @return              1 if any dependency overlaps, 0 otherwise
309  */
310 int rpmdsAnyMatchesDep (const Header h, const rpmds req, int nopromote);
311
312 /** \ingroup rpmds
313  * Compare package provides dependencies from header with a single dependency.
314  * @param h             header
315  * @param ix            index in header provides
316  * @param req           dependency set
317  * @param nopromote     Don't promote Epoch: in comparison?
318  * @return              1 if any dependency overlaps, 0 otherwise
319  */
320 int rpmdsMatchesDep (const Header h, int ix, const rpmds req, int nopromote);
321
322 /** \ingroup rpmds
323  * Compare package name-version-release from header with a single dependency.
324  * @param h             header
325  * @param req           dependency set
326  * @param nopromote     Don't promote Epoch: in comparison?
327  * @return              1 if dependency overlaps, 0 otherwise
328  */
329 int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote);
330
331 /**
332  * Load rpmlib provides into a dependency set.
333  * @retval *dsp         (loaded) depedency set
334  * @param tblp          rpmlib provides table (NULL uses internal table)
335  * @return              0 on success
336  */
337 int rpmdsRpmlib(rpmds * dsp, const void * tblp);
338
339 #ifdef __cplusplus
340 }
341 #endif
342
343 #endif  /* H_RPMDS */