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