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