1 #ifndef _RPMFILES_H
2 #define _RPMFILES_H
3 
4 /** \ingroup rpmfilesles
5  * \file lib/rpmfiles.h
6  * File info set API.
7  */
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <unistd.h>
11 
12 #include <rpm/rpmtypes.h>
13 #include <rpm/rpmpgp.h>
14 
15 /** \ingroup rpmfiles
16  * File types.
17  * These are the file types used internally by rpm. The file
18  * type is determined by applying stat(2) macros like S_ISDIR to
19  * the file mode tag from a header. The values are arbitrary,
20  * but are identical to the linux stat(2) file types.
21  */
22 typedef enum rpmFileTypes_e {
23     PIPE	=  1,	/*!< pipe/fifo */
24     CDEV	=  2,	/*!< character device */
25     XDIR	=  4,	/*!< directory */
26     BDEV	=  6,	/*!< block device */
27     REG		=  8,	/*!< regular file */
28     LINK	= 10,	/*!< hard link */
29     SOCK	= 12	/*!< socket */
30 } rpmFileTypes;
31 
32 /**
33  * File States (when installed).
34  */
35 typedef enum rpmfileState_e {
36     RPMFILE_STATE_MISSING	= -1,	/* used for unavailable data */
37     RPMFILE_STATE_NORMAL 	= 0,
38     RPMFILE_STATE_REPLACED 	= 1,
39     RPMFILE_STATE_NOTINSTALLED	= 2,
40     RPMFILE_STATE_NETSHARED	= 3,
41     RPMFILE_STATE_WRONGCOLOR	= 4
42 } rpmfileState;
43 
44 #define RPMFILE_IS_INSTALLED(_x) ((_x) == RPMFILE_STATE_NORMAL || (_x) == RPMFILE_STATE_NETSHARED)
45 
46 /**
47  * Exported File Attributes (ie RPMTAG_FILEFLAGS)
48  */
49 enum rpmfileAttrs_e {
50     RPMFILE_NONE	= 0,
51     RPMFILE_CONFIG	= (1 <<  0),	/*!< from %%config */
52     RPMFILE_DOC		= (1 <<  1),	/*!< from %%doc */
53     RPMFILE_ICON	= (1 <<  2),	/*!< from %%donotuse. */
54     RPMFILE_MISSINGOK	= (1 <<  3),	/*!< from %%config(missingok) */
55     RPMFILE_NOREPLACE	= (1 <<  4),	/*!< from %%config(noreplace) */
56     RPMFILE_SPECFILE	= (1 <<  5),	/*!< @todo (unnecessary) marks 1st file in srpm. */
57     RPMFILE_GHOST	= (1 <<  6),	/*!< from %%ghost */
58     RPMFILE_LICENSE	= (1 <<  7),	/*!< from %%license */
59     RPMFILE_README	= (1 <<  8),	/*!< from %%readme */
60     /* bits 9-10 unused */
61     RPMFILE_PUBKEY	= (1 << 11),	/*!< from %%pubkey */
62     RPMFILE_ARTIFACT	= (1 << 12),	/*!< from %%artifact */
63 };
64 
65 typedef rpmFlags rpmfileAttrs;
66 
67 #define	RPMFILE_ALL	~(RPMFILE_NONE)
68 
69 /** \ingroup rpmvf
70  * Exported file verify attributes (ie RPMTAG_FILEVERIFYFLAGS) +
71  * bits used for reporting failures.
72  */
73 enum rpmVerifyAttrs_e {
74     RPMVERIFY_NONE	= 0,		/*!< */
75     RPMVERIFY_MD5	= (1 << 0),	/*!< from %verify(md5) - obsolete */
76     RPMVERIFY_FILEDIGEST= (1 << 0),	/*!< from %verify(filedigest) */
77     RPMVERIFY_FILESIZE	= (1 << 1),	/*!< from %verify(size) */
78     RPMVERIFY_LINKTO	= (1 << 2),	/*!< from %verify(link) */
79     RPMVERIFY_USER	= (1 << 3),	/*!< from %verify(user) */
80     RPMVERIFY_GROUP	= (1 << 4),	/*!< from %verify(group) */
81     RPMVERIFY_MTIME	= (1 << 5),	/*!< from %verify(mtime) */
82     RPMVERIFY_MODE	= (1 << 6),	/*!< from %verify(mode) */
83     RPMVERIFY_RDEV	= (1 << 7),	/*!< from %verify(rdev) */
84     RPMVERIFY_CAPS	= (1 << 8),	/*!< from %verify(caps) */
85 	/* bits 9-14 unused, reserved for rpmVerifyAttrs */
86     RPMVERIFY_CONTEXTS	= (1 << 15),	/*!< verify: from --nocontexts */
87 	/* bits 16-22 used in rpmVerifyFlags */
88 	/* bits 23-27 used in rpmQueryFlags */
89     RPMVERIFY_READLINKFAIL= (1 << 28),	/*!< readlink failed */
90     RPMVERIFY_READFAIL	= (1 << 29),	/*!< file read failed */
91     RPMVERIFY_LSTATFAIL	= (1 << 30),	/*!< lstat failed */
92     RPMVERIFY_LGETFILECONFAIL	= (1 << 31)	/*!< lgetfilecon failed */
93 };
94 
95 typedef rpmFlags rpmVerifyAttrs;
96 
97 #define	RPMVERIFY_ALL		~(RPMVERIFY_NONE)
98 #define	RPMVERIFY_FAILURES	\
99   (RPMVERIFY_LSTATFAIL|RPMVERIFY_READFAIL|RPMVERIFY_READLINKFAIL|RPMVERIFY_LGETFILECONFAIL)
100 
101 /** \ingroup rpmfiles
102  * File disposition(s) during package install/erase transaction.
103  */
104 typedef enum rpmFileAction_e {
105     FA_UNKNOWN		= 0,	/*!< initial action for file ... */
106     FA_CREATE		= 1,	/*!< ... create from payload. */
107     FA_COPYIN		= 2,	/*!< obsolete, unused. */
108     FA_COPYOUT		= 3,	/*!< obsolete, unused. */
109     FA_BACKUP		= 4,	/*!< ... renamed with ".rpmorig" extension. */
110     FA_SAVE		= 5,	/*!< ... renamed with ".rpmsave" extension. */
111     FA_SKIP		= 6, 	/*!< ... already replaced, don't remove. */
112     FA_ALTNAME		= 7,	/*!< ... create with ".rpmnew" extension. */
113     FA_ERASE		= 8,	/*!< ... to be removed. */
114     FA_SKIPNSTATE	= 9,	/*!< ... untouched, state "not installed". */
115     FA_SKIPNETSHARED	= 10,	/*!< ... untouched, state "netshared". */
116     FA_SKIPCOLOR	= 11,	/*!< ... untouched, state "wrong color". */
117     FA_TOUCH		= 12,	/*!< ... change metadata only. */
118     /* bits 16-31 reserved */
119 } rpmFileAction;
120 
121 #define XFA_SKIPPING(_a)	\
122     ((_a) == FA_SKIP || (_a) == FA_SKIPNSTATE || (_a) == FA_SKIPNETSHARED || (_a) == FA_SKIPCOLOR)
123 
124 /**
125  * We pass these around as an array with a sentinel.
126  */
127 struct rpmRelocation_s {
128     char * oldPath;	/*!< NULL here evals to RPMTAG_DEFAULTPREFIX, */
129     char * newPath;	/*!< NULL means to omit the file completely! */
130 };
131 
132 enum rpmfiFlags_e {
133     RPMFI_NOHEADER		= 0,
134     RPMFI_KEEPHEADER		= (1 << 0),
135     RPMFI_NOFILECLASS		= (1 << 1),
136     RPMFI_NOFILEDEPS		= (1 << 2),
137     RPMFI_NOFILELANGS		= (1 << 3),
138     RPMFI_NOFILEUSER		= (1 << 4),
139     RPMFI_NOFILEGROUP		= (1 << 5),
140     RPMFI_NOFILEMODES		= (1 << 6),
141     RPMFI_NOFILESIZES		= (1 << 7),
142     RPMFI_NOFILECAPS		= (1 << 8),
143     RPMFI_NOFILELINKTOS		= (1 << 9),
144     RPMFI_NOFILEDIGESTS		= (1 << 10),
145     RPMFI_NOFILEMTIMES		= (1 << 11),
146     RPMFI_NOFILERDEVS		= (1 << 12),
147     RPMFI_NOFILEINODES		= (1 << 13),
148     RPMFI_NOFILESTATES		= (1 << 14),
149     RPMFI_NOFILECOLORS		= (1 << 15),
150     RPMFI_NOFILEVERIFYFLAGS	= (1 << 16),
151     RPMFI_NOFILEFLAGS		= (1 << 17),
152     RPMFI_NOFILESIGNATURES	= (1 << 18),
153 };
154 
155 typedef rpmFlags rpmfiFlags;
156 
157 #define RPMFI_FLAGS_ERASE \
158     (RPMFI_NOFILECLASS | RPMFI_NOFILELANGS | \
159      RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | \
160      RPMFI_NOFILEVERIFYFLAGS)
161 
162 #define RPMFI_FLAGS_INSTALL \
163     (RPMFI_NOFILECLASS | RPMFI_NOFILEVERIFYFLAGS)
164 
165 #define RPMFI_FLAGS_VERIFY \
166     (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
167      RPMFI_NOFILECOLORS)
168 
169 #define RPMFI_FLAGS_QUERY \
170     (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
171      RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS)
172 
173 #define RPMFI_FLAGS_FILETRIGGER \
174     (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
175      RPMFI_NOFILEUSER | RPMFI_NOFILEGROUP | RPMFI_NOFILEMODES | \
176      RPMFI_NOFILESIZES | RPMFI_NOFILECAPS | RPMFI_NOFILELINKTOS | \
177      RPMFI_NOFILEDIGESTS | RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | \
178      RPMFI_NOFILEINODES | RPMFI_NOFILECOLORS | \
179      RPMFI_NOFILEVERIFYFLAGS | RPMFI_NOFILEFLAGS)
180 
181 #define RPMFI_FLAGS_ONLY_FILENAMES \
182     (RPMFI_FLAGS_FILETRIGGER | RPMFI_NOFILESTATES)
183 
184 typedef enum rpmFileIter_e {
185     RPMFI_ITER_FWD	= 0,
186     RPMFI_ITER_BACK	= 1,
187     RPMFI_ITER_WRITE_ARCHIVE	= 2,
188     RPMFI_ITER_READ_ARCHIVE	= 3,
189     RPMFI_ITER_READ_ARCHIVE_CONTENT_FIRST = 4,
190     RPMFI_ITER_READ_ARCHIVE_OMIT_HARDLINKS = 5,
191     RPMFI_ITER_INTERVAL = 6,
192 } rpmFileIter;
193 
194 #define RPMFILEITERMAX 6
195 
196 #ifdef __cplusplus
197 extern "C" {
198 #endif
199 
200 /** \ingroup rpmfiles
201  * Create and load a file info set.
202  * @param pool		shared string pool (or NULL for private pool)
203  * @param h		header
204  * @param tagN		unused
205  * @param flags		Flags to control what information is loaded.
206  * @return		new file info set
207  */
208 rpmfiles rpmfilesNew(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags);
209 
210 /** \ingroup rpmfiles
211  * Reference a file info set instance.
212  * @param fi		file info set
213  * @return		new file info set reference
214  */
215 rpmfiles rpmfilesLink(rpmfiles fi);
216 
217 /** \ingroup rpmfiles
218  * Destroy a file info set.
219  * @param fi		file info set
220  * @return		NULL always
221  */
222 rpmfiles rpmfilesFree(rpmfiles fi);
223 
224 /** \ingroup rpmfiles
225  * Return file count from file info set.
226  * @param fi		file info set
227  * @return		file count
228  */
229 rpm_count_t rpmfilesFC(rpmfiles fi);
230 
231 /** \ingroup rpmfiles
232  * Return directory count from file info set.
233  * @param fi		file info set
234  * @return		directory count
235  */
236 rpm_count_t rpmfilesDC(rpmfiles fi);
237 
238 /** \ingroup rpmfiles
239  * Return file index of the given file name or -1 if file is not in the rpmfi.
240  * The file name may have "." prefixed but is then interpreted as a global
241  * path without the prefixing "."
242  * @param files         file info set
243  * @param fn		file name
244  * @return              file index or -1
245  */
246 int rpmfilesFindFN(rpmfiles files, const char * fn);
247 
248 /** \ingroup rpmfiles
249  * Return file index of the given original file name or -1 if file is not
250  * in the rpmfi. The file name may have "." prefixed but is then interpreted
251  * as a global path without the prefixing "."
252  * @param files         file info set
253  * @param fn		file name
254  * @return              file index or -1
255  */
256 int rpmfilesFindOFN(rpmfiles files, const char * fn);
257 
258 rpmfi rpmfilesIter(rpmfiles files, int itype);
259 
260 /** \ingroup rpmfiles
261  * Return digest algorithm of a file info set.
262  * @param fi		file info set
263  * @return		digest algorithm of file info set, 0 on invalid
264  */
265 int rpmfilesDigestAlgo(rpmfiles fi);
266 
267 /** \ingroup rpmfiles
268  * Return union of all file color bits from file info set.
269  * @param files		file info set
270  * @return		color
271  */
272 rpm_color_t rpmfilesColor(rpmfiles files);
273 
274 /** \ingroup rpmfiles
275  * Return file info comparison.
276  * @param afi		1st file info
277  * @param aix		index of the 1st file
278  * @param bfi		2nd file info
279  * @param bix		index of the 2nd file
280  * @return		0 if identical
281  */
282 int rpmfilesCompare(rpmfiles afi, int aix, rpmfiles bfi, int bix);
283 
284 /** \ingroup rpmfiles
285  * Return base name from file info set.
286  * @param fi		file info set
287  * @param ix		file index
288  * @return		base name, NULL on invalid
289  */
290 const char * rpmfilesBN(rpmfiles fi, int ix);
291 
292 /** \ingroup rpmfiles
293  * Return directory name from file info set. Note the index is on
294  * distinct directories within the file set, not a file index. The
295  * directory index associated with a given file index can be retrieved
296  * with rpmfilesDI(). Ie to constuct the full path of file index X
297  * you'd catenate the results of rpmfilesDN(f, rpmfilesDI(f, X)) and
298  * rpmfilesBN(f, X).
299  * @param fi		file info set
300  * @param jx		directory index
301  * @return		directory, NULL on invalid
302  */
303 const char * rpmfilesDN(rpmfiles fi, int jx);
304 
305 /** \ingroup rpmfiles
306  * Return directory index from file info set.
307  * @param fi		file info set
308  * @param ix		file index
309  * @return		directory index, -1 on invalid
310  */
311 int rpmfilesDI(rpmfiles fi, int ix);
312 
313 /** \ingroup rpmfiles
314  * Return file name from file info set.
315  * @param fi		file info set
316  * @param ix		file index
317  * @return		file name (malloced)
318  */
319 char * rpmfilesFN(rpmfiles fi, int ix);
320 
321 /** \ingroup rpmfiles
322  * Return original directory index from file info set.
323  * @param fi		file info set
324  * @param ix		file index
325  * @return		directory index, -1 on invalid
326  */
327 int rpmfilesODI(rpmfiles fi, int ix);
328 
329 /** \ingroup rpmfiles
330  * Return original base name from file info set.
331  * @param fi		file info set
332  * @param ix		file index
333  * @return		base name, NULL on invalid
334  */
335 const char * rpmfilesOBN(rpmfiles fi, int ix);
336 
337 /** \ingroup rpmfiles
338  * Return original directory name from file info set. Note the index is on
339  * distinct directories within the file set, not a file index. The
340  * directory index associated with a given file index can be retrieved
341  * with rpmfilesODI(). Ie to constuct the full path of file index X
342  * you'd catenate the results of rpmfilesODN(f, rpmfilesODI(f, X)) and
343  * rpmfilesOBN(f, X).
344  * @param fi		file info set
345  * @param jx		directory index
346  * @return		directory, NULL on invalid
347  */
348 const char * rpmfilesODN(rpmfiles fi, int jx);
349 
350 /** \ingroup rpmfiles
351  * Return original file name from file info set.
352  * @param fi		file info set
353  * @param ix		file index
354  * @return		file name
355  */
356 char * rpmfilesOFN(rpmfiles fi, int ix);
357 
358 /** \ingroup rpmfiles
359  * Return file verify flags from file info set.
360  * @param fi		file info set
361  * @param ix		file index
362  * @return		file verify flags, 0 on invalid
363  */
364 rpmVerifyAttrs rpmfilesVFlags(rpmfiles fi, int ix);
365 
366 /** \ingroup rpmfiles
367  * Return file state from file info set.
368  * @param fi		file info set
369  * @param ix		file index
370  * @return		file state, 0 on invalid
371  */
372 rpmfileState rpmfilesFState(rpmfiles fi, int ix);
373 
374 /** \ingroup rpmfiles
375  * Return file linkto (i.e. symlink(2) target) from file info set.
376  * @param fi		file info set
377  * @param ix		file index
378  * @return		file linkto, NULL on invalid
379  */
380 const char * rpmfilesFLink(rpmfiles fi, int ix);
381 
382 /** \ingroup rpmfiles
383  * Return file size from file info set.
384  * @param fi		file info set
385  * @param ix		file index
386  * @return		file size, 0 on invalid
387  */
388 rpm_loff_t rpmfilesFSize(rpmfiles fi, int ix);
389 
390 /** \ingroup rpmfiles
391  * Return file color bits from file info set.
392  * @param fi		file info set
393  * @param ix		file index
394  * @return		file color
395  */
396 rpm_color_t rpmfilesFColor(rpmfiles fi, int ix);
397 
398 /** \ingroup rpmfiles
399  * Return file class from file info set.
400  * @param fi		file info set
401  * @param ix		file index
402  * @return		file class, 0 on invalid
403  */
404 const char * rpmfilesFClass(rpmfiles fi, int ix);
405 
406 /** \ingroup rpmfiles
407  * Return file depends dictionary from file info set.
408  * @param fi		file info set
409  * @param ix		file index
410  * @retval *fddictp	file depends dictionary array (or NULL)
411  * @return		no. of file depends entries, 0 on invalid
412  */
413 uint32_t rpmfilesFDepends(rpmfiles fi, int ix, const uint32_t ** fddictp);
414 
415 /** \ingroup rpmfiles
416  * Return (calculated) file nlink count from file info set.
417  * @param fi		file info set
418  * @param ix		file index
419  * @return		file nlink count, 0 on invalid
420  */
421 uint32_t rpmfilesFNlink(rpmfiles fi, int ix);
422 
423 /** \ingroup rpmfiles
424  * Return (calculated) file nlink count from file info set.
425  * @param fi		file info set
426  * @param ix		file index
427  * @param files         returns array of file ids hardlinked including ix,
428 			NULL for nlink count == 1
429  * @return		file nlink count, 0 on invalid
430  */
431 uint32_t rpmfilesFLinks(rpmfiles fi, int ix, const int ** files);
432 
433 /** \ingroup rpmfiles
434  * Return file language(s) from file info set.
435  * @param fi		file info set
436  * @param ix		file index
437  * @return		file language(s), NULL on invalid
438  */
439 const char * rpmfilesFLangs(rpmfiles fi, int ix);
440 
441 /** \ingroup rpmfiles
442  * Return file flags from file info set.
443  * @param fi		file info set
444  * @param ix		file index
445  * @return		file flags, 0 on invalid
446  */
447 rpmfileAttrs rpmfilesFFlags(rpmfiles fi, int ix);
448 
449 /** \ingroup rpmfiles
450  * Return file mode from file info set.
451  * @param fi		file info set
452  * @param ix		file index
453  * @return		file mode, 0 on invalid
454  */
455 rpm_mode_t rpmfilesFMode(rpmfiles fi, int ix);
456 
457 /** \ingroup rpmfiles
458  * Return file (binary) digest of file info set.
459  * @param fi		file info set
460  * @param ix		file index
461  * @retval algo		digest hash algorithm used (pass NULL to ignore)
462  * @retval len		digest hash length (pass NULL to ignore)
463  * @return		file digest, NULL on invalid
464  */
465 const unsigned char * rpmfilesFDigest(rpmfiles fi, int ix, int *algo, size_t *len);
466 
467 /** \ingroup rpmfiles
468  * Return file (binary) digest of file info set.
469  * @param fi            file info set
470  * @param ix            file index
471  * @retval len       signature length (pass NULL to ignore)
472  * @return              file signature, NULL on invalid
473  */
474 const unsigned char * rpmfilesFSignature(rpmfiles fi, int ix, size_t *len);
475 
476 /** \ingroup rpmfiles
477  * Return file rdev from file info set.
478  * @param fi		file info set
479  * @param ix		file index
480  * @return		file rdev, 0 on invalid
481  */
482 rpm_rdev_t rpmfilesFRdev(rpmfiles fi, int ix);
483 
484 /** \ingroup rpmfiles
485  * Return file inode from file info set.
486  * @param fi		file info set
487  * @param ix		file index
488  * @return		file inode, 0 on invalid
489  */
490 rpm_ino_t rpmfilesFInode(rpmfiles fi, int ix);
491 
492 /** \ingroup rpmfiles
493  * Return file modify time from file info set.
494  * @param fi		file info set
495  * @param ix		file index
496  * @return		file modify time, 0 on invalid
497  */
498 rpm_time_t rpmfilesFMtime(rpmfiles fi, int ix);
499 
500 /** \ingroup rpmfiles
501  * Return file owner from file info set.
502  * @param fi		file info set
503  * @param ix		file index
504  * @return		file owner, NULL on invalid
505  */
506 const char * rpmfilesFUser(rpmfiles fi, int ix);
507 
508 /** \ingroup rpmfiles
509  * Return file group from file info set.
510  * @param fi		file info set
511  * @param ix		file index
512  * @return		file group, NULL on invalid
513  */
514 const char * rpmfilesFGroup(rpmfiles fi, int ix);
515 
516 /** \ingroup rpmfiles
517  * Return textual representation of file capabilities
518  * from file info set. See cap_from_text(3) for details.
519  * @param fi		file info set
520  * @param ix		file index
521  * @return		file capability description, "" for no capabilities
522  * 			and NULL on invalid
523  */
524 const char * rpmfilesFCaps(rpmfiles fi, int ix);
525 
526 /** \ingroup rpmfi
527  * Map file stat(2) info.
528  * @param fi		file info set
529  * @param ix		file index
530  * @param flags		flags
531  * @retval sb		mapped stat(2) data
532  * @return		0 on success
533  */
534 int rpmfilesStat(rpmfiles fi, int ix, int flags, struct stat *sb);
535 
536 /** \ingroup rpmfiles
537  * Verify file attributes (including digest).
538  * @param fi		file info set
539  * @param ix		file index
540  * @param omitMask	bit(s) to disable verify checks
541  * @return		bit(s) to indicate failure (ie 0 for passed verify)
542  */
543 rpmVerifyAttrs rpmfilesVerify(rpmfiles fi, int ix, rpmVerifyAttrs omitMask);
544 
545 #ifdef __cplusplus
546 }
547 #endif
548 
549 #endif /* _RPMFILES_H */
550