diff options
Diffstat (limited to 'lib/rpmfi.h')
-rw-r--r-- | lib/rpmfi.h | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/lib/rpmfi.h b/lib/rpmfi.h new file mode 100644 index 0000000..3dcf61b --- /dev/null +++ b/lib/rpmfi.h @@ -0,0 +1,459 @@ +#ifndef H_RPMFI +#define H_RPMFI + +/** \ingroup rpmdep rpmtrans + * \file lib/rpmfi.h + * Structure(s) used for file info tag sets. + */ + +#include <rpm/rpmtypes.h> +#include <rpm/rpmvf.h> +#include <rpm/rpmpgp.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** \ingroup rpmfi + * File types. + * These are the file types used internally by rpm. The file + * type is determined by applying stat(2) macros like S_ISDIR to + * the file mode tag from a header. The values are arbitrary, + * but are identical to the linux stat(2) file types. + */ +typedef enum rpmFileTypes_e { + PIPE = 1, /*!< pipe/fifo */ + CDEV = 2, /*!< character device */ + XDIR = 4, /*!< directory */ + BDEV = 6, /*!< block device */ + REG = 8, /*!< regular file */ + LINK = 10, /*!< hard link */ + SOCK = 12 /*!< socket */ +} rpmFileTypes; + +/** + * File States (when installed). + */ +typedef enum rpmfileState_e { + RPMFILE_STATE_MISSING = -1, /* used for unavailable data */ + RPMFILE_STATE_NORMAL = 0, + RPMFILE_STATE_REPLACED = 1, + RPMFILE_STATE_NOTINSTALLED = 2, + RPMFILE_STATE_NETSHARED = 3, + RPMFILE_STATE_WRONGCOLOR = 4 +} rpmfileState; + +/** + * File Attributes. + */ +enum rpmfileAttrs_e { + RPMFILE_NONE = 0, + RPMFILE_CONFIG = (1 << 0), /*!< from %%config */ + RPMFILE_DOC = (1 << 1), /*!< from %%doc */ + RPMFILE_ICON = (1 << 2), /*!< from %%donotuse. */ + RPMFILE_MISSINGOK = (1 << 3), /*!< from %%config(missingok) */ + RPMFILE_NOREPLACE = (1 << 4), /*!< from %%config(noreplace) */ + RPMFILE_SPECFILE = (1 << 5), /*!< @todo (unnecessary) marks 1st file in srpm. */ + RPMFILE_GHOST = (1 << 6), /*!< from %%ghost */ + RPMFILE_LICENSE = (1 << 7), /*!< from %%license */ + RPMFILE_README = (1 << 8), /*!< from %%readme */ + RPMFILE_EXCLUDE = (1 << 9), /*!< from %%exclude, internal */ + RPMFILE_UNPATCHED = (1 << 10), /*!< placeholder (SuSE) */ + RPMFILE_PUBKEY = (1 << 11), /*!< from %%pubkey */ +}; + +typedef rpmFlags rpmfileAttrs; + +#define RPMFILE_ALL ~(RPMFILE_NONE) + +/** \ingroup rpmfi + * File disposition(s) during package install/erase transaction. + */ +typedef enum rpmFileAction_e { + FA_UNKNOWN = 0, /*!< initial action for file ... */ + FA_CREATE, /*!< ... copy in from payload. */ + FA_COPYIN, /*!< ... copy in from payload. */ + FA_COPYOUT, /*!< ... copy out to payload. */ + FA_BACKUP, /*!< ... renamed with ".rpmorig" extension. */ + FA_SAVE, /*!< ... renamed with ".rpmsave" extension. */ + FA_SKIP, /*!< ... already replaced, don't remove. */ + FA_ALTNAME, /*!< ... create with ".rpmnew" extension. */ + FA_ERASE, /*!< ... to be removed. */ + FA_SKIPNSTATE, /*!< ... untouched, state "not installed". */ + FA_SKIPNETSHARED, /*!< ... untouched, state "netshared". */ + FA_SKIPCOLOR /*!< ... untouched, state "wrong color". */ +} rpmFileAction; + +#define XFA_SKIPPING(_a) \ + ((_a) == FA_SKIP || (_a) == FA_SKIPNSTATE || (_a) == FA_SKIPNETSHARED || (_a) == FA_SKIPCOLOR) + +/** + * We pass these around as an array with a sentinel. + */ +struct rpmRelocation_s { + char * oldPath; /*!< NULL here evals to RPMTAG_DEFAULTPREFIX, */ + char * newPath; /*!< NULL means to omit the file completely! */ +}; + +/** \ingroup rpmfi + * Reference a file info set instance. + * @param fi file info set + * @return new file info set reference + */ +rpmfi rpmfiLink (rpmfi fi); + +/** \ingroup rpmfi + * Return file count from file info set. + * @param fi file info set + * @return current file count + */ +rpm_count_t rpmfiFC(rpmfi fi); + +/** \ingroup rpmfi + * Return current file index from file info set. + * @param fi file info set + * @return current file index + */ +int rpmfiFX(rpmfi fi); + +/** \ingroup rpmfi + * Set current file index in file info set. + * @param fi file info set + * @param fx new file index + * @return current file index + */ +int rpmfiSetFX(rpmfi fi, int fx); + +/** \ingroup rpmfi + * Return directory count from file info set. + * @param fi file info set + * @return current directory count + */ +rpm_count_t rpmfiDC(rpmfi fi); + +/** \ingroup rpmfi + * Return current directory index from file info set. + * @param fi file info set + * @return current directory index + */ +int rpmfiDX(rpmfi fi); + +/** \ingroup rpmfi + * Set current directory index in file info set. + * @param fi file info set + * @param dx new directory index + * @return current directory index + */ +int rpmfiSetDX(rpmfi fi, int dx); + +/** \ingroup rpmfi + * Return current base name from file info set. + * @param fi file info set + * @return current base name, NULL on invalid + */ +const char * rpmfiBN(rpmfi fi); + +/** \ingroup rpmfi + * Return current directory name from file info set. + * @param fi file info set + * @return current directory, NULL on invalid + */ +const char * rpmfiDN(rpmfi fi); + +/** \ingroup rpmfi + * Return current file name from file info set. + * @param fi file info set + * @return current file name + */ +const char * rpmfiFN(rpmfi fi); + +/** \ingroup rpmfi + * Return current file flags from file info set. + * @param fi file info set + * @return current file flags, 0 on invalid + */ +rpmfileAttrs rpmfiFFlags(rpmfi fi); + +/** \ingroup rpmfi + * Return current file verify flags from file info set. + * @param fi file info set + * @return current file verify flags, 0 on invalid + */ +rpmVerifyAttrs rpmfiVFlags(rpmfi fi); + +/** \ingroup rpmfi + * Return current file mode from file info set. + * @param fi file info set + * @return current file mode, 0 on invalid + */ +rpm_mode_t rpmfiFMode(rpmfi fi); + +/** \ingroup rpmfi + * Return current file state from file info set. + * @param fi file info set + * @return current file state, 0 on invalid + */ +rpmfileState rpmfiFState(rpmfi fi); + +/** \ingroup rpmfi + * Return digest algorithm of a file info set. + * @param fi file info set + * @return digest algorithm of file info set, 0 on invalid + */ +int rpmfiDigestAlgo(rpmfi fi); + +/** \ingroup rpmfi + * Return current file (binary) digest of file info set. + * @param fi file info set + * @retval algo digest hash algoritm used (pass NULL to ignore) + * @retval diglen digest hash length (pass NULL to ignore) + * @return current file digest, NULL on invalid + */ +const unsigned char * rpmfiFDigest(rpmfi fi, int *algo, size_t *diglen); + +/** \ingroup rpmfi + * Return current file (hex) digest of file info set. + * The file info set stores file digests in binary format to conserve + * memory, this converts the binary data back to hex presentation used in + * headers. + * @param fi file info set + * @retval algo digest hash algoritm used (pass NULL to ignore) + * @return current file digest (malloc'ed), NULL on invalid + */ +char * rpmfiFDigestHex(rpmfi fi, int *algo); + +/** \ingroup rpmfi + * Return current file (binary) md5 digest from file info set. + * @deprecated Use rpmfiFDigest() instead + * @param fi file info set + * @return current file md5 digest, NULL on invalid + */ +const unsigned char * rpmfiMD5(rpmfi fi) RPM_GNUC_DEPRECATED; + +/** \ingroup rpmfi + * Return current file linkto (i.e. symlink(2) target) from file info set. + * @param fi file info set + * @return current file linkto, NULL on invalid + */ +const char * rpmfiFLink(rpmfi fi); + +/** \ingroup rpmfi + * Return current file size from file info set. + * @param fi file info set + * @return current file size, 0 on invalid + */ +rpm_loff_t rpmfiFSize(rpmfi fi); + +/** \ingroup rpmfi + * Return current file rdev from file info set. + * @param fi file info set + * @return current file rdev, 0 on invalid + */ +rpm_rdev_t rpmfiFRdev(rpmfi fi); + +/** \ingroup rpmfi + * Return current file inode from file info set. + * @param fi file info set + * @return current file inode, 0 on invalid + */ +rpm_ino_t rpmfiFInode(rpmfi fi); + +/** \ingroup rpmfi + * Return union of all file color bits from file info set. + * @param fi file info set + * @return current color + */ +rpm_color_t rpmfiColor(rpmfi fi); + +/** \ingroup rpmfi + * Return current file color bits from file info set. + * @param fi file info set + * @return current file color + */ +rpm_color_t rpmfiFColor(rpmfi fi); + +/** \ingroup rpmfi + * Return current file class from file info set. + * @param fi file info set + * @return current file class, 0 on invalid + */ +const char * rpmfiFClass(rpmfi fi); + +/** \ingroup rpmfi + * Return current file depends dictionary from file info set. + * @param fi file info set + * @retval *fddictp file depends dictionary array (or NULL) + * @return no. of file depends entries, 0 on invalid + */ +uint32_t rpmfiFDepends(rpmfi fi, + const uint32_t ** fddictp); + +/** \ingroup rpmfi + * Return (calculated) current file nlink count from file info set. + * @param fi file info set + * @return current file nlink count, 0 on invalid + */ +uint32_t rpmfiFNlink(rpmfi fi); + +/** \ingroup rpmfi + * Return current file modify time from file info set. + * @param fi file info set + * @return current file modify time, 0 on invalid + */ +rpm_time_t rpmfiFMtime(rpmfi fi); + +/** \ingroup rpmfi + * Return current file owner from file info set. + * @param fi file info set + * @return current file owner, NULL on invalid + */ +const char * rpmfiFUser(rpmfi fi); + +/** \ingroup rpmfi + * Return current file group from file info set. + * @param fi file info set + * @return current file group, NULL on invalid + */ +const char * rpmfiFGroup(rpmfi fi); + +/** \ingroup rpmfi + * Return textual representation of current file capabilities + * from file info set. See cap_from_text(3) for details. + * @param fi file info set + * @return file capability description, "" for no capabilities + * and NULL on invalid + */ +const char * rpmfiFCaps(rpmfi fi); + +/** \ingroup rpmfi + * Return current file language(s) from file info set. + * @param fi file info set + * @return current file language(s), NULL on invalid + */ +const char * rpmfiFLangs(rpmfi fi); + +/** \ingroup rpmfi + * Return next file iterator index. + * @param fi file info set + * @return file iterator index, -1 on termination + */ +int rpmfiNext(rpmfi fi); + +/** \ingroup rpmfi + * Initialize file iterator index. + * @param fi file info set + * @param fx file iterator index + * @return file info set + */ +rpmfi rpmfiInit(rpmfi fi, int fx); + +/** \ingroup rpmfi + * Return next directory iterator index. + * @param fi file info set + * @return directory iterator index, -1 on termination + */ +int rpmfiNextD(rpmfi fi); + +/** \ingroup rpmfi + * Initialize directory iterator index. + * @param fi file info set + * @param dx directory iterator index + * @return file info set, NULL if dx is out of range + */ +rpmfi rpmfiInitD(rpmfi fi, int dx); + +/** \ingroup rpmfi + * Destroy a file info set. + * @param fi file info set + * @return NULL always + */ +rpmfi rpmfiFree(rpmfi fi); + +enum rpmfiFlags_e { + RPMFI_NOHEADER = 0, + RPMFI_KEEPHEADER = (1 << 0), + RPMFI_NOFILECLASS = (1 << 1), + RPMFI_NOFILEDEPS = (1 << 2), + RPMFI_NOFILELANGS = (1 << 3), + RPMFI_NOFILEUSER = (1 << 4), + RPMFI_NOFILEGROUP = (1 << 5), + RPMFI_NOFILEMODES = (1 << 6), + RPMFI_NOFILESIZES = (1 << 7), + RPMFI_NOFILECAPS = (1 << 8), + RPMFI_NOFILELINKTOS = (1 << 9), + RPMFI_NOFILEDIGESTS = (1 << 10), + RPMFI_NOFILEMTIMES = (1 << 11), + RPMFI_NOFILERDEVS = (1 << 12), + RPMFI_NOFILEINODES = (1 << 13), + RPMFI_NOFILESTATES = (1 << 14), + RPMFI_NOFILECOLORS = (1 << 15), + RPMFI_NOFILEVERIFYFLAGS = (1 << 16), + RPMFI_NOFILEFLAGS = (1 << 17), + RPMFI_ISBUILD = (1 << 30), /* internal */ + RPMFI_ISSOURCE = (1 << 31), /* internal */ +}; + +typedef rpmFlags rpmfiFlags; + +#define RPMFI_FLAGS_ERASE \ + (RPMFI_NOFILECLASS | RPMFI_NOFILELANGS | \ + RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | RPMFI_NOFILEINODES | \ + RPMFI_NOFILEVERIFYFLAGS) + +#define RPMFI_FLAGS_INSTALL \ + (RPMFI_NOFILECLASS | RPMFI_NOFILEVERIFYFLAGS) + +#define RPMFI_FLAGS_VERIFY \ + (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \ + RPMFI_NOFILECOLORS) + +#define RPMFI_FLAGS_QUERY \ + (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \ + RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS) + +/** \ingroup rpmfi + * Create and load a file info set. + * @param ts unused + * @param h header + * @param tagN unused + * @param flags Flags to control what information is loaded. + * @return new file info set + */ +rpmfi rpmfiNew(const rpmts ts, Header h, rpmTagVal tagN, rpmfiFlags flags); + +/** \ingroup rpmfi + * Return file type from mode_t. + * @param mode file mode bits (from header) + * @return file type + */ +rpmFileTypes rpmfiWhatis(rpm_mode_t mode); + +/** \ingroup rpmfi + * Return file info comparison. + * @param afi 1st file info + * @param bfi 2nd file info + * @return 0 if identical + */ +int rpmfiCompare(const rpmfi afi, const rpmfi bfi); + +/** \ingroup rpmfi + * Return file disposition. + * @param ofi old file info + * @param nfi new file info + * @param skipMissing OK to skip missing files? + * @return file dispostion + */ +rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing); + +/** \ingroup rpmfi + * Return whether file is conflicting config + * @param fi file info + * @return 1 if config file and file on disk conflicts + */ +int rpmfiConfigConflict(const rpmfi fi); + +#ifdef __cplusplus +} +#endif + +#endif /* H_RPMDS */ |