summaryrefslogtreecommitdiff
path: root/lib/rpmfi.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rpmfi.h')
-rw-r--r--lib/rpmfi.h459
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 */