summaryrefslogtreecommitdiff
path: root/lib/fprint.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fprint.h')
-rw-r--r--lib/fprint.h170
1 files changed, 170 insertions, 0 deletions
diff --git a/lib/fprint.h b/lib/fprint.h
new file mode 100644
index 0000000..f2ea6f5
--- /dev/null
+++ b/lib/fprint.h
@@ -0,0 +1,170 @@
+#ifndef H_FINGERPRINT
+#define H_FINGERPRINT
+
+/** \ingroup rpmtrans
+ * \file lib/fprint.h
+ * Identify a file name path by a unique "finger print".
+ */
+
+#include <rpm/header.h>
+#include <rpm/rpmte.h>
+#include "lib/rpmdb_internal.h"
+
+/**
+ */
+typedef struct fprintCache_s * fingerPrintCache;
+
+/**
+ * @todo Convert to pointer and make abstract.
+ */
+typedef struct fingerPrint_s fingerPrint;
+
+/**
+ * Associates a trailing sub-directory and final base name with an existing
+ * directory finger print.
+ */
+struct fingerPrint_s {
+/*! directory finger print entry (the directory path is stat(2)-able */
+ const struct fprintCacheEntry_s * entry;
+/*! trailing sub-directory path (directories that are not stat(2)-able */
+const char * subDir;
+const char * baseName; /*!< file base name */
+};
+
+/* Create new hash table data type */
+#define HASHTYPE rpmFpEntryHash
+#define HTKEYTYPE const char *
+#define HTDATATYPE const struct fprintCacheEntry_s *
+#include "lib/rpmhash.H"
+
+/**
+ * Finger print cache entry.
+ * This is really a directory and symlink cache. We don't differentiate between
+ * the two. We can prepopulate it, which allows us to easily conduct "fake"
+ * installs of a system w/o actually mounting filesystems.
+ */
+struct fprintCacheEntry_s {
+ const char * dirName; /*!< path to existing directory */
+ dev_t dev; /*!< stat(2) device number */
+ ino_t ino; /*!< stat(2) inode number */
+};
+
+/**
+ * Finger print cache.
+ */
+struct fprintCache_s {
+ rpmFpEntryHash ht; /*!< hashed by dirName */
+};
+
+/* Create new hash table data type */
+
+struct rpmffi_s {
+ rpmte p;
+ int fileno;
+};
+
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
+#define HASHTYPE rpmFpHash
+#define HTKEYTYPE const fingerPrint *
+#define HTDATATYPE struct rpmffi_s
+#include "lib/rpmhash.H"
+
+/** */
+#define FP_ENTRY_EQUAL(a, b) (((a)->dev == (b)->dev) && ((a)->ino == (b)->ino))
+
+/** */
+#define FP_EQUAL(a, b) ( \
+ FP_ENTRY_EQUAL((a).entry, (b).entry) && \
+ !strcmp((a).baseName, (b).baseName) && ( \
+ ((a).subDir == (b).subDir) || \
+ ((a).subDir && (b).subDir && !strcmp((a).subDir, (b).subDir)) \
+ ) \
+ )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Create finger print cache.
+ * @param sizeHint number of elements expected
+ * @return pointer to initialized fingerprint cache
+ */
+RPM_GNUC_INTERNAL
+fingerPrintCache fpCacheCreate(int sizeHint);
+
+/**
+ * Destroy finger print cache.
+ * @param cache pointer to fingerprint cache
+ * @return NULL always
+ */
+RPM_GNUC_INTERNAL
+fingerPrintCache fpCacheFree(fingerPrintCache cache);
+
+/**
+ * Return finger print of a file path.
+ * @param cache pointer to fingerprint cache
+ * @param dirName leading directory name of file path
+ * @param baseName base name of file path
+ * @param scareMemory
+ * @return pointer to the finger print associated with a file path.
+ */
+RPM_GNUC_INTERNAL
+fingerPrint fpLookup(fingerPrintCache cache, const char * dirName,
+ const char * baseName, int scareMemory);
+
+/**
+ * Return hash value for a finger print.
+ * Hash based on dev and inode only!
+ * @param key pointer to finger print entry
+ * @return hash value
+ */
+RPM_GNUC_INTERNAL
+unsigned int fpHashFunction(const fingerPrint * key);
+
+/**
+ * Compare two finger print entries.
+ * This routine is exactly equivalent to the FP_EQUAL macro.
+ * @param key1 finger print 1
+ * @param key2 finger print 2
+ * @return result of comparing key1 and key2
+ */
+RPM_GNUC_INTERNAL
+int fpEqual(const fingerPrint * key1, const fingerPrint * key2);
+
+/**
+ * Return finger prints of an array of file paths.
+ * @warning: scareMemory is assumed!
+ * @param cache pointer to fingerprint cache
+ * @param dirNames directory names
+ * @param baseNames file base names
+ * @param dirIndexes index into dirNames for each baseNames
+ * @param fileCount number of file entries
+ * @retval fpList pointer to array of finger prints
+ */
+RPM_GNUC_INTERNAL
+void fpLookupList(fingerPrintCache cache, const char ** dirNames,
+ const char ** baseNames, const uint32_t * dirIndexes,
+ int fileCount, fingerPrint * fpList);
+
+/**
+ * Check file for to be installed symlinks in their path,
+ * correct their fingerprint and add it to newht.
+ * @param ht hash table containing all files fingerprints
+ * @param newht hash table to add the corrected fingerprints
+ * @param fpc fingerprint cache
+ * @param fi file iterator of the package
+ * @param filenr the number of the file we are dealing with
+ */
+RPM_GNUC_INTERNAL
+void fpLookupSubdir(rpmFpHash symlinks, rpmFpHash fphash, fingerPrintCache fpc, rpmte p, int filenr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif