- disambiguate added/installed dependency failures (#50388).
[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 /**
10  */
11 /*@-exportlocal@*/
12 /*@unchecked@*/
13 extern int _rpmds_debug;
14 /*@=exportlocal@*/
15
16 #if defined(_RPMDS_INTERNAL)
17 /**
18  * A package dependency set.
19  */
20 struct rpmds_s {
21     int i;                      /*!< Element index. */
22
23 /*@observer@*/
24     const char * Type;          /*!< Tag name. */
25 /*@only@*/ /*@null@*/
26     const char * DNEVR;         /*!< Formatted dependency string. */
27
28     rpmTag tagN;                /*!< Header tag. */
29 /*@refcounted@*/ /*@null@*/
30     Header h;                   /*!< Header for dependency set (or NULL) */
31
32 /*@only@*/
33     const char ** N;            /*!< Name. */
34 /*@only@*/
35     const char ** EVR;          /*!< Epoch-Version-Release. */
36 /*@only@*/
37     int_32 * Flags;             /*!< Flags identifying context/comparison. */
38     rpmTagType Nt, EVRt, Ft;    /*!< Tag data types. */
39     int_32 Count;               /*!< No. of elements */
40 /*@refs@*/
41     int nrefs;                  /*!< Reference count. */
42 };
43 #endif  /* _RPMDS_INTERNAL */
44
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48
49 /**
50  * Unreference a dependency set instance.
51  * @param ds            dependency set
52  * @param msg
53  * @return              NULL always
54  */
55 /*@unused@*/ /*@null@*/
56 rpmds rpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmds ds,
57                 /*@null@*/ const char * msg)
58         /*@modifies ds @*/;
59
60 /** @todo Remove debugging entry from the ABI. */
61 /*@-exportlocal@*/
62 /*@null@*/
63 rpmds XrpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmds ds,
64                 /*@null@*/ const char * msg, const char * fn, unsigned ln)
65         /*@modifies ds @*/;
66 /*@=exportlocal@*/
67 #define rpmdsUnlink(_ds, _msg)  XrpmdsUnlink(_ds, _msg, __FILE__, __LINE__)
68
69 /**
70  * Reference a dependency set instance.
71  * @param ds            dependency set
72  * @param msg
73  * @return              new dependency set reference
74  */
75 /*@unused@*/ /*@newref@*/
76 rpmds rpmdsLink (/*@null@*/ rpmds ds, /*@null@*/ const char * msg)
77         /*@modifies ds @*/;
78
79 /** @todo Remove debugging entry from the ABI. */
80 /*@newref@*/
81 rpmds XrpmdsLink (/*@null@*/ rpmds ds, /*@null@*/ const char * msg,
82                 const char * fn, unsigned ln)
83         /*@modifies ds @*/;
84 #define rpmdsLink(_ds, _msg)    XrpmdsLink(_ds, _msg, __FILE__, __LINE__)
85
86 /**
87  * Destroy a dependency set.
88  * @param ds            dependency set
89  * @return              NULL always
90  */
91 /*@null@*/
92 rpmds rpmdsFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmds ds)
93         /*@modifies ds@*/;
94 /**
95  * Create and load a dependency set.
96  * @param h             header
97  * @param tagN          type of dependency
98  * @param scareMem      Use pointers to refcounted header memory?
99  * @return              new dependency set
100  */
101 /*@null@*/
102 rpmds rpmdsNew(Header h, rpmTag tagN, int scareMem)
103         /*@modifies h @*/;
104
105 /**
106  * Return new formatted dependency string.
107  * @param dspfx         formatted dependency string prefix
108  * @param ds            dependency set
109  * @return              new formatted dependency (malloc'ed)
110  */
111 /*@only@*/
112 char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds)
113         /*@*/;
114
115 /**
116  * Create, load and initialize a dependency for this header. 
117  * @param h             header
118  * @param tagN          type of dependency
119  * @param Flags         comparison flags
120  * @return              new dependency set
121  */
122 /*@null@*/
123 rpmds rpmdsThis(Header h, rpmTag tagN, int_32 Flags)
124         /*@*/;
125
126 /**
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 /*@null@*/
135 rpmds rpmdsSingle(rpmTag tagN, const char * N, const char * EVR, int_32 Flags)
136         /*@*/;
137
138 /**
139  * Return dependency set count.
140  * @param ds            dependency set
141  * @return              current count
142  */
143 int rpmdsCount(/*@null@*/ const rpmds ds)
144         /*@*/;
145
146 /**
147  * Return dependency set index.
148  * @param ds            dependency set
149  * @return              current index
150  */
151 int rpmdsIx(/*@null@*/ const rpmds ds)
152         /*@*/;
153
154 /**
155  * Set dependency set index.
156  * @param ds            dependency set
157  * @param ix            new index
158  * @return              current index
159  */
160 int rpmdsSetIx(/*@null@*/ rpmds ds, int ix)
161         /*@modifies ds @*/;
162
163 /**
164  * Return current formatted dependency string.
165  * @param ds            dependency set
166  * @return              current dependency DNEVR, NULL on invalid
167  */
168 /*@observer@*/ /*@null@*/
169 extern const char * rpmdsDNEVR(/*@null@*/ const rpmds ds)
170         /*@*/;
171
172 /**
173  * Return current dependency name.
174  * @param ds            dependency set
175  * @return              current dependency name, NULL on invalid
176  */
177 /*@observer@*/ /*@null@*/
178 extern const char * rpmdsN(/*@null@*/ const rpmds ds)
179         /*@*/;
180
181 /**
182  * Return current dependency epoch-version-release.
183  * @param ds            dependency set
184  * @return              current dependency EVR, NULL on invalid
185  */
186 /*@observer@*/ /*@null@*/
187 extern const char * rpmdsEVR(/*@null@*/ const rpmds ds)
188         /*@*/;
189
190 /**
191  * Return current dependency flags.
192  * @param ds            dependency set
193  * @return              current dependency flags, 0 on invalid
194  */
195 int_32 rpmdsFlags(/*@null@*/ const rpmds ds)
196         /*@*/;
197
198 /**
199  * Return current dependency type.
200  * @param ds            dependency set
201  * @return              current dependency type, 0 on invalid
202  */
203 rpmTag rpmdsTagN(/*@null@*/ const rpmds ds)
204         /*@*/;
205
206 /**
207  * Notify of results of dependency match.
208  * @param ds            dependency set
209  * @param where         where dependency was resolved (or NULL)
210  * @param rc            0 == YES, otherwise NO
211  */
212 /*@-globuse@*/ /* FIX: rpmMessage annotation is a lie */
213 void rpmdsNotify(/*@null@*/ rpmds ds, /*@null@*/ const char * where, int rc)
214         /*@globals fileSystem @*/
215         /*@modifies fileSystem @*/;
216 /*@=globuse@*/
217
218 /**
219  * Return next dependency set iterator index.
220  * @param ds            dependency set
221  * @return              dependency set iterator index, -1 on termination
222  */
223 int rpmdsNext(/*@null@*/ rpmds ds)
224         /*@modifies ds @*/;
225
226 /**
227  * Initialize dependency set iterator.
228  * @param ds            dependency set
229  * @return              dependency set
230  */
231 /*@null@*/
232 rpmds rpmdsInit(/*@null@*/ rpmds ds)
233         /*@modifies ds @*/;
234
235 /**
236  * Compare two versioned dependency ranges, looking for overlap.
237  * @param A             1st dependency
238  * @param B             2nd dependency
239  * @return              1 if dependencies overlap, 0 otherwise
240  */
241 int rpmdsCompare(const rpmds A, const rpmds B)
242         /*@*/;
243
244 /**
245  * Report a Requires: or Conflicts: dependency problem.
246  * @param ps            transaction set problems
247  * @param pkgNEVR       package name/epoch/version/release
248  * @param ds            dependency set
249  * @param suggestedKeys filename or python object address
250  * @param adding        dependency problem is from added package set?
251  */
252 void rpmdsProblem(/*@null@*/ rpmps ps, const char * pkgNEVR, const rpmds ds,
253                 /*@only@*/ /*@null@*/ const fnpyKey * suggestedKeys,
254                 int adding)
255         /*@modifies ps @*/;
256
257 /**
258  * Compare package provides dependencies from header with a single dependency.
259  * @param h             header
260  * @param req           dependency set
261  */
262 int rangeMatchesDepFlags (Header h, const rpmds req)
263         /*@modifies h @*/;
264
265 /**
266  * Compare package name-version-release from header with a single dependency.
267  * @deprecated Remove from API when obsoletes is correctly implemented.
268  * @param h             header
269  * @param req           dependency
270  * @return              1 if dependency overlaps, 0 otherwise
271  */
272 int headerMatchesDepFlags(const Header h, const rpmds req)
273         /*@*/;
274
275 #ifdef __cplusplus
276 }
277 #endif
278
279 #endif  /* H_RPMDS */