Sanitize python object -> tag number exception handling
[platform/upstream/rpm.git] / lib / rpmfi.h
1 #ifndef H_RPMFI
2 #define H_RPMFI
3
4 /** \ingroup rpmdep rpmtrans
5  * \file lib/rpmfi.h
6  * Structure(s) used for file info tag sets.
7  */
8
9 #include <rpm/rpmtypes.h>
10 #include <rpm/rpmvf.h>
11 #include <rpm/rpmpgp.h>
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 extern int _rpmfi_debug;
18
19 /** \ingroup rpmfi
20  * File types.
21  * These are the file types used internally by rpm. The file
22  * type is determined by applying stat(2) macros like S_ISDIR to
23  * the file mode tag from a header. The values are arbitrary,
24  * but are identical to the linux stat(2) file types.
25  */
26 typedef enum rpmFileTypes_e {
27     PIPE        =  1,   /*!< pipe/fifo */
28     CDEV        =  2,   /*!< character device */
29     XDIR        =  4,   /*!< directory */
30     BDEV        =  6,   /*!< block device */
31     REG         =  8,   /*!< regular file */
32     LINK        = 10,   /*!< hard link */
33     SOCK        = 12    /*!< socket */
34 } rpmFileTypes;
35
36 /**
37  * File States (when installed).
38  */
39 typedef enum rpmfileState_e {
40     RPMFILE_STATE_NORMAL        = 0,
41     RPMFILE_STATE_REPLACED      = 1,
42     RPMFILE_STATE_NOTINSTALLED  = 2,
43     RPMFILE_STATE_NETSHARED     = 3,
44     RPMFILE_STATE_WRONGCOLOR    = 4
45 } rpmfileState;
46 #define RPMFILE_STATE_MISSING   -1      /* XXX used for unavailable data */
47
48 /**
49  * File Attributes.
50  */
51 typedef enum rpmfileAttrs_e {
52     RPMFILE_NONE        = 0,
53     RPMFILE_CONFIG      = (1 <<  0),    /*!< from %%config */
54     RPMFILE_DOC         = (1 <<  1),    /*!< from %%doc */
55     RPMFILE_ICON        = (1 <<  2),    /*!< from %%donotuse. */
56     RPMFILE_MISSINGOK   = (1 <<  3),    /*!< from %%config(missingok) */
57     RPMFILE_NOREPLACE   = (1 <<  4),    /*!< from %%config(noreplace) */
58     RPMFILE_SPECFILE    = (1 <<  5),    /*!< @todo (unnecessary) marks 1st file in srpm. */
59     RPMFILE_GHOST       = (1 <<  6),    /*!< from %%ghost */
60     RPMFILE_LICENSE     = (1 <<  7),    /*!< from %%license */
61     RPMFILE_README      = (1 <<  8),    /*!< from %%readme */
62     RPMFILE_EXCLUDE     = (1 <<  9),    /*!< from %%exclude, internal */
63     RPMFILE_UNPATCHED   = (1 << 10),    /*!< placeholder (SuSE) */
64     RPMFILE_PUBKEY      = (1 << 11),    /*!< from %%pubkey */
65     RPMFILE_POLICY      = (1 << 12)     /*!< from %%policy */
66 } rpmfileAttrs;
67
68 #define RPMFILE_ALL     ~(RPMFILE_NONE)
69
70 /** \ingroup rpmfi
71  * File disposition(s) during package install/erase transaction.
72  */
73 typedef enum rpmFileAction_e {
74     FA_UNKNOWN = 0,     /*!< initial action for file ... */
75     FA_CREATE,          /*!< ... copy in from payload. */
76     FA_COPYIN,          /*!< ... copy in from payload. */
77     FA_COPYOUT,         /*!< ... copy out to payload. */
78     FA_BACKUP,          /*!< ... renamed with ".rpmorig" extension. */
79     FA_SAVE,            /*!< ... renamed with ".rpmsave" extension. */
80     FA_SKIP,            /*!< ... already replaced, don't remove. */
81     FA_ALTNAME,         /*!< ... create with ".rpmnew" extension. */
82     FA_ERASE,           /*!< ... to be removed. */
83     FA_SKIPNSTATE,      /*!< ... untouched, state "not installed". */
84     FA_SKIPNETSHARED,   /*!< ... untouched, state "netshared". */
85     FA_SKIPCOLOR        /*!< ... untouched, state "wrong color". */
86 } rpmFileAction;
87
88 #define XFA_SKIPPING(_a)        \
89     ((_a) == FA_SKIP || (_a) == FA_SKIPNSTATE || (_a) == FA_SKIPNETSHARED || (_a) == FA_SKIPCOLOR)
90
91 /**
92  * We pass these around as an array with a sentinel.
93  */
94 struct rpmRelocation_s {
95     char * oldPath;     /*!< NULL here evals to RPMTAG_DEFAULTPREFIX, */
96     char * newPath;     /*!< NULL means to omit the file completely! */
97 };
98
99 /** \ingroup rpmfi
100  * Unreference a file info set instance.
101  * @param fi            file info set
102  * @param msg
103  * @return              NULL always
104  */
105 rpmfi rpmfiUnlink (rpmfi fi,
106                 const char * msg);
107
108 /** \ingroup rpmfi
109  * Reference a file info set instance.
110  * @param fi            file info set
111  * @param msg
112  * @return              new file info set reference
113  */
114 rpmfi rpmfiLink (rpmfi fi, const char * msg);
115
116 /** \ingroup rpmfi
117  * Return file count from file info set.
118  * @param fi            file info set
119  * @return              current file count
120  */
121 rpm_count_t rpmfiFC(rpmfi fi);
122
123 /** \ingroup rpmfi
124  * Return current file index from file info set.
125  * @param fi            file info set
126  * @return              current file index
127  */
128 int rpmfiFX(rpmfi fi);
129
130 /** \ingroup rpmfi
131  * Set current file index in file info set.
132  * @param fi            file info set
133  * @param fx            new file index
134  * @return              current file index
135  */
136 int rpmfiSetFX(rpmfi fi, int fx);
137
138 /** \ingroup rpmfi
139  * Return directory count from file info set.
140  * @param fi            file info set
141  * @return              current directory count
142  */
143 rpm_count_t rpmfiDC(rpmfi fi);
144
145 /** \ingroup rpmfi
146  * Return current directory index from file info set.
147  * @param fi            file info set
148  * @return              current directory index
149  */
150 int rpmfiDX(rpmfi fi);
151
152 /** \ingroup rpmfi
153  * Set current directory index in file info set.
154  * @param fi            file info set
155  * @param dx            new directory index
156  * @return              current directory index
157  */
158 int rpmfiSetDX(rpmfi fi, int dx);
159
160 /** \ingroup rpmfi
161  * Return current base name from file info set.
162  * @param fi            file info set
163  * @return              current base name, NULL on invalid
164  */
165 const char * rpmfiBN(rpmfi fi);
166
167 /** \ingroup rpmfi
168  * Return current directory name from file info set.
169  * @param fi            file info set
170  * @return              current directory, NULL on invalid
171  */
172 const char * rpmfiDN(rpmfi fi);
173
174 /** \ingroup rpmfi
175  * Return current file name from file info set.
176  * @param fi            file info set
177  * @return              current file name
178  */
179 const char * rpmfiFN(rpmfi fi);
180
181 /** \ingroup rpmfi
182  * Return current file flags from file info set.
183  * @param fi            file info set
184  * @return              current file flags, 0 on invalid
185  */
186 rpmfileAttrs rpmfiFFlags(rpmfi fi);
187
188 /** \ingroup rpmfi
189  * Return current file verify flags from file info set.
190  * @param fi            file info set
191  * @return              current file verify flags, 0 on invalid
192  */
193 rpmVerifyAttrs rpmfiVFlags(rpmfi fi);
194
195 /** \ingroup rpmfi
196  * Return current file mode from file info set.
197  * @param fi            file info set
198  * @return              current file mode, 0 on invalid
199  */
200 rpm_mode_t rpmfiFMode(rpmfi fi);
201
202 /** \ingroup rpmfi
203  * Return current file state from file info set.
204  * @param fi            file info set
205  * @return              current file state, 0 on invalid
206  */
207 rpmfileState rpmfiFState(rpmfi fi);
208
209 /** \ingroup rpmfi
210  * Return digest algorithm of a file info set.
211  * @param fi            file info set
212  * @return              digest algorithm of file info set, 0 on invalid
213  */
214 pgpHashAlgo rpmfiDigestAlgo(rpmfi fi);
215
216 /** \ingroup rpmfi
217  * Return current file (binary) digest of file info set.
218  * @param fi            file info set
219  * @retval algo         digest hash algoritm used (pass NULL to ignore)
220  * @retval diglen       digest hash length (pass NULL to ignore)
221  * @return              current file digest, NULL on invalid
222  */
223 const unsigned char * rpmfiFDigest(rpmfi fi, pgpHashAlgo *algo, size_t *diglen);
224
225 /** \ingroup rpmfi
226  * Return current file (hex) digest of file info set.
227  * The file info set stores file digests in binary format to conserve
228  * memory, this converts the binary data back to hex presentation used in
229  * headers. 
230  * @param fi            file info set
231  * @retval algo         digest hash algoritm used (pass NULL to ignore)
232  * @return              current file digest (malloc'ed), NULL on invalid
233  */
234 char * rpmfiFDigestHex(rpmfi fi, pgpHashAlgo *algo);
235
236 /** \ingroup rpmfi
237  * Return current file (binary) md5 digest from file info set.
238  * @deprecated          Use rpmfiFDigest() instead
239  * @param fi            file info set
240  * @return              current file md5 digest, NULL on invalid
241  */
242 const unsigned char * rpmfiMD5(rpmfi fi) RPM_GNUC_DEPRECATED;
243
244 /** \ingroup rpmfi
245  * Return current file linkto (i.e. symlink(2) target) from file info set.
246  * @param fi            file info set
247  * @return              current file linkto, NULL on invalid
248  */
249 const char * rpmfiFLink(rpmfi fi);
250
251 /** \ingroup rpmfi
252  * Return current file size from file info set.
253  * @param fi            file info set
254  * @return              current file size, 0 on invalid
255  */
256 rpm_loff_t rpmfiFSize(rpmfi fi);
257
258 /** \ingroup rpmfi
259  * Return current file rdev from file info set.
260  * @param fi            file info set
261  * @return              current file rdev, 0 on invalid
262  */
263 rpm_rdev_t rpmfiFRdev(rpmfi fi);
264
265 /** \ingroup rpmfi
266  * Return current file inode from file info set.
267  * @param fi            file info set
268  * @return              current file inode, 0 on invalid
269  */
270 rpm_ino_t rpmfiFInode(rpmfi fi);
271
272 /** \ingroup rpmfi
273  * Return union of all file color bits from file info set.
274  * @param fi            file info set
275  * @return              current color
276  */
277 rpm_color_t rpmfiColor(rpmfi fi);
278
279 /** \ingroup rpmfi
280  * Return current file color bits from file info set.
281  * @param fi            file info set
282  * @return              current file color
283  */
284 rpm_color_t rpmfiFColor(rpmfi fi);
285
286 /** \ingroup rpmfi
287  * Return current file class from file info set.
288  * @param fi            file info set
289  * @return              current file class, 0 on invalid
290  */
291 const char * rpmfiFClass(rpmfi fi);
292
293 /** \ingroup rpmfi
294  * Return current file depends dictionary from file info set.
295  * @param fi            file info set
296  * @retval *fddictp     file depends dictionary array (or NULL)
297  * @return              no. of file depends entries, 0 on invalid
298  */
299 uint32_t rpmfiFDepends(rpmfi fi,
300                 const uint32_t ** fddictp);
301
302 /** \ingroup rpmfi
303  * Return (calculated) current file nlink count from file info set.
304  * @param fi            file info set
305  * @return              current file nlink count, 0 on invalid
306  */
307 uint32_t rpmfiFNlink(rpmfi fi);
308
309 /** \ingroup rpmfi
310  * Return current file modify time from file info set.
311  * @param fi            file info set
312  * @return              current file modify time, 0 on invalid
313  */
314 rpm_time_t rpmfiFMtime(rpmfi fi);
315
316 /** \ingroup rpmfi
317  * Return current file owner from file info set.
318  * @param fi            file info set
319  * @return              current file owner, NULL on invalid
320  */
321 const char * rpmfiFUser(rpmfi fi);
322
323 /** \ingroup rpmfi
324  * Return current file group from file info set.
325  * @param fi            file info set
326  * @return              current file group, NULL on invalid
327  */
328 const char * rpmfiFGroup(rpmfi fi);
329
330 /** \ingroup rpmfi
331  * Return textual representation of current file capabilities 
332  * from file info set. See cap_from_text(3) for details.
333  * @param fi            file info set
334  * @return              file capability description, "" for no capabilities
335  *                      and NULL on invalid
336  */
337 const char * rpmfiFCaps(rpmfi fi);
338
339 /** \ingroup rpmfi
340  * Return current file language(s) from file info set.
341  * @param fi            file info set
342  * @return              current file language(s), NULL on invalid
343  */
344 const char * rpmfiFLangs(rpmfi fi);
345
346 /** \ingroup rpmfi
347  * Return next file iterator index.
348  * @param fi            file info set
349  * @return              file iterator index, -1 on termination
350  */
351 int rpmfiNext(rpmfi fi);
352
353 /** \ingroup rpmfi
354  * Initialize file iterator index.
355  * @param fi            file info set
356  * @param fx            file iterator index
357  * @return              file info set
358  */
359 rpmfi rpmfiInit(rpmfi fi, int fx);
360
361 /** \ingroup rpmfi
362  * Return next directory iterator index.
363  * @param fi            file info set
364  * @return              directory iterator index, -1 on termination
365  */
366 int rpmfiNextD(rpmfi fi);
367
368 /** \ingroup rpmfi
369  * Initialize directory iterator index.
370  * @param fi            file info set
371  * @param dx            directory iterator index
372  * @return              file info set, NULL if dx is out of range
373  */
374 rpmfi rpmfiInitD(rpmfi fi, int dx);
375
376 /** \ingroup rpmfi
377  * Destroy a file info set.
378  * @param fi            file info set
379  * @return              NULL always
380  */
381 rpmfi rpmfiFree(rpmfi fi);
382
383 typedef enum rpmfiFlags_e {
384     RPMFI_NOHEADER              = 0,
385     RPMFI_KEEPHEADER            = (1 << 0),
386     RPMFI_NOFILECLASS           = (1 << 1),
387     RPMFI_NOFILEDEPS            = (1 << 2),
388     RPMFI_NOFILELANGS           = (1 << 3),
389     RPMFI_NOFILEUSER            = (1 << 4),
390     RPMFI_NOFILEGROUP           = (1 << 5),
391     RPMFI_NOFILEMODES           = (1 << 6),
392     RPMFI_NOFILESIZES           = (1 << 7),
393     RPMFI_NOFILECAPS            = (1 << 8),
394     RPMFI_NOFILELINKTOS         = (1 << 9),
395     RPMFI_NOFILEDIGESTS         = (1 << 10),
396     RPMFI_NOFILEMTIMES          = (1 << 11),
397     RPMFI_NOFILERDEVS           = (1 << 12),
398     RPMFI_NOFILEINODES          = (1 << 13),
399     RPMFI_NOFILESTATES          = (1 << 14),
400     RPMFI_NOFILECOLORS          = (1 << 15),
401     RPMFI_NOFILEVERIFYFLAGS     = (1 << 16),
402     RPMFI_NOFILEFLAGS           = (1 << 17),
403     RPMFI_ISBUILD               = (1 << 30),    /* internal */
404     RPMFI_ISSOURCE              = (1 << 31),    /* internal */
405 } rpmfiFlags;
406
407 #define RPMFI_FLAGS_ERASE \
408     (RPMFI_NOFILECLASS | RPMFI_NOFILELANGS | \
409      RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | RPMFI_NOFILEINODES | \
410      RPMFI_NOFILEVERIFYFLAGS)
411
412 #define RPMFI_FLAGS_INSTALL \
413     (RPMFI_NOFILECLASS | RPMFI_NOFILEVERIFYFLAGS)
414
415 #define RPMFI_FLAGS_VERIFY \
416     (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
417      RPMFI_NOFILECOLORS)
418
419 #define RPMFI_FLAGS_QUERY \
420     (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
421      RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS)
422
423 /** \ingroup rpmfi
424  * Create and load a file info set.
425  * @param ts            unused
426  * @param h             header
427  * @param tagN          unused
428  * @param flags         Flags to control what information is loaded.
429  * @return              new file info set
430  */
431 rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags);
432
433 /** \ingroup rpmfi
434  * Return file type from mode_t.
435  * @param mode          file mode bits (from header)
436  * @return              file type
437  */
438 rpmFileTypes rpmfiWhatis(rpm_mode_t mode);
439
440 /** \ingroup rpmfi
441  * Return file info comparison.
442  * @param afi           1st file info
443  * @param bfi           2nd file info
444  * @return              0 if identical
445  */
446 int rpmfiCompare(const rpmfi afi, const rpmfi bfi);
447
448 /** \ingroup rpmfi
449  * Return file disposition.
450  * @param ofi           old file info
451  * @param nfi           new file info
452  * @param skipMissing   OK to skip missing files?
453  * @return              file dispostion
454  */
455 rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing);
456
457 /** \ingroup rpmfi
458  * Return whether file is conflicting config
459  * @param fi            file info
460  * @return              1 if config file and file on disk conflicts
461  */
462 int rpmfiConfigConflict(const rpmfi fi);
463
464 #ifdef __cplusplus
465 }
466 #endif
467
468 #endif  /* H_RPMDS */