4 /** \ingroup rpmfilesles
12 #include <rpm/rpmtypes.h>
13 #include <rpm/rpmvf.h>
14 #include <rpm/rpmpgp.h>
18 * These are the file types used internally by rpm. The file
19 * type is determined by applying stat(2) macros like S_ISDIR to
20 * the file mode tag from a header. The values are arbitrary,
21 * but are identical to the linux stat(2) file types.
23 typedef enum rpmFileTypes_e {
24 PIPE = 1, /*!< pipe/fifo */
25 CDEV = 2, /*!< character device */
26 XDIR = 4, /*!< directory */
27 BDEV = 6, /*!< block device */
28 REG = 8, /*!< regular file */
29 LINK = 10, /*!< hard link */
30 SOCK = 12 /*!< socket */
34 * File States (when installed).
36 typedef enum rpmfileState_e {
37 RPMFILE_STATE_MISSING = -1, /* used for unavailable data */
38 RPMFILE_STATE_NORMAL = 0,
39 RPMFILE_STATE_REPLACED = 1,
40 RPMFILE_STATE_NOTINSTALLED = 2,
41 RPMFILE_STATE_NETSHARED = 3,
42 RPMFILE_STATE_WRONGCOLOR = 4
45 #define RPMFILE_IS_INSTALLED(_x) ((_x) == RPMFILE_STATE_NORMAL || (_x) == RPMFILE_STATE_NETSHARED)
48 * Exported File Attributes (ie RPMTAG_FILEFLAGS)
52 RPMFILE_CONFIG = (1 << 0), /*!< from %%config */
53 RPMFILE_DOC = (1 << 1), /*!< from %%doc */
54 RPMFILE_ICON = (1 << 2), /*!< from %%donotuse. */
55 RPMFILE_MISSINGOK = (1 << 3), /*!< from %%config(missingok) */
56 RPMFILE_NOREPLACE = (1 << 4), /*!< from %%config(noreplace) */
57 RPMFILE_SPECFILE = (1 << 5), /*!< @todo (unnecessary) marks 1st file in srpm. */
58 RPMFILE_GHOST = (1 << 6), /*!< from %%ghost */
59 RPMFILE_LICENSE = (1 << 7), /*!< from %%license */
60 RPMFILE_README = (1 << 8), /*!< from %%readme */
61 /* bits 9-10 unused */
62 RPMFILE_PUBKEY = (1 << 11), /*!< from %%pubkey */
63 RPMFILE_ARTIFACT = (1 << 12), /*!< from %%artifact */
64 RPMFILE_SECMANIFEST = (1 << 13), /*!< from %%manifest */
67 typedef rpmFlags rpmfileAttrs;
69 #define RPMFILE_ALL ~(RPMFILE_NONE)
72 * File disposition(s) during package install/erase transaction.
74 typedef enum rpmFileAction_e {
75 FA_UNKNOWN = 0, /*!< initial action for file ... */
76 FA_CREATE = 1, /*!< ... create from payload. */
77 FA_COPYIN = 2, /*!< obsolete, unused. */
78 FA_COPYOUT = 3, /*!< obsolete, unused. */
79 FA_BACKUP = 4, /*!< ... renamed with ".rpmorig" extension. */
80 FA_SAVE = 5, /*!< ... renamed with ".rpmsave" extension. */
81 FA_SKIP = 6, /*!< ... already replaced, don't remove. */
82 FA_ALTNAME = 7, /*!< ... create with ".rpmnew" extension. */
83 FA_ERASE = 8, /*!< ... to be removed. */
84 FA_SKIPNSTATE = 9, /*!< ... untouched, state "not installed". */
85 FA_SKIPNETSHARED = 10, /*!< ... untouched, state "netshared". */
86 FA_SKIPCOLOR = 11, /*!< ... untouched, state "wrong color". */
87 FA_TOUCH = 12, /*!< ... change metadata only. */
88 /* bits 16-31 reserved */
91 #define XFA_SKIPPING(_a) \
92 ((_a) == FA_SKIP || (_a) == FA_SKIPNSTATE || (_a) == FA_SKIPNETSHARED || (_a) == FA_SKIPCOLOR)
95 * We pass these around as an array with a sentinel.
97 struct rpmRelocation_s {
98 char * oldPath; /*!< NULL here evals to RPMTAG_DEFAULTPREFIX, */
99 char * newPath; /*!< NULL means to omit the file completely! */
104 RPMFI_KEEPHEADER = (1 << 0),
105 RPMFI_NOFILECLASS = (1 << 1),
106 RPMFI_NOFILEDEPS = (1 << 2),
107 RPMFI_NOFILELANGS = (1 << 3),
108 RPMFI_NOFILEUSER = (1 << 4),
109 RPMFI_NOFILEGROUP = (1 << 5),
110 RPMFI_NOFILEMODES = (1 << 6),
111 RPMFI_NOFILESIZES = (1 << 7),
112 RPMFI_NOFILECAPS = (1 << 8),
113 RPMFI_NOFILELINKTOS = (1 << 9),
114 RPMFI_NOFILEDIGESTS = (1 << 10),
115 RPMFI_NOFILEMTIMES = (1 << 11),
116 RPMFI_NOFILERDEVS = (1 << 12),
117 RPMFI_NOFILEINODES = (1 << 13),
118 RPMFI_NOFILESTATES = (1 << 14),
119 RPMFI_NOFILECOLORS = (1 << 15),
120 RPMFI_NOFILEVERIFYFLAGS = (1 << 16),
121 RPMFI_NOFILEFLAGS = (1 << 17),
122 RPMFI_NOFILESIGNATURES = (1 << 18),
125 typedef rpmFlags rpmfiFlags;
127 #define RPMFI_FLAGS_ERASE \
128 (RPMFI_NOFILECLASS | RPMFI_NOFILELANGS | \
129 RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | RPMFI_NOFILEINODES | \
130 RPMFI_NOFILEVERIFYFLAGS)
132 #define RPMFI_FLAGS_INSTALL \
133 (RPMFI_NOFILECLASS | RPMFI_NOFILEVERIFYFLAGS)
135 #define RPMFI_FLAGS_VERIFY \
136 (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
139 #define RPMFI_FLAGS_QUERY \
140 (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
141 RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS)
143 #define RPMFI_FLAGS_FILETRIGGER \
144 (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
145 RPMFI_NOFILEUSER | RPMFI_NOFILEGROUP | RPMFI_NOFILEMODES | \
146 RPMFI_NOFILESIZES | RPMFI_NOFILECAPS | RPMFI_NOFILELINKTOS | \
147 RPMFI_NOFILEDIGESTS | RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | \
148 RPMFI_NOFILEINODES | RPMFI_NOFILECOLORS | \
149 RPMFI_NOFILEVERIFYFLAGS | RPMFI_NOFILEFLAGS)
151 #define RPMFI_FLAGS_ONLY_FILENAMES \
152 (RPMFI_FLAGS_FILETRIGGER | RPMFI_NOFILESTATES)
154 typedef enum rpmFileIter_e {
157 RPMFI_ITER_WRITE_ARCHIVE = 2,
158 RPMFI_ITER_READ_ARCHIVE = 3,
159 RPMFI_ITER_READ_ARCHIVE_CONTENT_FIRST = 4,
160 RPMFI_ITER_READ_ARCHIVE_OMIT_HARDLINKS = 5,
161 RPMFI_ITER_INTERVAL = 6,
164 #define RPMFILEITERMAX 6
170 /** \ingroup rpmfiles
171 * Create and load a file info set.
172 * @param pool shared string pool (or NULL for private pool)
175 * @param flags Flags to control what information is loaded.
176 * @return new file info set
178 rpmfiles rpmfilesNew(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags);
180 /** \ingroup rpmfiles
181 * Reference a file info set instance.
182 * @param fi file info set
183 * @return new file info set reference
185 rpmfiles rpmfilesLink(rpmfiles fi);
187 /** \ingroup rpmfiles
188 * Destroy a file info set.
189 * @param fi file info set
190 * @return NULL always
192 rpmfiles rpmfilesFree(rpmfiles fi);
194 /** \ingroup rpmfiles
195 * Return file count from file info set.
196 * @param fi file info set
199 rpm_count_t rpmfilesFC(rpmfiles fi);
201 /** \ingroup rpmfiles
202 * Return directory count from file info set.
203 * @param fi file info set
204 * @return directory count
206 rpm_count_t rpmfilesDC(rpmfiles fi);
208 /** \ingroup rpmfiles
209 * Return file index of the given file name or -1 if file is not in the rpmfi.
210 * The file name may have "." prefixed but is then interpreted as a global
211 * path without the prefixing "."
212 * @param files file info set
213 * @param fn file name
214 * @return file index or -1
216 int rpmfilesFindFN(rpmfiles files, const char * fn);
218 /** \ingroup rpmfiles
219 * Return file index of the given original file name or -1 if file is not
220 * in the rpmfi. The file name may have "." prefixed but is then interpreted
221 * as a global path without the prefixing "."
222 * @param files file info set
223 * @param fn file name
224 * @return file index or -1
226 int rpmfilesFindOFN(rpmfiles files, const char * fn);
228 rpmfi rpmfilesIter(rpmfiles files, int itype);
230 /** \ingroup rpmfiles
231 * Return digest algorithm of a file info set.
232 * @param fi file info set
233 * @return digest algorithm of file info set, 0 on invalid
235 int rpmfilesDigestAlgo(rpmfiles fi);
237 /** \ingroup rpmfiles
238 * Return union of all file color bits from file info set.
239 * @param files file info set
242 rpm_color_t rpmfilesColor(rpmfiles files);
244 /** \ingroup rpmfiles
245 * Return file info comparison.
246 * @param afi 1st file info
247 * @param aix index of the 1st file
248 * @param bfi 2nd file info
249 * @param bix index of the 2nd file
250 * @return 0 if identical
252 int rpmfilesCompare(rpmfiles afi, int aix, rpmfiles bfi, int bix);
254 /** \ingroup rpmfiles
255 * Return base name from file info set.
256 * @param fi file info set
257 * @param ix file index
258 * @return base name, NULL on invalid
260 const char * rpmfilesBN(rpmfiles fi, int ix);
262 /** \ingroup rpmfiles
263 * Return directory name from file info set. Note the index is on
264 * distinct directories within the file set, not a file index. The
265 * directory index associated with a given file index can be retrieved
266 * with rpmfilesDI(). Ie to constuct the full path of file index X
267 * you'd catenate the results of rpmfilesDN(f, rpmfilesDI(f, X)) and
269 * @param fi file info set
270 * @param jx directory index
271 * @return directory, NULL on invalid
273 const char * rpmfilesDN(rpmfiles fi, int jx);
275 /** \ingroup rpmfiles
276 * Return directory index from file info set.
277 * @param fi file info set
278 * @param ix file index
279 * @return directory index, -1 on invalid
281 int rpmfilesDI(rpmfiles fi, int ix);
283 /** \ingroup rpmfiles
284 * Return file name from file info set.
285 * @param fi file info set
286 * @param ix file index
287 * @return file name (malloced)
289 char * rpmfilesFN(rpmfiles fi, int ix);
291 /** \ingroup rpmfiles
292 * Return original directory index from file info set.
293 * @param fi file info set
294 * @param ix file index
295 * @return directory index, -1 on invalid
297 int rpmfilesODI(rpmfiles fi, int ix);
299 /** \ingroup rpmfiles
300 * Return original base name from file info set.
301 * @param fi file info set
302 * @param ix file index
303 * @return base name, NULL on invalid
305 const char * rpmfilesOBN(rpmfiles fi, int ix);
307 /** \ingroup rpmfiles
308 * Return original directory name from file info set. Note the index is on
309 * distinct directories within the file set, not a file index. The
310 * directory index associated with a given file index can be retrieved
311 * with rpmfilesODI(). Ie to constuct the full path of file index X
312 * you'd catenate the results of rpmfilesODN(f, rpmfilesODI(f, X)) and
314 * @param fi file info set
315 * @param jx directory index
316 * @return directory, NULL on invalid
318 const char * rpmfilesODN(rpmfiles fi, int jx);
320 /** \ingroup rpmfiles
321 * Return original file name from file info set.
322 * @param fi file info set
323 * @param ix file index
326 char * rpmfilesOFN(rpmfiles fi, int ix);
328 /** \ingroup rpmfiles
329 * Return file verify flags from file info set.
330 * @param fi file info set
331 * @param ix file index
332 * @return file verify flags, 0 on invalid
334 rpmVerifyAttrs rpmfilesVFlags(rpmfiles fi, int ix);
336 /** \ingroup rpmfiles
337 * Return file state from file info set.
338 * @param fi file info set
339 * @param ix file index
340 * @return file state, 0 on invalid
342 rpmfileState rpmfilesFState(rpmfiles fi, int ix);
344 /** \ingroup rpmfiles
345 * Return file linkto (i.e. symlink(2) target) from file info set.
346 * @param fi file info set
347 * @param ix file index
348 * @return file linkto, NULL on invalid
350 const char * rpmfilesFLink(rpmfiles fi, int ix);
352 /** \ingroup rpmfiles
353 * Return file size from file info set.
354 * @param fi file info set
355 * @param ix file index
356 * @return file size, 0 on invalid
358 rpm_loff_t rpmfilesFSize(rpmfiles fi, int ix);
360 /** \ingroup rpmfiles
361 * Return file color bits from file info set.
362 * @param fi file info set
363 * @param ix file index
366 rpm_color_t rpmfilesFColor(rpmfiles fi, int ix);
368 /** \ingroup rpmfiles
369 * Return file class from file info set.
370 * @param fi file info set
371 * @param ix file index
372 * @return file class, 0 on invalid
374 const char * rpmfilesFClass(rpmfiles fi, int ix);
376 /** \ingroup rpmfiles
377 * Return file depends dictionary from file info set.
378 * @param fi file info set
379 * @param ix file index
380 * @retval *fddictp file depends dictionary array (or NULL)
381 * @return no. of file depends entries, 0 on invalid
383 uint32_t rpmfilesFDepends(rpmfiles fi, int ix, const uint32_t ** fddictp);
385 /** \ingroup rpmfiles
386 * Return (calculated) file nlink count from file info set.
387 * @param fi file info set
388 * @param ix file index
389 * @return file nlink count, 0 on invalid
391 uint32_t rpmfilesFNlink(rpmfiles fi, int ix);
393 /** \ingroup rpmfiles
394 * Return (calculated) file nlink count from file info set.
395 * @param fi file info set
396 * @param ix file index
397 * @param files returns array of file ids hardlinked including ix,
398 NULL for nlink count == 1
399 * @return file nlink count, 0 on invalid
401 uint32_t rpmfilesFLinks(rpmfiles fi, int ix, const int ** files);
403 /** \ingroup rpmfiles
404 * Return file language(s) from file info set.
405 * @param fi file info set
406 * @param ix file index
407 * @return file language(s), NULL on invalid
409 const char * rpmfilesFLangs(rpmfiles fi, int ix);
411 /** \ingroup rpmfiles
412 * Return file flags from file info set.
413 * @param fi file info set
414 * @param ix file index
415 * @return file flags, 0 on invalid
417 rpmfileAttrs rpmfilesFFlags(rpmfiles fi, int ix);
419 /** \ingroup rpmfiles
420 * Return file mode from file info set.
421 * @param fi file info set
422 * @param ix file index
423 * @return file mode, 0 on invalid
425 rpm_mode_t rpmfilesFMode(rpmfiles fi, int ix);
427 /** \ingroup rpmfiles
428 * Return file (binary) digest of file info set.
429 * @param fi file info set
430 * @param ix file index
431 * @retval algo digest hash algorithm used (pass NULL to ignore)
432 * @retval len digest hash length (pass NULL to ignore)
433 * @return file digest, NULL on invalid
435 const unsigned char * rpmfilesFDigest(rpmfiles fi, int ix, int *algo, size_t *len);
437 /** \ingroup rpmfiles
438 * Return file (binary) digest of file info set.
439 * @param fi file info set
440 * @param ix file index
441 * @retval len signature length (pass NULL to ignore)
442 * @return file signature, NULL on invalid
444 const unsigned char * rpmfilesFSignature(rpmfiles fi, int ix, size_t *len);
446 /** \ingroup rpmfiles
447 * Return file rdev from file info set.
448 * @param fi file info set
449 * @param ix file index
450 * @return file rdev, 0 on invalid
452 rpm_rdev_t rpmfilesFRdev(rpmfiles fi, int ix);
454 /** \ingroup rpmfiles
455 * Return file inode from file info set.
456 * @param fi file info set
457 * @param ix file index
458 * @return file inode, 0 on invalid
460 rpm_ino_t rpmfilesFInode(rpmfiles fi, int ix);
462 /** \ingroup rpmfiles
463 * Return file modify time from file info set.
464 * @param fi file info set
465 * @param ix file index
466 * @return file modify time, 0 on invalid
468 rpm_time_t rpmfilesFMtime(rpmfiles fi, int ix);
470 /** \ingroup rpmfiles
471 * Return file owner from file info set.
472 * @param fi file info set
473 * @param ix file index
474 * @return file owner, NULL on invalid
476 const char * rpmfilesFUser(rpmfiles fi, int ix);
478 /** \ingroup rpmfiles
479 * Return file group from file info set.
480 * @param fi file info set
481 * @param ix file index
482 * @return file group, NULL on invalid
484 const char * rpmfilesFGroup(rpmfiles fi, int ix);
486 /** \ingroup rpmfiles
487 * Return textual representation of file capabilities
488 * from file info set. See cap_from_text(3) for details.
489 * @param fi file info set
490 * @param ix file index
491 * @return file capability description, "" for no capabilities
492 * and NULL on invalid
494 const char * rpmfilesFCaps(rpmfiles fi, int ix);
497 * Map file stat(2) info.
498 * @param fi file info set
499 * @param ix file index
501 * @retval sb mapped stat(2) data
502 * @return 0 on success
504 int rpmfilesStat(rpmfiles fi, int ix, int flags, struct stat *sb);
506 /** \ingroup rpmfiles
507 * Verify file attributes (including digest).
508 * @param fi file info set
509 * @param ix file index
510 * @param omitMask bit(s) to disable verify checks
511 * @return bit(s) to indicate failure (ie 0 for passed verify)
513 rpmVerifyAttrs rpmfilesVerify(rpmfiles fi, int ix, rpmVerifyAttrs omitMask);
519 #endif /* _RPMFILES_H */