--- /dev/null
+gutsy
\ No newline at end of file
--- /dev/null
+gutsy
\ No newline at end of file
--- /dev/null
+/** \ingroup rpmdep
+ * \file lib/rpmfi.c
+ * Routines to handle file info tag sets.
+ */
+
+#include "system.h"
+
+#include <rpm/rpmlog.h>
+#include <rpm/rpmts.h>
+#include <rpm/rpmfileutil.h> /* XXX rpmDoDigest */
+#include <rpm/rpmstring.h>
+#include <rpm/rpmmacro.h> /* XXX rpmCleanPath */
+#include <rpm/rpmds.h>
+
+#include "lib/rpmfi_internal.h"
+#include "lib/rpmte_internal.h" /* relocations */
+#include "lib/cpio.h" /* XXX CPIO_FOO */
+
+#include "debug.h"
+
+/*
+ * Simple and stupid string "cache."
+ * Store each unique string just once, retrieve by index value.
+ * For data where number of unique names is typically very low,
+ * the dumb linear lookup appears to be fast enough and hash table seems
+ * like an overkill.
+ */
+struct strcache_s {
+ char **uniq;
+ scidx_t num;
+};
+
+static struct strcache_s _ugcache = { NULL, 0 };
+static strcache ugcache = &_ugcache;
+static struct strcache_s _langcache = { NULL, 0 };
+static strcache langcache = &_langcache;
+
+static scidx_t strcachePut(strcache cache, const char *str)
+{
+ int found = 0;
+ scidx_t ret;
+
+ for (scidx_t i = 0; i < cache->num; i++) {
+ if (rstreq(str, cache->uniq[i])) {
+ ret = i;
+ found = 1;
+ break;
+ }
+ }
+ if (!found) {
+ /* blow up on index wraparound */
+ assert((scidx_t)(cache->num + 1) > cache->num);
+ cache->uniq = xrealloc(cache->uniq,
+ sizeof(*cache->uniq) * (cache->num+1));
+ cache->uniq[cache->num] = xstrdup(str);
+ ret = cache->num;
+ cache->num++;
+ }
+ return ret;
+}
+
+static const char *strcacheGet(strcache cache, scidx_t idx)
+{
+ const char *name = NULL;
+ if (idx >= 0 && idx < cache->num && cache->uniq != NULL)
+ name = cache->uniq[idx];
+ return name;
+}
+
+static strcache strcacheNew(void)
+{
+ strcache cache = xcalloc(1, sizeof(*cache));
+ return cache;
+}
+
+static strcache strcacheFree(strcache cache)
+{
+ if (cache != NULL) {
+ for (scidx_t i = 0; i < cache->num; i++) {
+ free(cache->uniq[i]);
+ }
+ cache->uniq = _free(cache->uniq);
+ free(cache);
+ }
+ return NULL;
+}
+
+static rpmfi rpmfiUnlink(rpmfi fi)
+{
+ if (fi)
+ fi->nrefs--;
+ return NULL;
+}
+
+rpmfi rpmfiLink(rpmfi fi)
+{
+ if (fi)
+ fi->nrefs++;
+ return fi;
+}
+
+rpm_count_t rpmfiFC(rpmfi fi)
+{
+ return (fi != NULL ? fi->fc : 0);
+}
+
+rpm_count_t rpmfiDC(rpmfi fi)
+{
+ return (fi != NULL ? fi->dc : 0);
+}
+
+#ifdef NOTYET
+int rpmfiDI(rpmfi fi)
+{
+}
+#endif
+
+int rpmfiFX(rpmfi fi)
+{
+ return (fi != NULL ? fi->i : -1);
+}
+
+int rpmfiSetFX(rpmfi fi, int fx)
+{
+ int i = -1;
+
+ if (fi != NULL && fx >= 0 && fx < fi->fc) {
+ i = fi->i;
+ fi->i = fx;
+ fi->j = fi->dil[fi->i];
+ }
+ return i;
+}
+
+int rpmfiDX(rpmfi fi)
+{
+ return (fi != NULL ? fi->j : -1);
+}
+
+int rpmfiSetDX(rpmfi fi, int dx)
+{
+ int j = -1;
+
+ if (fi != NULL && dx >= 0 && dx < fi->dc) {
+ j = fi->j;
+ fi->j = dx;
+ }
+ return j;
+}
+
+int rpmfiDIIndex(rpmfi fi, int dx)
+{
+ int j = -1;
+ if (fi != NULL && dx >= 0 && dx < fi->fc) {
+ if (fi->dil != NULL)
+ j = fi->dil[dx];
+ }
+ return j;
+}
+
+const char * rpmfiBNIndex(rpmfi fi, int ix)
+{
+ const char * BN = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->bnl != NULL)
+ BN = fi->bnl[ix];
+ }
+ return BN;
+}
+
+const char * rpmfiDNIndex(rpmfi fi, int jx)
+{
+ const char * DN = NULL;
+
+ if (fi != NULL && jx >= 0 && jx < fi->dc) {
+ if (fi->dnl != NULL)
+ DN = fi->dnl[jx];
+ }
+ return DN;
+}
+
+char * rpmfiFNIndex(rpmfi fi, int ix)
+{
+ char *fn = NULL;
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ fn = rstrscat(NULL, fi->dnl[fi->dil[ix]], fi->bnl[ix], NULL);
+ }
+ return fn;
+}
+
+rpmfileAttrs rpmfiFFlagsIndex(rpmfi fi, int ix)
+{
+ rpmfileAttrs FFlags = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fflags != NULL)
+ FFlags = fi->fflags[ix];
+ }
+ return FFlags;
+}
+
+rpmVerifyAttrs rpmfiVFlagsIndex(rpmfi fi, int ix)
+{
+ rpmVerifyAttrs VFlags = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->vflags != NULL)
+ VFlags = fi->vflags[ix];
+ }
+ return VFlags;
+}
+
+rpm_mode_t rpmfiFModeIndex(rpmfi fi, int ix)
+{
+ rpm_mode_t fmode = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fmodes != NULL)
+ fmode = fi->fmodes[ix];
+ }
+ return fmode;
+}
+
+rpmfileState rpmfiFStateIndex(rpmfi fi, int ix)
+{
+ rpmfileState fstate = RPMFILE_STATE_MISSING;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fstates != NULL)
+ fstate = fi->fstates[ix];
+ }
+ return fstate;
+}
+
+const unsigned char * rpmfiMD5(rpmfi fi)
+{
+ const unsigned char *digest;
+ int algo = 0;
+
+ digest = rpmfiFDigest(fi, &algo, NULL);
+ return (algo == PGPHASHALGO_MD5) ? digest : NULL;
+}
+
+int rpmfiDigestAlgo(rpmfi fi)
+{
+ return fi ? fi->digestalgo : 0;
+}
+
+const unsigned char * rpmfiFDigestIndex(rpmfi fi, int ix, int *algo, size_t *len)
+{
+ const unsigned char *digest = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ size_t diglen = rpmDigestLength(fi->digestalgo);
+ if (fi->digests != NULL)
+ digest = fi->digests + (diglen * ix);
+ if (len)
+ *len = diglen;
+ if (algo)
+ *algo = fi->digestalgo;
+ }
+ return digest;
+}
+
+char * rpmfiFDigestHex(rpmfi fi, int *algo)
+{
+ size_t diglen = 0;
+ char *fdigest = NULL;
+ const unsigned char *digest = rpmfiFDigest(fi, algo, &diglen);
+ if (digest) {
+ fdigest = pgpHexStr(digest, diglen);
+ }
+ return fdigest;
+}
+
+const char * rpmfiFLinkIndex(rpmfi fi, int ix)
+{
+ const char * flink = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->flinks != NULL)
+ flink = strcacheGet(fi->flinkcache, fi->flinks[ix]);
+ }
+ return flink;
+}
+
+rpm_loff_t rpmfiFSizeIndex(rpmfi fi, int ix)
+{
+ rpm_loff_t fsize = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fsizes != NULL)
+ fsize = fi->fsizes[ix];
+ }
+ return fsize;
+}
+
+rpm_rdev_t rpmfiFRdevIndex(rpmfi fi, int ix)
+{
+ rpm_rdev_t frdev = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->frdevs != NULL)
+ frdev = fi->frdevs[ix];
+ }
+ return frdev;
+}
+
+rpm_ino_t rpmfiFInodeIndex(rpmfi fi, int ix)
+{
+ rpm_ino_t finode = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->finodes != NULL)
+ finode = fi->finodes[ix];
+ }
+ return finode;
+}
+
+rpm_color_t rpmfiColor(rpmfi fi)
+{
+ rpm_color_t color = 0;
+
+ if (fi != NULL && fi->fcolors != NULL) {
+ for (int i = 0; i < fi->fc; i++)
+ color |= fi->fcolors[i];
+ /* XXX ignore all but lsnibble for now. */
+ color &= 0xf;
+ }
+ return color;
+}
+
+rpm_color_t rpmfiFColorIndex(rpmfi fi, int ix)
+{
+ rpm_color_t fcolor = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fcolors != NULL)
+ /* XXX ignore all but lsnibble for now. */
+ fcolor = (fi->fcolors[ix] & 0x0f);
+ }
+ return fcolor;
+}
+
+const char * rpmfiFClassIndex(rpmfi fi, int ix)
+{
+ const char * fclass = NULL;
+ int cdictx;
+
+ if (fi != NULL && fi->fcdictx != NULL && ix >= 0 && ix < fi->fc) {
+ cdictx = fi->fcdictx[ix];
+ if (fi->cdict != NULL && cdictx >= 0 && cdictx < fi->ncdict)
+ fclass = fi->cdict[cdictx];
+ }
+ return fclass;
+}
+
+uint32_t rpmfiFDependsIndex(rpmfi fi, int ix, const uint32_t ** fddictp)
+{
+ int fddictx = -1;
+ int fddictn = 0;
+ const uint32_t * fddict = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fddictn != NULL)
+ fddictn = fi->fddictn[ix];
+ if (fddictn > 0 && fi->fddictx != NULL)
+ fddictx = fi->fddictx[ix];
+ if (fi->ddict != NULL && fddictx >= 0 && (fddictx+fddictn) <= fi->nddict)
+ fddict = fi->ddict + fddictx;
+ }
+ if (fddictp)
+ *fddictp = fddict;
+ return fddictn;
+}
+
+uint32_t rpmfiFNlinkIndex(rpmfi fi, int ix)
+{
+ uint32_t nlink = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ /* XXX rpm-2.3.12 has not RPMTAG_FILEINODES */
+ if (fi->finodes && fi->frdevs) {
+ rpm_ino_t finode = fi->finodes[ix];
+ rpm_rdev_t frdev = fi->frdevs[ix];
+ int j;
+
+ for (j = 0; j < fi->fc; j++) {
+ if (fi->frdevs[j] == frdev && fi->finodes[j] == finode)
+ nlink++;
+ }
+ }
+ }
+ return nlink;
+}
+
+rpm_time_t rpmfiFMtimeIndex(rpmfi fi, int ix)
+{
+ rpm_time_t fmtime = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fmtimes != NULL)
+ fmtime = fi->fmtimes[ix];
+ }
+ return fmtime;
+}
+
+const char * rpmfiFUserIndex(rpmfi fi, int ix)
+{
+ const char * fuser = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fuser != NULL)
+ fuser = strcacheGet(ugcache, fi->fuser[ix]);
+ }
+ return fuser;
+}
+
+const char * rpmfiFGroupIndex(rpmfi fi, int ix)
+{
+ const char * fgroup = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fgroup != NULL)
+ fgroup = strcacheGet(ugcache, fi->fgroup[ix]);
+ }
+ return fgroup;
+}
+
+const char * rpmfiFCapsIndex(rpmfi fi, int ix)
+{
+ const char *fcaps = NULL;
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ fcaps = fi->fcapcache ? strcacheGet(fi->fcapcache, fi->fcaps[ix]) : "";
+ }
+ return fcaps;
+}
+
+const char * rpmfiFLangsIndex(rpmfi fi, int ix)
+{
+ const char *flangs = NULL;
+ if (fi != NULL && fi->flangs != NULL && ix >= 0 && ix < fi->fc) {
+ flangs = strcacheGet(langcache, fi->flangs[ix]);
+ }
+ return flangs;
+}
+
+struct fingerPrint_s *rpmfiFpsIndex(rpmfi fi, int ix)
+{
+ struct fingerPrint_s * fps = NULL;
+ if (fi != NULL && fi->fps != NULL && ix >= 0 && ix < fi->fc) {
+ fps = fi->fps + ix;
+ }
+ return fps;
+}
+
+int rpmfiNext(rpmfi fi)
+{
+ int i = -1;
+
+ if (fi != NULL && ++fi->i >= 0) {
+ if (fi->i < fi->fc) {
+ i = fi->i;
+ if (fi->dil != NULL)
+ fi->j = fi->dil[fi->i];
+ } else
+ fi->i = -1;
+ }
+
+ return i;
+}
+
+rpmfi rpmfiInit(rpmfi fi, int fx)
+{
+ if (fi != NULL) {
+ if (fx >= 0 && fx < fi->fc) {
+ fi->i = fx - 1;
+ fi->j = -1;
+ }
+ }
+
+ return fi;
+}
+
+int rpmfiNextD(rpmfi fi)
+{
+ int j = -1;
+
+ if (fi != NULL && ++fi->j >= 0) {
+ if (fi->j < fi->dc)
+ j = fi->j;
+ else
+ fi->j = -1;
+ }
+
+ return j;
+}
+
+rpmfi rpmfiInitD(rpmfi fi, int dx)
+{
+ if (fi != NULL) {
+ if (dx >= 0 && dx < fi->fc)
+ fi->j = dx - 1;
+ else
+ fi = NULL;
+ }
+
+ return fi;
+}
+
+/**
+ * Identify a file type.
+ * @param ft file type
+ * @return string to identify a file type
+ */
+static
+const char * ftstring (rpmFileTypes ft)
+{
+ switch (ft) {
+ case XDIR: return "directory";
+ case CDEV: return "char dev";
+ case BDEV: return "block dev";
+ case LINK: return "link";
+ case SOCK: return "sock";
+ case PIPE: return "fifo/pipe";
+ case REG: return "file";
+ default: return "unknown file type";
+ }
+}
+
+rpmFileTypes rpmfiWhatis(rpm_mode_t mode)
+{
+ if (S_ISDIR(mode)) return XDIR;
+ if (S_ISCHR(mode)) return CDEV;
+ if (S_ISBLK(mode)) return BDEV;
+ if (S_ISLNK(mode)) return LINK;
+ if (S_ISSOCK(mode)) return SOCK;
+ if (S_ISFIFO(mode)) return PIPE;
+ return REG;
+}
+
+int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix)
+{
+ mode_t amode = rpmfiFModeIndex(afi, aix);
+ mode_t bmode = rpmfiFModeIndex(bfi, bix);
+ rpmFileTypes awhat = rpmfiWhatis(amode);
+
+ if ((rpmfiFFlagsIndex(afi, aix) & RPMFILE_GHOST) ||
+ (rpmfiFFlagsIndex(bfi, bix) & RPMFILE_GHOST)) return 0;
+
+ if (amode != bmode) return 1;
+
+ if (!rstreq(rpmfiFUserIndex(afi, aix), rpmfiFUserIndex(bfi, bix)))
+ return 1;
+ if (!rstreq(rpmfiFGroupIndex(afi, aix), rpmfiFGroupIndex(bfi, bix)))
+ return 1;
+
+ if (awhat == LINK) {
+ const char * alink = rpmfiFLinkIndex(afi, aix);
+ const char * blink = rpmfiFLinkIndex(bfi, bix);
+ if (alink == blink) return 0;
+ if (alink == NULL) return 1;
+ if (blink == NULL) return -1;
+ return strcmp(alink, blink);
+ } else if (awhat == REG) {
+ size_t adiglen, bdiglen;
+ int aalgo, balgo;
+ const unsigned char * adigest, * bdigest;
+ adigest = rpmfiFDigestIndex(afi, aix, &aalgo, &adiglen);
+ bdigest = rpmfiFDigestIndex(bfi, bix, &balgo, &bdiglen);
+ if (adigest == bdigest) return 0;
+ if (adigest == NULL) return 1;
+ if (bdigest == NULL) return -1;
+ /* can't meaningfully compare different hash types */
+ if (aalgo != balgo || adiglen != bdiglen) return -1;
+ return memcmp(adigest, bdigest, adiglen);
+ } else if (awhat == CDEV || awhat == BDEV) {
+ if (rpmfiFRdevIndex(afi, aix) != rpmfiFRdevIndex(bfi, bix))
+ return 1;
+ }
+
+ return 0;
+}
+
+rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix,
+ int skipMissing)
+{
+ char * fn = rpmfiFNIndex(nfi, nix);
+ rpmfileAttrs newFlags = rpmfiFFlagsIndex(nfi, nix);
+ char buffer[1024];
+ rpmFileTypes dbWhat, newWhat, diskWhat;
+ struct stat sb;
+ int save = (newFlags & RPMFILE_NOREPLACE) ? FA_ALTNAME : FA_SAVE;
+ int action = FA_CREATE; /* assume we can create */
+
+ if (lstat(fn, &sb)) {
+ /*
+ * The file doesn't exist on the disk. Create it unless the new
+ * package has marked it as missingok, or allfiles is requested.
+ */
+ if (skipMissing && (newFlags & RPMFILE_MISSINGOK)) {
+ rpmlog(RPMLOG_DEBUG, "%s skipped due to missingok flag\n",
+ fn);
+ action = FA_SKIP;
+ }
+ goto exit;
+ }
+
+ diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode);
+ dbWhat = rpmfiWhatis(rpmfiFModeIndex(ofi, oix));
+ newWhat = rpmfiWhatis(rpmfiFModeIndex(nfi, nix));
+
+ /*
+ * RPM >= 2.3.10 shouldn't create config directories -- we'll ignore
+ * them in older packages as well.
+ */
+ if (newWhat == XDIR)
+ goto exit;
+
+ if (diskWhat != newWhat && dbWhat != REG && dbWhat != LINK) {
+ action = save;
+ goto exit;
+ } else if (newWhat != dbWhat && diskWhat != dbWhat) {
+ action = save;
+ goto exit;
+ } else if (dbWhat != newWhat) {
+ goto exit;
+ } else if (dbWhat != LINK && dbWhat != REG) {
+ goto exit;
+ }
+
+ /*
+ * This order matters - we'd prefer to CREATE the file if at all
+ * possible in case something else (like the timestamp) has changed.
+ */
+ memset(buffer, 0, sizeof(buffer));
+ if (dbWhat == REG) {
+ int oalgo, nalgo;
+ size_t odiglen, ndiglen;
+ const unsigned char * odigest, * ndigest;
+ odigest = rpmfiFDigestIndex(ofi, oix, &oalgo, &odiglen);
+ if (diskWhat == REG) {
+ if (rpmDoDigest(oalgo, fn, 0, (unsigned char *)buffer, NULL))
+ goto exit; /* assume file has been removed */
+ if (odigest && !memcmp(odigest, buffer, odiglen))
+ goto exit; /* unmodified config file, replace. */
+ }
+ ndigest = rpmfiFDigestIndex(nfi, nix, &nalgo, &ndiglen);
+ /* Can't compare different hash types, backup to avoid data loss */
+ if (oalgo != nalgo || odiglen != ndiglen) {
+ action = save;
+ goto exit;
+ }
+ if (odigest && ndigest && !memcmp(odigest, ndigest, odiglen)) {
+ action = FA_SKIP; /* identical file, don't bother. */
+ goto exit;
+ }
+ /* ... but otherwise backup will be needed */
+ action = save;
+ } else /* dbWhat == LINK */ {
+ const char * oFLink, * nFLink;
+ oFLink = rpmfiFLinkIndex(ofi, oix);
+ if (diskWhat == LINK) {
+ ssize_t link_len = readlink(fn, buffer, sizeof(buffer) - 1);
+ if (link_len == -1)
+ goto exit; /* assume file has been removed */
+ buffer[link_len] = '\0';
+ if (oFLink && rstreq(oFLink, buffer))
+ goto exit; /* unmodified config file, replace. */
+ }
+ nFLink = rpmfiFLinkIndex(nfi, nix);
+ if (oFLink && nFLink && rstreq(oFLink, nFLink)) {
+ action = FA_SKIP; /* identical file, don't bother. */
+ goto exit;
+ }
+ /* ... but otherwise backup will be needed */
+ action = save;
+ }
+
+exit:
+ free(fn);
+ return action;
+}
+
+int rpmfiConfigConflictIndex(rpmfi fi, int ix)
+{
+ char * fn = NULL;
+ rpmfileAttrs flags = rpmfiFFlagsIndex(fi, ix);
+ char buffer[1024];
+ rpmFileTypes newWhat, diskWhat;
+ struct stat sb;
+ int rc = 0;
+
+ if (!(flags & RPMFILE_CONFIG))
+ return 0;
+
+ /* Only links and regular files can be %config, this is kinda moot */
+ /* XXX: Why are we returning 1 here? */
+ newWhat = rpmfiWhatis(rpmfiFModeIndex(fi, ix));
+ if (newWhat != LINK && newWhat != REG)
+ return 1;
+
+ /* If it's not on disk, there's nothing to be saved */
+ fn = rpmfiFNIndex(fi, ix);
+ if (lstat(fn, &sb))
+ goto exit;
+
+ /* Files of different types obviously are not identical */
+ diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode);
+ if (diskWhat != newWhat) {
+ rc = 1;
+ goto exit;
+ }
+
+ memset(buffer, 0, sizeof(buffer));
+ if (newWhat == REG) {
+ int algo;
+ size_t diglen;
+ const unsigned char *ndigest = rpmfiFDigestIndex(fi,ix, &algo, &diglen);
+ if (rpmDoDigest(algo, fn, 0, (unsigned char *)buffer, NULL))
+ goto exit; /* assume file has been removed */
+ if (ndigest && !memcmp(ndigest, buffer, diglen))
+ goto exit; /* unmodified config file */
+ } else /* newWhat == LINK */ {
+ const char * nFLink;
+ ssize_t link_len = readlink(fn, buffer, sizeof(buffer) - 1);
+ if (link_len == -1)
+ goto exit; /* assume file has been removed */
+ buffer[link_len] = '\0';
+ nFLink = rpmfiFLinkIndex(fi, ix);
+ if (nFLink && rstreq(nFLink, buffer))
+ goto exit; /* unmodified config file */
+ }
+
+ rc = 1;
+
+exit:
+ free(fn);
+ return rc;
+}
+
+static char **duparray(char ** src, int size)
+{
+ char **dest = xmalloc((size+1) * sizeof(*dest));
+ for (int i = 0; i < size; i++) {
+ dest[i] = xstrdup(src[i]);
+ }
+ free(src);
+ return dest;
+}
+
+static int addPrefixes(Header h, rpmRelocation *relocations, int numRelocations)
+{
+ struct rpmtd_s validRelocs;
+ const char *validprefix;
+ const char ** actualRelocations;
+ int numActual = 0;
+
+ headerGet(h, RPMTAG_PREFIXES, &validRelocs, HEADERGET_MINMEM);
+ /*
+ * If no relocations are specified (usually the case), then return the
+ * original header. If there are prefixes, however, then INSTPREFIXES
+ * should be added for RPM_INSTALL_PREFIX environ variables in scriptlets,
+ * but, since relocateFileList() can be called more than once for
+ * the same header, don't bother if already present.
+ */
+ if (relocations == NULL || numRelocations == 0) {
+ if (rpmtdCount(&validRelocs) > 0) {
+ if (!headerIsEntry(h, RPMTAG_INSTPREFIXES)) {
+ rpmtdSetTag(&validRelocs, RPMTAG_INSTPREFIXES);
+ headerPut(h, &validRelocs, HEADERPUT_DEFAULT);
+ }
+ rpmtdFreeData(&validRelocs);
+ }
+ return 0;
+ }
+
+ actualRelocations = xmalloc(rpmtdCount(&validRelocs) * sizeof(*actualRelocations));
+ rpmtdInit(&validRelocs);
+ while ((validprefix = rpmtdNextString(&validRelocs))) {
+ int j;
+ for (j = 0; j < numRelocations; j++) {
+ if (relocations[j].oldPath == NULL || /* XXX can't happen */
+ !rstreq(validprefix, relocations[j].oldPath))
+ continue;
+ /* On install, a relocate to NULL means skip the path. */
+ if (relocations[j].newPath) {
+ actualRelocations[numActual] = relocations[j].newPath;
+ numActual++;
+ }
+ break;
+ }
+ if (j == numRelocations) {
+ actualRelocations[numActual] = validprefix;
+ numActual++;
+ }
+ }
+ rpmtdFreeData(&validRelocs);
+
+ if (numActual) {
+ headerPutStringArray(h, RPMTAG_INSTPREFIXES, actualRelocations, numActual);
+ }
+ free(actualRelocations);
+ return numActual;
+}
+
+static void saveRelocs(Header h, rpmtd bnames, rpmtd dnames, rpmtd dindexes)
+{
+ struct rpmtd_s td;
+ headerGet(h, RPMTAG_BASENAMES, &td, HEADERGET_MINMEM);
+ rpmtdSetTag(&td, RPMTAG_ORIGBASENAMES);
+ headerPut(h, &td, HEADERPUT_DEFAULT);
+ rpmtdFreeData(&td);
+
+ headerGet(h, RPMTAG_DIRNAMES, &td, HEADERGET_MINMEM);
+ rpmtdSetTag(&td, RPMTAG_ORIGDIRNAMES);
+ headerPut(h, &td, HEADERPUT_DEFAULT);
+ rpmtdFreeData(&td);
+
+ headerGet(h, RPMTAG_DIRINDEXES, &td, HEADERGET_MINMEM);
+ rpmtdSetTag(&td, RPMTAG_ORIGDIRINDEXES);
+ headerPut(h, &td, HEADERPUT_DEFAULT);
+ rpmtdFreeData(&td);
+
+ headerMod(h, bnames);
+ headerMod(h, dnames);
+ headerMod(h, dindexes);
+}
+
+void rpmRelocateFileList(rpmRelocation *relocations, int numRelocations,
+ rpmfs fs, Header h)
+{
+ static int _printed = 0;
+ char ** baseNames;
+ char ** dirNames;
+ uint32_t * dirIndexes;
+ rpm_count_t fileCount, dirCount;
+ int nrelocated = 0;
+ int fileAlloced = 0;
+ char * fn = NULL;
+ int haveRelocatedBase = 0;
+ size_t maxlen = 0;
+ int i, j;
+ struct rpmtd_s bnames, dnames, dindexes, fmodes;
+
+ addPrefixes(h, relocations, numRelocations);
+
+ if (!_printed) {
+ _printed = 1;
+ rpmlog(RPMLOG_DEBUG, "========== relocations\n");
+ for (i = 0; i < numRelocations; i++) {
+ if (relocations[i].oldPath == NULL) continue; /* XXX can't happen */
+ if (relocations[i].newPath == NULL)
+ rpmlog(RPMLOG_DEBUG, "%5d exclude %s\n",
+ i, relocations[i].oldPath);
+ else
+ rpmlog(RPMLOG_DEBUG, "%5d relocate %s -> %s\n",
+ i, relocations[i].oldPath, relocations[i].newPath);
+ }
+ }
+
+ for (i = 0; i < numRelocations; i++) {
+ if (relocations[i].newPath == NULL) continue;
+ size_t len = strlen(relocations[i].newPath);
+ if (len > maxlen) maxlen = len;
+ }
+
+ headerGet(h, RPMTAG_BASENAMES, &bnames, HEADERGET_MINMEM);
+ headerGet(h, RPMTAG_DIRINDEXES, &dindexes, HEADERGET_ALLOC);
+ headerGet(h, RPMTAG_DIRNAMES, &dnames, HEADERGET_MINMEM);
+ headerGet(h, RPMTAG_FILEMODES, &fmodes, HEADERGET_MINMEM);
+ /* TODO XXX ugh.. use rpmtd iterators & friends instead */
+ baseNames = bnames.data;
+ dirIndexes = dindexes.data;
+ fileCount = rpmtdCount(&bnames);
+ dirCount = rpmtdCount(&dnames);
+ /* XXX TODO: use rpmtdDup() instead */
+ dirNames = dnames.data = duparray(dnames.data, dirCount);
+ dnames.flags |= RPMTD_PTR_ALLOCED;
+
+ /*
+ * For all relocations, we go through sorted file/relocation lists
+ * backwards so that /usr/local relocations take precedence over /usr
+ * ones.
+ */
+
+ /* Relocate individual paths. */
+
+ for (i = fileCount - 1; i >= 0; i--) {
+ rpmFileTypes ft;
+ int fnlen;
+
+ size_t len = maxlen +
+ strlen(dirNames[dirIndexes[i]]) + strlen(baseNames[i]) + 1;
+ if (len >= fileAlloced) {
+ fileAlloced = len * 2;
+ fn = xrealloc(fn, fileAlloced);
+ }
+
+assert(fn != NULL); /* XXX can't happen */
+ *fn = '\0';
+ fnlen = stpcpy( stpcpy(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn;
+
+ /*
+ * See if this file path needs relocating.
+ */
+ /*
+ * XXX FIXME: Would a bsearch of the (already sorted)
+ * relocation list be a good idea?
+ */
+ for (j = numRelocations - 1; j >= 0; j--) {
+ if (relocations[j].oldPath == NULL) /* XXX can't happen */
+ continue;
+ len = !rstreq(relocations[j].oldPath, "/")
+ ? strlen(relocations[j].oldPath)
+ : 0;
+
+ if (fnlen < len)
+ continue;
+ /*
+ * Only subdirectories or complete file paths may be relocated. We
+ * don't check for '\0' as our directory names all end in '/'.
+ */
+ if (!(fn[len] == '/' || fnlen == len))
+ continue;
+
+ if (!rstreqn(relocations[j].oldPath, fn, len))
+ continue;
+ break;
+ }
+ if (j < 0) continue;
+
+ rpmtdSetIndex(&fmodes, i);
+ ft = rpmfiWhatis(rpmtdGetNumber(&fmodes));
+
+ /* On install, a relocate to NULL means skip the path. */
+ if (relocations[j].newPath == NULL) {
+ if (ft == XDIR) {
+ /* Start with the parent, looking for directory to exclude. */
+ for (j = dirIndexes[i]; j < dirCount; j++) {
+ len = strlen(dirNames[j]) - 1;
+ while (len > 0 && dirNames[j][len-1] == '/') len--;
+ if (fnlen != len)
+ continue;
+ if (!rstreqn(fn, dirNames[j], fnlen))
+ continue;
+ break;
+ }
+ }
+ rpmfsSetAction(fs, i, FA_SKIPNSTATE);
+ rpmlog(RPMLOG_DEBUG, "excluding %s %s\n",
+ ftstring(ft), fn);
+ continue;
+ }
+
+ /* Relocation on full paths only, please. */
+ if (fnlen != len) continue;
+
+ rpmlog(RPMLOG_DEBUG, "relocating %s to %s\n",
+ fn, relocations[j].newPath);
+ nrelocated++;
+
+ strcpy(fn, relocations[j].newPath);
+ { char * te = strrchr(fn, '/');
+ if (te) {
+ if (te > fn) te++; /* root is special */
+ fnlen = te - fn;
+ } else
+ te = fn + strlen(fn);
+ if (!rstreq(baseNames[i], te)) { /* basename changed too? */
+ if (!haveRelocatedBase) {
+ /* XXX TODO: use rpmtdDup() instead */
+ bnames.data = baseNames = duparray(baseNames, fileCount);
+ bnames.flags |= RPMTD_PTR_ALLOCED;
+ haveRelocatedBase = 1;
+ }
+ free(baseNames[i]);
+ baseNames[i] = xstrdup(te);
+ }
+ *te = '\0'; /* terminate new directory name */
+ }
+
+ /* Does this directory already exist in the directory list? */
+ for (j = 0; j < dirCount; j++) {
+ if (fnlen != strlen(dirNames[j]))
+ continue;
+ if (!rstreqn(fn, dirNames[j], fnlen))
+ continue;
+ break;
+ }
+
+ if (j < dirCount) {
+ dirIndexes[i] = j;
+ continue;
+ }
+
+ /* Creating new paths is a pita */
+ dirNames = dnames.data = xrealloc(dnames.data,
+ sizeof(*dirNames) * (dirCount + 1));
+
+ dirNames[dirCount] = xstrdup(fn);
+ dirIndexes[i] = dirCount;
+ dirCount++;
+ dnames.count++;
+ }
+
+ /* Finish off by relocating directories. */
+ for (i = dirCount - 1; i >= 0; i--) {
+ for (j = numRelocations - 1; j >= 0; j--) {
+
+ if (relocations[j].oldPath == NULL) /* XXX can't happen */
+ continue;
+ size_t len = !rstreq(relocations[j].oldPath, "/")
+ ? strlen(relocations[j].oldPath)
+ : 0;
+
+ if (len && !rstreqn(relocations[j].oldPath, dirNames[i], len))
+ continue;
+
+ /*
+ * Only subdirectories or complete file paths may be relocated. We
+ * don't check for '\0' as our directory names all end in '/'.
+ */
+ if (dirNames[i][len] != '/')
+ continue;
+
+ if (relocations[j].newPath) { /* Relocate the path */
+ char *t = NULL;
+ rstrscat(&t, relocations[j].newPath, (dirNames[i] + len), NULL);
+ /* Unfortunatly rpmCleanPath strips the trailing slash.. */
+ (void) rpmCleanPath(t);
+ rstrcat(&t, "/");
+
+ rpmlog(RPMLOG_DEBUG,
+ "relocating directory %s to %s\n", dirNames[i], t);
+ free(dirNames[i]);
+ dirNames[i] = t;
+ nrelocated++;
+ }
+ }
+ }
+
+ /* Save original filenames in header and replace (relocated) filenames. */
+ if (nrelocated) {
+ saveRelocs(h, &bnames, &dnames, &dindexes);
+ }
+
+ rpmtdFreeData(&bnames);
+ rpmtdFreeData(&dnames);
+ rpmtdFreeData(&dindexes);
+ rpmtdFreeData(&fmodes);
+ free(fn);
+}
+
+rpmfi rpmfiFree(rpmfi fi)
+{
+ if (fi == NULL) return NULL;
+
+ if (fi->nrefs > 1)
+ return rpmfiUnlink(fi);
+
+ if (fi->fc > 0) {
+ fi->bnl = _free(fi->bnl);
+ fi->dnl = _free(fi->dnl);
+
+ fi->flinkcache = strcacheFree(fi->flinkcache);
+ fi->flinks = _free(fi->flinks);
+ fi->flangs = _free(fi->flangs);
+ fi->digests = _free(fi->digests);
+ fi->fcapcache = strcacheFree(fi->fcapcache);
+ fi->fcaps = _free(fi->fcaps);
+
+ fi->cdict = _free(fi->cdict);
+
+ fi->fuser = _free(fi->fuser);
+ fi->fgroup = _free(fi->fgroup);
+
+ fi->fstates = _free(fi->fstates);
+ fi->fps = _free(fi->fps);
+
+ /* these point to header memory if KEEPHEADER is used, dont free */
+ if (!(fi->fiflags & RPMFI_KEEPHEADER) && fi->h == NULL) {
+ fi->fmtimes = _free(fi->fmtimes);
+ fi->fmodes = _free(fi->fmodes);
+ fi->fflags = _free(fi->fflags);
+ fi->vflags = _free(fi->vflags);
+ fi->fsizes = _free(fi->fsizes);
+ fi->frdevs = _free(fi->frdevs);
+ fi->finodes = _free(fi->finodes);
+ fi->dil = _free(fi->dil);
+
+ fi->fcolors = _free(fi->fcolors);
+ fi->fcdictx = _free(fi->fcdictx);
+ fi->ddict = _free(fi->ddict);
+ fi->fddictx = _free(fi->fddictx);
+ fi->fddictn = _free(fi->fddictn);
+
+ }
+ }
+
+ fi->fn = _free(fi->fn);
+ fi->apath = _free(fi->apath);
+
+ fi->replacedSizes = _free(fi->replacedSizes);
+
+ fi->h = headerFree(fi->h);
+
+ (void) rpmfiUnlink(fi);
+ memset(fi, 0, sizeof(*fi)); /* XXX trash and burn */
+ fi = _free(fi);
+
+ return NULL;
+}
+
+/* Helper to push header tag data into a string cache */
+static scidx_t *cacheTag(strcache cache, Header h, rpmTag tag)
+{
+ scidx_t *idx = NULL;
+ struct rpmtd_s td;
+ if (headerGet(h, tag, &td, HEADERGET_MINMEM)) {
+ idx = xmalloc(sizeof(*idx) * rpmtdCount(&td));
+ int i = 0;
+ const char *str;
+ while ((str = rpmtdNextString(&td))) {
+ idx[i++] = strcachePut(cache, str);
+ }
+ rpmtdFreeData(&td);
+ }
+ return idx;
+}
+
+#define _hgfi(_h, _tag, _td, _flags, _data) \
+ if (headerGet((_h), (_tag), (_td), (_flags))) \
+ _data = (td.data)
+
+rpmfi rpmfiNew(const rpmts ts, Header h, rpmTagVal tagN, rpmfiFlags flags)
+{
+ rpmfi fi = xcalloc(1, sizeof(*fi));
+ unsigned char * t;
+ struct rpmtd_s fdigests, digalgo;
+ struct rpmtd_s td;
+ headerGetFlags scareFlags = (flags & RPMFI_KEEPHEADER) ?
+ HEADERGET_MINMEM : HEADERGET_ALLOC;
+ headerGetFlags defFlags = HEADERGET_ALLOC;
+
+ fi->magic = RPMFIMAGIC;
+ fi->i = -1;
+
+ fi->fiflags = flags;
+
+ _hgfi(h, RPMTAG_BASENAMES, &td, defFlags, fi->bnl);
+ fi->fc = rpmtdCount(&td);
+ if (fi->fc == 0) {
+ goto exit;
+ }
+
+ _hgfi(h, RPMTAG_DIRNAMES, &td, defFlags, fi->dnl);
+ fi->dc = rpmtdCount(&td);
+ _hgfi(h, RPMTAG_DIRINDEXES, &td, scareFlags, fi->dil);
+
+ /* Is our filename triplet sane? */
+ if (fi->dc == 0 || fi->dc > fi->fc || rpmtdCount(&td) != fi->fc)
+ goto errxit;
+
+ for (rpm_count_t i = 0; i < fi->fc; i++) {
+ if (fi->dil[i] >= fi->fc)
+ goto errxit;
+ }
+
+ /* XXX TODO: all these should be sanity checked, ugh... */
+ if (!(flags & RPMFI_NOFILEMODES))
+ _hgfi(h, RPMTAG_FILEMODES, &td, scareFlags, fi->fmodes);
+ if (!(flags & RPMFI_NOFILEFLAGS))
+ _hgfi(h, RPMTAG_FILEFLAGS, &td, scareFlags, fi->fflags);
+ if (!(flags & RPMFI_NOFILEVERIFYFLAGS))
+ _hgfi(h, RPMTAG_FILEVERIFYFLAGS, &td, scareFlags, fi->vflags);
+ if (!(flags & RPMFI_NOFILESIZES))
+ _hgfi(h, RPMTAG_FILESIZES, &td, scareFlags, fi->fsizes);
+
+ if (!(flags & RPMFI_NOFILECOLORS))
+ _hgfi(h, RPMTAG_FILECOLORS, &td, scareFlags, fi->fcolors);
+
+ if (!(flags & RPMFI_NOFILECLASS)) {
+ _hgfi(h, RPMTAG_CLASSDICT, &td, scareFlags, fi->cdict);
+ fi->ncdict = rpmtdCount(&td);
+ _hgfi(h, RPMTAG_FILECLASS, &td, scareFlags, fi->fcdictx);
+ }
+ if (!(flags & RPMFI_NOFILEDEPS)) {
+ _hgfi(h, RPMTAG_DEPENDSDICT, &td, scareFlags, fi->ddict);
+ fi->nddict = rpmtdCount(&td);
+ _hgfi(h, RPMTAG_FILEDEPENDSX, &td, scareFlags, fi->fddictx);
+ _hgfi(h, RPMTAG_FILEDEPENDSN, &td, scareFlags, fi->fddictn);
+ }
+
+ if (!(flags & RPMFI_NOFILESTATES))
+ _hgfi(h, RPMTAG_FILESTATES, &td, defFlags, fi->fstates);
+
+ if (!(flags & RPMFI_NOFILECAPS) && headerIsEntry(h, RPMTAG_FILECAPS)) {
+ fi->fcapcache = strcacheNew();
+ fi->fcaps = cacheTag(fi->fcapcache, h, RPMTAG_FILECAPS);
+ }
+
+ if (!(flags & RPMFI_NOFILELINKTOS)) {
+ fi->flinkcache = strcacheNew();
+ fi->flinks = cacheTag(fi->flinkcache, h, RPMTAG_FILELINKTOS);
+ }
+ /* FILELANGS are only interesting when installing */
+ if ((headerGetInstance(h) == 0) && !(flags & RPMFI_NOFILELANGS))
+ fi->flangs = cacheTag(langcache, h, RPMTAG_FILELANGS);
+
+ /* See if the package has non-md5 file digests */
+ fi->digestalgo = PGPHASHALGO_MD5;
+ if (headerGet(h, RPMTAG_FILEDIGESTALGO, &digalgo, HEADERGET_MINMEM)) {
+ uint32_t *algo = rpmtdGetUint32(&digalgo);
+ /* Hmm, what to do with unknown digest algorithms? */
+ if (algo && rpmDigestLength(*algo) != 0) {
+ fi->digestalgo = *algo;
+ }
+ }
+
+ fi->digests = NULL;
+ /* grab hex digests from header and store in binary format */
+ if (!(flags & RPMFI_NOFILEDIGESTS) &&
+ headerGet(h, RPMTAG_FILEDIGESTS, &fdigests, HEADERGET_MINMEM)) {
+ const char *fdigest;
+ size_t diglen = rpmDigestLength(fi->digestalgo);
+ fi->digests = t = xmalloc(rpmtdCount(&fdigests) * diglen);
+
+ while ((fdigest = rpmtdNextString(&fdigests))) {
+ if (!(fdigest && *fdigest != '\0')) {
+ memset(t, 0, diglen);
+ t += diglen;
+ continue;
+ }
+ for (int j = 0; j < diglen; j++, t++, fdigest += 2)
+ *t = (rnibble(fdigest[0]) << 4) | rnibble(fdigest[1]);
+ }
+ rpmtdFreeData(&fdigests);
+ }
+
+ /* XXX TR_REMOVED doesn;t need fmtimes, frdevs, finodes */
+ if (!(flags & RPMFI_NOFILEMTIMES))
+ _hgfi(h, RPMTAG_FILEMTIMES, &td, scareFlags, fi->fmtimes);
+ if (!(flags & RPMFI_NOFILERDEVS))
+ _hgfi(h, RPMTAG_FILERDEVS, &td, scareFlags, fi->frdevs);
+ if (!(flags & RPMFI_NOFILEINODES))
+ _hgfi(h, RPMTAG_FILEINODES, &td, scareFlags, fi->finodes);
+
+ if (!(flags & RPMFI_NOFILEUSER))
+ fi->fuser = cacheTag(ugcache, h, RPMTAG_FILEUSERNAME);
+ if (!(flags & RPMFI_NOFILEGROUP))
+ fi->fgroup = cacheTag(ugcache, h, RPMTAG_FILEGROUPNAME);
+
+ /* lazily alloced from rpmfiFN() */
+ fi->fn = NULL;
+
+exit:
+
+ if (fi != NULL) {
+ fi->h = (fi->fiflags & RPMFI_KEEPHEADER) ? headerLink(h) : NULL;
+ }
+
+ /* FIX: rpmfi null annotations */
+ return rpmfiLink(fi);
+
+errxit:
+ rpmfiFree(fi);
+ return NULL;
+}
+
+void rpmfiSetFReplacedSizeIndex(rpmfi fi, int ix, rpm_loff_t newsize)
+{
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->replacedSizes == NULL) {
+ fi->replacedSizes = xcalloc(fi->fc, sizeof(*fi->replacedSizes));
+ }
+ /* XXX watch out, replacedSizes is not rpm_loff_t (yet) */
+ fi->replacedSizes[ix] = (rpm_off_t) newsize;
+ }
+}
+
+rpm_loff_t rpmfiFReplacedSizeIndex(rpmfi fi, int ix)
+{
+ rpm_loff_t rsize = 0;
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->replacedSizes) {
+ rsize = fi->replacedSizes[ix];
+ }
+ }
+ return rsize;
+}
+
+void rpmfiFpLookup(rpmfi fi, fingerPrintCache fpc)
+{
+ if (fi->fc > 0 && fi->fps == NULL) {
+ fi->fps = xcalloc(fi->fc, sizeof(*fi->fps));
+ }
+ fpLookupList(fpc, fi->dnl, fi->bnl, fi->dil, fi->fc, fi->fps);
+}
+
+/*
+ * Generate iterator accessors function wrappers, these do nothing but
+ * call the corresponding rpmfiFooIndex(fi, fi->[ij])
+ */
+
+#define RPMFI_ITERFUNC(TYPE, NAME, IXV) \
+ TYPE rpmfi ## NAME(rpmfi fi) { return rpmfi ## NAME ## Index(fi, fi ? fi->IXV : -1); }
+
+RPMFI_ITERFUNC(const char *, BN, i)
+RPMFI_ITERFUNC(const char *, DN, j)
+RPMFI_ITERFUNC(const char *, FLink, i)
+RPMFI_ITERFUNC(const char *, FUser, i)
+RPMFI_ITERFUNC(const char *, FGroup, i)
+RPMFI_ITERFUNC(const char *, FCaps, i)
+RPMFI_ITERFUNC(const char *, FLangs, i)
+RPMFI_ITERFUNC(const char *, FClass, i)
+RPMFI_ITERFUNC(rpmfileState, FState, i)
+RPMFI_ITERFUNC(rpmfileAttrs, FFlags, i)
+RPMFI_ITERFUNC(rpmVerifyAttrs, VFlags, i)
+RPMFI_ITERFUNC(rpm_mode_t, FMode, i)
+RPMFI_ITERFUNC(rpm_rdev_t, FRdev, i)
+RPMFI_ITERFUNC(rpm_time_t, FMtime, i)
+RPMFI_ITERFUNC(rpm_ino_t, FInode, i)
+RPMFI_ITERFUNC(rpm_loff_t, FSize, i)
+RPMFI_ITERFUNC(rpm_color_t, FColor, i)
+RPMFI_ITERFUNC(uint32_t, FNlink, i)
+
+const char * rpmfiFN(rpmfi fi)
+{
+ const char *fn = ""; /* preserve behavior on errors */
+ if (fi != NULL) {
+ free(fi->fn);
+ fi->fn = rpmfiFNIndex(fi, fi->i);
+ if (fi->fn != NULL)
+ fn = fi->fn;
+ }
+ return fn;
+}
+
+const unsigned char * rpmfiFDigest(rpmfi fi, int *algo, size_t *len)
+{
+ return rpmfiFDigestIndex(fi, fi ? fi->i : -1, algo, len);
+}
+
+uint32_t rpmfiFDepends(rpmfi fi, const uint32_t ** fddictp)
+{
+ return rpmfiFDependsIndex(fi, fi ? fi->i : -1, fddictp);
+}
+
+int rpmfiCompare(const rpmfi afi, const rpmfi bfi)
+{
+ return rpmfiCompareIndex(afi, afi ? afi->i : -1, bfi, bfi ? bfi->i : -1);
+}
+
+rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing)
+{
+ return rpmfiDecideFateIndex(ofi, ofi ? ofi->i : -1,
+ nfi, nfi ? nfi->i : -1,
+ skipMissing);
+}
+
+int rpmfiConfigConflict(const rpmfi fi)
+{
+ return rpmfiConfigConflictIndex(fi, fi ? fi->i : -1);
+}
--- /dev/null
+/** \ingroup rpmdep
+ * \file lib/rpmfi.c
+ * Routines to handle file info tag sets.
+ */
+
+#include "system.h"
+
+#include <rpm/rpmlog.h>
+#include <rpm/rpmts.h>
+#include <rpm/rpmfileutil.h> /* XXX rpmDoDigest */
+#include <rpm/rpmstring.h>
+#include <rpm/rpmmacro.h> /* XXX rpmCleanPath */
+#include <rpm/rpmds.h>
+
+#include "lib/rpmfi_internal.h"
+#include "lib/rpmte_internal.h" /* relocations */
+#include "lib/cpio.h" /* XXX CPIO_FOO */
+
+#include "debug.h"
+
+/*
+ * Simple and stupid string "cache."
+ * Store each unique string just once, retrieve by index value.
+ * For data where number of unique names is typically very low,
+ * the dumb linear lookup appears to be fast enough and hash table seems
+ * like an overkill.
+ */
+struct strcache_s {
+ char **uniq;
+ scidx_t num;
+};
+
+static struct strcache_s _ugcache = { NULL, 0 };
+static strcache ugcache = &_ugcache;
+static struct strcache_s _langcache = { NULL, 0 };
+static strcache langcache = &_langcache;
+
+static scidx_t strcachePut(strcache cache, const char *str)
+{
+ int found = 0;
+ scidx_t ret;
+
+ for (scidx_t i = 0; i < cache->num; i++) {
+ if (rstreq(str, cache->uniq[i])) {
+ ret = i;
+ found = 1;
+ break;
+ }
+ }
+ if (!found) {
+ /* blow up on index wraparound */
+ assert((scidx_t)(cache->num + 1) > cache->num);
+ cache->uniq = xrealloc(cache->uniq,
+ sizeof(*cache->uniq) * (cache->num+1));
+ cache->uniq[cache->num] = xstrdup(str);
+ ret = cache->num;
+ cache->num++;
+ }
+ return ret;
+}
+
+static const char *strcacheGet(strcache cache, scidx_t idx)
+{
+ const char *name = NULL;
+ if (idx >= 0 && idx < cache->num && cache->uniq != NULL)
+ name = cache->uniq[idx];
+ return name;
+}
+
+static strcache strcacheNew(void)
+{
+ strcache cache = xcalloc(1, sizeof(*cache));
+ return cache;
+}
+
+static strcache strcacheFree(strcache cache)
+{
+ if (cache != NULL) {
+ for (scidx_t i = 0; i < cache->num; i++) {
+ free(cache->uniq[i]);
+ }
+ cache->uniq = _free(cache->uniq);
+ free(cache);
+ }
+ return NULL;
+}
+
+static rpmfi rpmfiUnlink(rpmfi fi)
+{
+ if (fi)
+ fi->nrefs--;
+ return NULL;
+}
+
+rpmfi rpmfiLink(rpmfi fi)
+{
+ if (fi)
+ fi->nrefs++;
+ return fi;
+}
+
+rpm_count_t rpmfiFC(rpmfi fi)
+{
+ return (fi != NULL ? fi->fc : 0);
+}
+
+rpm_count_t rpmfiDC(rpmfi fi)
+{
+ return (fi != NULL ? fi->dc : 0);
+}
+
+#ifdef NOTYET
+int rpmfiDI(rpmfi fi)
+{
+}
+#endif
+
+int rpmfiFX(rpmfi fi)
+{
+ return (fi != NULL ? fi->i : -1);
+}
+
+int rpmfiSetFX(rpmfi fi, int fx)
+{
+ int i = -1;
+
+ if (fi != NULL && fx >= 0 && fx < fi->fc) {
+ i = fi->i;
+ fi->i = fx;
+ fi->j = fi->dil[fi->i];
+ }
+ return i;
+}
+
+int rpmfiDX(rpmfi fi)
+{
+ return (fi != NULL ? fi->j : -1);
+}
+
+int rpmfiSetDX(rpmfi fi, int dx)
+{
+ int j = -1;
+
+ if (fi != NULL && dx >= 0 && dx < fi->dc) {
+ j = fi->j;
+ fi->j = dx;
+ }
+ return j;
+}
+
+int rpmfiDIIndex(rpmfi fi, int dx)
+{
+ int j = -1;
+ if (fi != NULL && dx >= 0 && dx < fi->fc) {
+ if (fi->dil != NULL)
+ j = fi->dil[dx];
+ }
+ return j;
+}
+
+const char * rpmfiBNIndex(rpmfi fi, int ix)
+{
+ const char * BN = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->bnl != NULL)
+ BN = fi->bnl[ix];
+ }
+ return BN;
+}
+
+const char * rpmfiDNIndex(rpmfi fi, int jx)
+{
+ const char * DN = NULL;
+
+ if (fi != NULL && jx >= 0 && jx < fi->dc) {
+ if (fi->dnl != NULL)
+ DN = fi->dnl[jx];
+ }
+ return DN;
+}
+
+char * rpmfiFNIndex(rpmfi fi, int ix)
+{
+ char *fn = NULL;
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ fn = rstrscat(NULL, fi->dnl[fi->dil[ix]], fi->bnl[ix], NULL);
+ }
+ return fn;
+}
+
+rpmfileAttrs rpmfiFFlagsIndex(rpmfi fi, int ix)
+{
+ rpmfileAttrs FFlags = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fflags != NULL)
+ FFlags = fi->fflags[ix];
+ }
+ return FFlags;
+}
+
+rpmVerifyAttrs rpmfiVFlagsIndex(rpmfi fi, int ix)
+{
+ rpmVerifyAttrs VFlags = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->vflags != NULL)
+ VFlags = fi->vflags[ix];
+ }
+ return VFlags;
+}
+
+rpm_mode_t rpmfiFModeIndex(rpmfi fi, int ix)
+{
+ rpm_mode_t fmode = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fmodes != NULL)
+ fmode = fi->fmodes[ix];
+ }
+ return fmode;
+}
+
+rpmfileState rpmfiFStateIndex(rpmfi fi, int ix)
+{
+ rpmfileState fstate = RPMFILE_STATE_MISSING;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fstates != NULL)
+ fstate = fi->fstates[ix];
+ }
+ return fstate;
+}
+
+const unsigned char * rpmfiMD5(rpmfi fi)
+{
+ const unsigned char *digest;
+ int algo = 0;
+
+ digest = rpmfiFDigest(fi, &algo, NULL);
+ return (algo == PGPHASHALGO_MD5) ? digest : NULL;
+}
+
+int rpmfiDigestAlgo(rpmfi fi)
+{
+ return fi ? fi->digestalgo : 0;
+}
+
+const unsigned char * rpmfiFDigestIndex(rpmfi fi, int ix, int *algo, size_t *len)
+{
+ const unsigned char *digest = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ size_t diglen = rpmDigestLength(fi->digestalgo);
+ if (fi->digests != NULL)
+ digest = fi->digests + (diglen * ix);
+ if (len)
+ *len = diglen;
+ if (algo)
+ *algo = fi->digestalgo;
+ }
+ return digest;
+}
+
+char * rpmfiFDigestHex(rpmfi fi, int *algo)
+{
+ size_t diglen = 0;
+ char *fdigest = NULL;
+ const unsigned char *digest = rpmfiFDigest(fi, algo, &diglen);
+ if (digest) {
+ fdigest = pgpHexStr(digest, diglen);
+ }
+ return fdigest;
+}
+
+const char * rpmfiFLinkIndex(rpmfi fi, int ix)
+{
+ const char * flink = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->flinks != NULL)
+ flink = strcacheGet(fi->flinkcache, fi->flinks[ix]);
+ }
+ return flink;
+}
+
+rpm_loff_t rpmfiFSizeIndex(rpmfi fi, int ix)
+{
+ rpm_loff_t fsize = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fsizes != NULL)
+ fsize = fi->fsizes[ix];
+ }
+ return fsize;
+}
+
+rpm_rdev_t rpmfiFRdevIndex(rpmfi fi, int ix)
+{
+ rpm_rdev_t frdev = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->frdevs != NULL)
+ frdev = fi->frdevs[ix];
+ }
+ return frdev;
+}
+
+rpm_ino_t rpmfiFInodeIndex(rpmfi fi, int ix)
+{
+ rpm_ino_t finode = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->finodes != NULL)
+ finode = fi->finodes[ix];
+ }
+ return finode;
+}
+
+rpm_color_t rpmfiColor(rpmfi fi)
+{
+ rpm_color_t color = 0;
+
+ if (fi != NULL && fi->fcolors != NULL) {
+ for (int i = 0; i < fi->fc; i++)
+ color |= fi->fcolors[i];
+ /* XXX ignore all but lsnibble for now. */
+ color &= 0xf;
+ }
+ return color;
+}
+
+rpm_color_t rpmfiFColorIndex(rpmfi fi, int ix)
+{
+ rpm_color_t fcolor = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fcolors != NULL)
+ /* XXX ignore all but lsnibble for now. */
+ fcolor = (fi->fcolors[ix] & 0x0f);
+ }
+ return fcolor;
+}
+
+const char * rpmfiFClassIndex(rpmfi fi, int ix)
+{
+ const char * fclass = NULL;
+ int cdictx;
+
+ if (fi != NULL && fi->fcdictx != NULL && ix >= 0 && ix < fi->fc) {
+ cdictx = fi->fcdictx[ix];
+ if (fi->cdict != NULL && cdictx >= 0 && cdictx < fi->ncdict)
+ fclass = fi->cdict[cdictx];
+ }
+ return fclass;
+}
+
+uint32_t rpmfiFDependsIndex(rpmfi fi, int ix, const uint32_t ** fddictp)
+{
+ int fddictx = -1;
+ int fddictn = 0;
+ const uint32_t * fddict = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fddictn != NULL)
+ fddictn = fi->fddictn[ix];
+ if (fddictn > 0 && fi->fddictx != NULL)
+ fddictx = fi->fddictx[ix];
+ if (fi->ddict != NULL && fddictx >= 0 && (fddictx+fddictn) <= fi->nddict)
+ fddict = fi->ddict + fddictx;
+ }
+ if (fddictp)
+ *fddictp = fddict;
+ return fddictn;
+}
+
+uint32_t rpmfiFNlinkIndex(rpmfi fi, int ix)
+{
+ uint32_t nlink = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ /* XXX rpm-2.3.12 has not RPMTAG_FILEINODES */
+ if (fi->finodes && fi->frdevs) {
+ rpm_ino_t finode = fi->finodes[ix];
+ rpm_rdev_t frdev = fi->frdevs[ix];
+ int j;
+
+ for (j = 0; j < fi->fc; j++) {
+ if (fi->frdevs[j] == frdev && fi->finodes[j] == finode)
+ nlink++;
+ }
+ }
+ }
+ return nlink;
+}
+
+rpm_time_t rpmfiFMtimeIndex(rpmfi fi, int ix)
+{
+ rpm_time_t fmtime = 0;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fmtimes != NULL)
+ fmtime = fi->fmtimes[ix];
+ }
+ return fmtime;
+}
+
+const char * rpmfiFUserIndex(rpmfi fi, int ix)
+{
+ const char * fuser = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fuser != NULL)
+ fuser = strcacheGet(ugcache, fi->fuser[ix]);
+ }
+ return fuser;
+}
+
+const char * rpmfiFGroupIndex(rpmfi fi, int ix)
+{
+ const char * fgroup = NULL;
+
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fgroup != NULL)
+ fgroup = strcacheGet(ugcache, fi->fgroup[ix]);
+ }
+ return fgroup;
+}
+
+const char * rpmfiFCapsIndex(rpmfi fi, int ix)
+{
+ const char *fcaps = NULL;
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ fcaps = fi->fcapcache ? strcacheGet(fi->fcapcache, fi->fcaps[ix]) : "";
+ }
+ return fcaps;
+}
+
+const char * rpmfiFLangsIndex(rpmfi fi, int ix)
+{
+ const char *flangs = NULL;
+ if (fi != NULL && fi->flangs != NULL && ix >= 0 && ix < fi->fc) {
+ flangs = strcacheGet(langcache, fi->flangs[ix]);
+ }
+ return flangs;
+}
+
+struct fingerPrint_s *rpmfiFpsIndex(rpmfi fi, int ix)
+{
+ struct fingerPrint_s * fps = NULL;
+ if (fi != NULL && fi->fps != NULL && ix >= 0 && ix < fi->fc) {
+ fps = fi->fps + ix;
+ }
+ return fps;
+}
+
+int rpmfiNext(rpmfi fi)
+{
+ int i = -1;
+
+ if (fi != NULL && ++fi->i >= 0) {
+ if (fi->i < fi->fc) {
+ i = fi->i;
+ if (fi->dil != NULL)
+ fi->j = fi->dil[fi->i];
+ } else
+ fi->i = -1;
+ }
+
+ return i;
+}
+
+rpmfi rpmfiInit(rpmfi fi, int fx)
+{
+ if (fi != NULL) {
+ if (fx >= 0 && fx < fi->fc) {
+ fi->i = fx - 1;
+ fi->j = -1;
+ }
+ }
+
+ return fi;
+}
+
+int rpmfiNextD(rpmfi fi)
+{
+ int j = -1;
+
+ if (fi != NULL && ++fi->j >= 0) {
+ if (fi->j < fi->dc)
+ j = fi->j;
+ else
+ fi->j = -1;
+ }
+
+ return j;
+}
+
+rpmfi rpmfiInitD(rpmfi fi, int dx)
+{
+ if (fi != NULL) {
+ if (dx >= 0 && dx < fi->fc)
+ fi->j = dx - 1;
+ else
+ fi = NULL;
+ }
+
+ return fi;
+}
+
+/**
+ * Identify a file type.
+ * @param ft file type
+ * @return string to identify a file type
+ */
+static
+const char * ftstring (rpmFileTypes ft)
+{
+ switch (ft) {
+ case XDIR: return "directory";
+ case CDEV: return "char dev";
+ case BDEV: return "block dev";
+ case LINK: return "link";
+ case SOCK: return "sock";
+ case PIPE: return "fifo/pipe";
+ case REG: return "file";
+ default: return "unknown file type";
+ }
+}
+
+rpmFileTypes rpmfiWhatis(rpm_mode_t mode)
+{
+ if (S_ISDIR(mode)) return XDIR;
+ if (S_ISCHR(mode)) return CDEV;
+ if (S_ISBLK(mode)) return BDEV;
+ if (S_ISLNK(mode)) return LINK;
+ if (S_ISSOCK(mode)) return SOCK;
+ if (S_ISFIFO(mode)) return PIPE;
+ return REG;
+}
+
+int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix)
+{
+ rpmFileTypes awhat = rpmfiWhatis(rpmfiFModeIndex(afi, aix));
+ rpmFileTypes bwhat = rpmfiWhatis(rpmfiFModeIndex(bfi, bix));
+
+ if ((rpmfiFFlagsIndex(afi, aix) & RPMFILE_GHOST) ||
+ (rpmfiFFlagsIndex(bfi, bix) & RPMFILE_GHOST)) return 0;
+
+ if (awhat != bwhat) return 1;
+
+ if (awhat == LINK) {
+ const char * alink = rpmfiFLinkIndex(afi, aix);
+ const char * blink = rpmfiFLinkIndex(bfi, bix);
+ if (alink == blink) return 0;
+ if (alink == NULL) return 1;
+ if (blink == NULL) return -1;
+ return strcmp(alink, blink);
+ } else if (awhat == REG) {
+ size_t adiglen, bdiglen;
+ int aalgo, balgo;
+ const unsigned char * adigest, * bdigest;
+ adigest = rpmfiFDigestIndex(afi, aix, &aalgo, &adiglen);
+ bdigest = rpmfiFDigestIndex(bfi, bix, &balgo, &bdiglen);
+ if (adigest == bdigest) return 0;
+ if (adigest == NULL) return 1;
+ if (bdigest == NULL) return -1;
+ /* can't meaningfully compare different hash types */
+ if (aalgo != balgo || adiglen != bdiglen) return -1;
+ return memcmp(adigest, bdigest, adiglen);
+ } else if (awhat == CDEV || awhat == BDEV) {
+ if (rpmfiFRdevIndex(afi, aix) != rpmfiFRdevIndex(bfi, bix))
+ return 1;
+ }
+
+ return 0;
+}
+
+rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix,
+ int skipMissing)
+{
+ char * fn = rpmfiFNIndex(nfi, nix);
+ rpmfileAttrs newFlags = rpmfiFFlagsIndex(nfi, nix);
+ char buffer[1024];
+ rpmFileTypes dbWhat, newWhat, diskWhat;
+ struct stat sb;
+ int save = (newFlags & RPMFILE_NOREPLACE) ? FA_ALTNAME : FA_SAVE;
+ int action = FA_CREATE; /* assume we can create */
+
+ if (lstat(fn, &sb)) {
+ /*
+ * The file doesn't exist on the disk. Create it unless the new
+ * package has marked it as missingok, or allfiles is requested.
+ */
+ if (skipMissing && (newFlags & RPMFILE_MISSINGOK)) {
+ rpmlog(RPMLOG_DEBUG, "%s skipped due to missingok flag\n",
+ fn);
+ action = FA_SKIP;
+ }
+ goto exit;
+ }
+
+ diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode);
+ dbWhat = rpmfiWhatis(rpmfiFModeIndex(ofi, oix));
+ newWhat = rpmfiWhatis(rpmfiFModeIndex(nfi, nix));
+
+ /*
+ * RPM >= 2.3.10 shouldn't create config directories -- we'll ignore
+ * them in older packages as well.
+ */
+ if (newWhat == XDIR)
+ goto exit;
+
+ if (diskWhat != newWhat && dbWhat != REG && dbWhat != LINK) {
+ action = save;
+ goto exit;
+ } else if (newWhat != dbWhat && diskWhat != dbWhat) {
+ action = save;
+ goto exit;
+ } else if (dbWhat != newWhat) {
+ goto exit;
+ } else if (dbWhat != LINK && dbWhat != REG) {
+ goto exit;
+ }
+
+ /*
+ * This order matters - we'd prefer to CREATE the file if at all
+ * possible in case something else (like the timestamp) has changed.
+ */
+ memset(buffer, 0, sizeof(buffer));
+ if (dbWhat == REG) {
+ int oalgo, nalgo;
+ size_t odiglen, ndiglen;
+ const unsigned char * odigest, * ndigest;
+ odigest = rpmfiFDigestIndex(ofi, oix, &oalgo, &odiglen);
+ if (diskWhat == REG) {
+ if (rpmDoDigest(oalgo, fn, 0, (unsigned char *)buffer, NULL))
+ goto exit; /* assume file has been removed */
+ if (odigest && !memcmp(odigest, buffer, odiglen))
+ goto exit; /* unmodified config file, replace. */
+ }
+ ndigest = rpmfiFDigestIndex(nfi, nix, &nalgo, &ndiglen);
+ /* Can't compare different hash types, backup to avoid data loss */
+ if (oalgo != nalgo || odiglen != ndiglen) {
+ action = save;
+ goto exit;
+ }
+ if (odigest && ndigest && !memcmp(odigest, ndigest, odiglen)) {
+ action = FA_SKIP; /* identical file, don't bother. */
+ goto exit;
+ }
+ /* ... but otherwise backup will be needed */
+ action = save;
+ } else /* dbWhat == LINK */ {
+ const char * oFLink, * nFLink;
+ oFLink = rpmfiFLinkIndex(ofi, oix);
+ if (diskWhat == LINK) {
+ ssize_t link_len = readlink(fn, buffer, sizeof(buffer) - 1);
+ if (link_len == -1)
+ goto exit; /* assume file has been removed */
+ buffer[link_len] = '\0';
+ if (oFLink && rstreq(oFLink, buffer))
+ goto exit; /* unmodified config file, replace. */
+ }
+ nFLink = rpmfiFLinkIndex(nfi, nix);
+ if (oFLink && nFLink && rstreq(oFLink, nFLink)) {
+ action = FA_SKIP; /* identical file, don't bother. */
+ goto exit;
+ }
+ /* ... but otherwise backup will be needed */
+ action = save;
+ }
+
+exit:
+ free(fn);
+ return action;
+}
+
+int rpmfiConfigConflictIndex(rpmfi fi, int ix)
+{
+ char * fn = NULL;
+ rpmfileAttrs flags = rpmfiFFlagsIndex(fi, ix);
+ char buffer[1024];
+ rpmFileTypes newWhat, diskWhat;
+ struct stat sb;
+ int rc = 0;
+
+ if (!(flags & RPMFILE_CONFIG))
+ return 0;
+
+ /* Only links and regular files can be %config, this is kinda moot */
+ /* XXX: Why are we returning 1 here? */
+ newWhat = rpmfiWhatis(rpmfiFModeIndex(fi, ix));
+ if (newWhat != LINK && newWhat != REG)
+ return 1;
+
+ /* If it's not on disk, there's nothing to be saved */
+ fn = rpmfiFNIndex(fi, ix);
+ if (lstat(fn, &sb))
+ goto exit;
+
+ /* Files of different types obviously are not identical */
+ diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode);
+ if (diskWhat != newWhat) {
+ rc = 1;
+ goto exit;
+ }
+
+ memset(buffer, 0, sizeof(buffer));
+ if (newWhat == REG) {
+ int algo;
+ size_t diglen;
+ const unsigned char *ndigest = rpmfiFDigestIndex(fi,ix, &algo, &diglen);
+ if (rpmDoDigest(algo, fn, 0, (unsigned char *)buffer, NULL))
+ goto exit; /* assume file has been removed */
+ if (ndigest && !memcmp(ndigest, buffer, diglen))
+ goto exit; /* unmodified config file */
+ } else /* newWhat == LINK */ {
+ const char * nFLink;
+ ssize_t link_len = readlink(fn, buffer, sizeof(buffer) - 1);
+ if (link_len == -1)
+ goto exit; /* assume file has been removed */
+ buffer[link_len] = '\0';
+ nFLink = rpmfiFLinkIndex(fi, ix);
+ if (nFLink && rstreq(nFLink, buffer))
+ goto exit; /* unmodified config file */
+ }
+
+ rc = 1;
+
+exit:
+ free(fn);
+ return rc;
+}
+
+static char **duparray(char ** src, int size)
+{
+ char **dest = xmalloc((size+1) * sizeof(*dest));
+ for (int i = 0; i < size; i++) {
+ dest[i] = xstrdup(src[i]);
+ }
+ free(src);
+ return dest;
+}
+
+static int addPrefixes(Header h, rpmRelocation *relocations, int numRelocations)
+{
+ struct rpmtd_s validRelocs;
+ const char *validprefix;
+ const char ** actualRelocations;
+ int numActual = 0;
+
+ headerGet(h, RPMTAG_PREFIXES, &validRelocs, HEADERGET_MINMEM);
+ /*
+ * If no relocations are specified (usually the case), then return the
+ * original header. If there are prefixes, however, then INSTPREFIXES
+ * should be added for RPM_INSTALL_PREFIX environ variables in scriptlets,
+ * but, since relocateFileList() can be called more than once for
+ * the same header, don't bother if already present.
+ */
+ if (relocations == NULL || numRelocations == 0) {
+ if (rpmtdCount(&validRelocs) > 0) {
+ if (!headerIsEntry(h, RPMTAG_INSTPREFIXES)) {
+ rpmtdSetTag(&validRelocs, RPMTAG_INSTPREFIXES);
+ headerPut(h, &validRelocs, HEADERPUT_DEFAULT);
+ }
+ rpmtdFreeData(&validRelocs);
+ }
+ return 0;
+ }
+
+ actualRelocations = xmalloc(rpmtdCount(&validRelocs) * sizeof(*actualRelocations));
+ rpmtdInit(&validRelocs);
+ while ((validprefix = rpmtdNextString(&validRelocs))) {
+ int j;
+ for (j = 0; j < numRelocations; j++) {
+ if (relocations[j].oldPath == NULL || /* XXX can't happen */
+ !rstreq(validprefix, relocations[j].oldPath))
+ continue;
+ /* On install, a relocate to NULL means skip the path. */
+ if (relocations[j].newPath) {
+ actualRelocations[numActual] = relocations[j].newPath;
+ numActual++;
+ }
+ break;
+ }
+ if (j == numRelocations) {
+ actualRelocations[numActual] = validprefix;
+ numActual++;
+ }
+ }
+ rpmtdFreeData(&validRelocs);
+
+ if (numActual) {
+ headerPutStringArray(h, RPMTAG_INSTPREFIXES, actualRelocations, numActual);
+ }
+ free(actualRelocations);
+ return numActual;
+}
+
+static void saveRelocs(Header h, rpmtd bnames, rpmtd dnames, rpmtd dindexes)
+{
+ struct rpmtd_s td;
+ headerGet(h, RPMTAG_BASENAMES, &td, HEADERGET_MINMEM);
+ rpmtdSetTag(&td, RPMTAG_ORIGBASENAMES);
+ headerPut(h, &td, HEADERPUT_DEFAULT);
+ rpmtdFreeData(&td);
+
+ headerGet(h, RPMTAG_DIRNAMES, &td, HEADERGET_MINMEM);
+ rpmtdSetTag(&td, RPMTAG_ORIGDIRNAMES);
+ headerPut(h, &td, HEADERPUT_DEFAULT);
+ rpmtdFreeData(&td);
+
+ headerGet(h, RPMTAG_DIRINDEXES, &td, HEADERGET_MINMEM);
+ rpmtdSetTag(&td, RPMTAG_ORIGDIRINDEXES);
+ headerPut(h, &td, HEADERPUT_DEFAULT);
+ rpmtdFreeData(&td);
+
+ headerMod(h, bnames);
+ headerMod(h, dnames);
+ headerMod(h, dindexes);
+}
+
+void rpmRelocateFileList(rpmRelocation *relocations, int numRelocations,
+ rpmfs fs, Header h)
+{
+ static int _printed = 0;
+ char ** baseNames;
+ char ** dirNames;
+ uint32_t * dirIndexes;
+ rpm_count_t fileCount, dirCount;
+ int nrelocated = 0;
+ int fileAlloced = 0;
+ char * fn = NULL;
+ int haveRelocatedBase = 0;
+ size_t maxlen = 0;
+ int i, j;
+ struct rpmtd_s bnames, dnames, dindexes, fmodes;
+
+ addPrefixes(h, relocations, numRelocations);
+
+ if (!_printed) {
+ _printed = 1;
+ rpmlog(RPMLOG_DEBUG, "========== relocations\n");
+ for (i = 0; i < numRelocations; i++) {
+ if (relocations[i].oldPath == NULL) continue; /* XXX can't happen */
+ if (relocations[i].newPath == NULL)
+ rpmlog(RPMLOG_DEBUG, "%5d exclude %s\n",
+ i, relocations[i].oldPath);
+ else
+ rpmlog(RPMLOG_DEBUG, "%5d relocate %s -> %s\n",
+ i, relocations[i].oldPath, relocations[i].newPath);
+ }
+ }
+
+ for (i = 0; i < numRelocations; i++) {
+ if (relocations[i].newPath == NULL) continue;
+ size_t len = strlen(relocations[i].newPath);
+ if (len > maxlen) maxlen = len;
+ }
+
+ headerGet(h, RPMTAG_BASENAMES, &bnames, HEADERGET_MINMEM);
+ headerGet(h, RPMTAG_DIRINDEXES, &dindexes, HEADERGET_ALLOC);
+ headerGet(h, RPMTAG_DIRNAMES, &dnames, HEADERGET_MINMEM);
+ headerGet(h, RPMTAG_FILEMODES, &fmodes, HEADERGET_MINMEM);
+ /* TODO XXX ugh.. use rpmtd iterators & friends instead */
+ baseNames = bnames.data;
+ dirIndexes = dindexes.data;
+ fileCount = rpmtdCount(&bnames);
+ dirCount = rpmtdCount(&dnames);
+ /* XXX TODO: use rpmtdDup() instead */
+ dirNames = dnames.data = duparray(dnames.data, dirCount);
+ dnames.flags |= RPMTD_PTR_ALLOCED;
+
+ /*
+ * For all relocations, we go through sorted file/relocation lists
+ * backwards so that /usr/local relocations take precedence over /usr
+ * ones.
+ */
+
+ /* Relocate individual paths. */
+
+ for (i = fileCount - 1; i >= 0; i--) {
+ rpmFileTypes ft;
+ int fnlen;
+
+ size_t len = maxlen +
+ strlen(dirNames[dirIndexes[i]]) + strlen(baseNames[i]) + 1;
+ if (len >= fileAlloced) {
+ fileAlloced = len * 2;
+ fn = xrealloc(fn, fileAlloced);
+ }
+
+assert(fn != NULL); /* XXX can't happen */
+ *fn = '\0';
+ fnlen = stpcpy( stpcpy(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn;
+
+ /*
+ * See if this file path needs relocating.
+ */
+ /*
+ * XXX FIXME: Would a bsearch of the (already sorted)
+ * relocation list be a good idea?
+ */
+ for (j = numRelocations - 1; j >= 0; j--) {
+ if (relocations[j].oldPath == NULL) /* XXX can't happen */
+ continue;
+ len = !rstreq(relocations[j].oldPath, "/")
+ ? strlen(relocations[j].oldPath)
+ : 0;
+
+ if (fnlen < len)
+ continue;
+ /*
+ * Only subdirectories or complete file paths may be relocated. We
+ * don't check for '\0' as our directory names all end in '/'.
+ */
+ if (!(fn[len] == '/' || fnlen == len))
+ continue;
+
+ if (!rstreqn(relocations[j].oldPath, fn, len))
+ continue;
+ break;
+ }
+ if (j < 0) continue;
+
+ rpmtdSetIndex(&fmodes, i);
+ ft = rpmfiWhatis(rpmtdGetNumber(&fmodes));
+
+ /* On install, a relocate to NULL means skip the path. */
+ if (relocations[j].newPath == NULL) {
+ if (ft == XDIR) {
+ /* Start with the parent, looking for directory to exclude. */
+ for (j = dirIndexes[i]; j < dirCount; j++) {
+ len = strlen(dirNames[j]) - 1;
+ while (len > 0 && dirNames[j][len-1] == '/') len--;
+ if (fnlen != len)
+ continue;
+ if (!rstreqn(fn, dirNames[j], fnlen))
+ continue;
+ break;
+ }
+ }
+ rpmfsSetAction(fs, i, FA_SKIPNSTATE);
+ rpmlog(RPMLOG_DEBUG, "excluding %s %s\n",
+ ftstring(ft), fn);
+ continue;
+ }
+
+ /* Relocation on full paths only, please. */
+ if (fnlen != len) continue;
+
+ rpmlog(RPMLOG_DEBUG, "relocating %s to %s\n",
+ fn, relocations[j].newPath);
+ nrelocated++;
+
+ strcpy(fn, relocations[j].newPath);
+ { char * te = strrchr(fn, '/');
+ if (te) {
+ if (te > fn) te++; /* root is special */
+ fnlen = te - fn;
+ } else
+ te = fn + strlen(fn);
+ if (!rstreq(baseNames[i], te)) { /* basename changed too? */
+ if (!haveRelocatedBase) {
+ /* XXX TODO: use rpmtdDup() instead */
+ bnames.data = baseNames = duparray(baseNames, fileCount);
+ bnames.flags |= RPMTD_PTR_ALLOCED;
+ haveRelocatedBase = 1;
+ }
+ free(baseNames[i]);
+ baseNames[i] = xstrdup(te);
+ }
+ *te = '\0'; /* terminate new directory name */
+ }
+
+ /* Does this directory already exist in the directory list? */
+ for (j = 0; j < dirCount; j++) {
+ if (fnlen != strlen(dirNames[j]))
+ continue;
+ if (!rstreqn(fn, dirNames[j], fnlen))
+ continue;
+ break;
+ }
+
+ if (j < dirCount) {
+ dirIndexes[i] = j;
+ continue;
+ }
+
+ /* Creating new paths is a pita */
+ dirNames = dnames.data = xrealloc(dnames.data,
+ sizeof(*dirNames) * (dirCount + 1));
+
+ dirNames[dirCount] = xstrdup(fn);
+ dirIndexes[i] = dirCount;
+ dirCount++;
+ dnames.count++;
+ }
+
+ /* Finish off by relocating directories. */
+ for (i = dirCount - 1; i >= 0; i--) {
+ for (j = numRelocations - 1; j >= 0; j--) {
+
+ if (relocations[j].oldPath == NULL) /* XXX can't happen */
+ continue;
+ size_t len = !rstreq(relocations[j].oldPath, "/")
+ ? strlen(relocations[j].oldPath)
+ : 0;
+
+ if (len && !rstreqn(relocations[j].oldPath, dirNames[i], len))
+ continue;
+
+ /*
+ * Only subdirectories or complete file paths may be relocated. We
+ * don't check for '\0' as our directory names all end in '/'.
+ */
+ if (dirNames[i][len] != '/')
+ continue;
+
+ if (relocations[j].newPath) { /* Relocate the path */
+ char *t = NULL;
+ rstrscat(&t, relocations[j].newPath, (dirNames[i] + len), NULL);
+ /* Unfortunatly rpmCleanPath strips the trailing slash.. */
+ (void) rpmCleanPath(t);
+ rstrcat(&t, "/");
+
+ rpmlog(RPMLOG_DEBUG,
+ "relocating directory %s to %s\n", dirNames[i], t);
+ free(dirNames[i]);
+ dirNames[i] = t;
+ nrelocated++;
+ }
+ }
+ }
+
+ /* Save original filenames in header and replace (relocated) filenames. */
+ if (nrelocated) {
+ saveRelocs(h, &bnames, &dnames, &dindexes);
+ }
+
+ rpmtdFreeData(&bnames);
+ rpmtdFreeData(&dnames);
+ rpmtdFreeData(&dindexes);
+ rpmtdFreeData(&fmodes);
+ free(fn);
+}
+
+rpmfi rpmfiFree(rpmfi fi)
+{
+ if (fi == NULL) return NULL;
+
+ if (fi->nrefs > 1)
+ return rpmfiUnlink(fi);
+
+ if (fi->fc > 0) {
+ fi->bnl = _free(fi->bnl);
+ fi->dnl = _free(fi->dnl);
+
+ fi->flinkcache = strcacheFree(fi->flinkcache);
+ fi->flinks = _free(fi->flinks);
+ fi->flangs = _free(fi->flangs);
+ fi->digests = _free(fi->digests);
+ fi->fcapcache = strcacheFree(fi->fcapcache);
+ fi->fcaps = _free(fi->fcaps);
+
+ fi->cdict = _free(fi->cdict);
+
+ fi->fuser = _free(fi->fuser);
+ fi->fgroup = _free(fi->fgroup);
+
+ fi->fstates = _free(fi->fstates);
+ fi->fps = _free(fi->fps);
+
+ /* these point to header memory if KEEPHEADER is used, dont free */
+ if (!(fi->fiflags & RPMFI_KEEPHEADER) && fi->h == NULL) {
+ fi->fmtimes = _free(fi->fmtimes);
+ fi->fmodes = _free(fi->fmodes);
+ fi->fflags = _free(fi->fflags);
+ fi->vflags = _free(fi->vflags);
+ fi->fsizes = _free(fi->fsizes);
+ fi->frdevs = _free(fi->frdevs);
+ fi->finodes = _free(fi->finodes);
+ fi->dil = _free(fi->dil);
+
+ fi->fcolors = _free(fi->fcolors);
+ fi->fcdictx = _free(fi->fcdictx);
+ fi->ddict = _free(fi->ddict);
+ fi->fddictx = _free(fi->fddictx);
+ fi->fddictn = _free(fi->fddictn);
+
+ }
+ }
+
+ fi->fn = _free(fi->fn);
+ fi->apath = _free(fi->apath);
+
+ fi->replacedSizes = _free(fi->replacedSizes);
+
+ fi->h = headerFree(fi->h);
+
+ (void) rpmfiUnlink(fi);
+ memset(fi, 0, sizeof(*fi)); /* XXX trash and burn */
+ fi = _free(fi);
+
+ return NULL;
+}
+
+/* Helper to push header tag data into a string cache */
+static scidx_t *cacheTag(strcache cache, Header h, rpmTag tag)
+{
+ scidx_t *idx = NULL;
+ struct rpmtd_s td;
+ if (headerGet(h, tag, &td, HEADERGET_MINMEM)) {
+ idx = xmalloc(sizeof(*idx) * rpmtdCount(&td));
+ int i = 0;
+ const char *str;
+ while ((str = rpmtdNextString(&td))) {
+ idx[i++] = strcachePut(cache, str);
+ }
+ rpmtdFreeData(&td);
+ }
+ return idx;
+}
+
+#define _hgfi(_h, _tag, _td, _flags, _data) \
+ if (headerGet((_h), (_tag), (_td), (_flags))) \
+ _data = (td.data)
+
+rpmfi rpmfiNew(const rpmts ts, Header h, rpmTagVal tagN, rpmfiFlags flags)
+{
+ rpmfi fi = xcalloc(1, sizeof(*fi));
+ unsigned char * t;
+ struct rpmtd_s fdigests, digalgo;
+ struct rpmtd_s td;
+ headerGetFlags scareFlags = (flags & RPMFI_KEEPHEADER) ?
+ HEADERGET_MINMEM : HEADERGET_ALLOC;
+ headerGetFlags defFlags = HEADERGET_ALLOC;
+
+ fi->magic = RPMFIMAGIC;
+ fi->i = -1;
+
+ fi->fiflags = flags;
+
+ _hgfi(h, RPMTAG_BASENAMES, &td, defFlags, fi->bnl);
+ fi->fc = rpmtdCount(&td);
+ if (fi->fc == 0) {
+ goto exit;
+ }
+
+ _hgfi(h, RPMTAG_DIRNAMES, &td, defFlags, fi->dnl);
+ fi->dc = rpmtdCount(&td);
+ _hgfi(h, RPMTAG_DIRINDEXES, &td, scareFlags, fi->dil);
+
+ /* Is our filename triplet sane? */
+ if (fi->dc == 0 || fi->dc > fi->fc || rpmtdCount(&td) != fi->fc)
+ goto errxit;
+
+ for (rpm_count_t i = 0; i < fi->fc; i++) {
+ if (fi->dil[i] >= fi->fc)
+ goto errxit;
+ }
+
+ /* XXX TODO: all these should be sanity checked, ugh... */
+ if (!(flags & RPMFI_NOFILEMODES))
+ _hgfi(h, RPMTAG_FILEMODES, &td, scareFlags, fi->fmodes);
+ if (!(flags & RPMFI_NOFILEFLAGS))
+ _hgfi(h, RPMTAG_FILEFLAGS, &td, scareFlags, fi->fflags);
+ if (!(flags & RPMFI_NOFILEVERIFYFLAGS))
+ _hgfi(h, RPMTAG_FILEVERIFYFLAGS, &td, scareFlags, fi->vflags);
+ if (!(flags & RPMFI_NOFILESIZES))
+ _hgfi(h, RPMTAG_FILESIZES, &td, scareFlags, fi->fsizes);
+
+ if (!(flags & RPMFI_NOFILECOLORS))
+ _hgfi(h, RPMTAG_FILECOLORS, &td, scareFlags, fi->fcolors);
+
+ if (!(flags & RPMFI_NOFILECLASS)) {
+ _hgfi(h, RPMTAG_CLASSDICT, &td, scareFlags, fi->cdict);
+ fi->ncdict = rpmtdCount(&td);
+ _hgfi(h, RPMTAG_FILECLASS, &td, scareFlags, fi->fcdictx);
+ }
+ if (!(flags & RPMFI_NOFILEDEPS)) {
+ _hgfi(h, RPMTAG_DEPENDSDICT, &td, scareFlags, fi->ddict);
+ fi->nddict = rpmtdCount(&td);
+ _hgfi(h, RPMTAG_FILEDEPENDSX, &td, scareFlags, fi->fddictx);
+ _hgfi(h, RPMTAG_FILEDEPENDSN, &td, scareFlags, fi->fddictn);
+ }
+
+ if (!(flags & RPMFI_NOFILESTATES))
+ _hgfi(h, RPMTAG_FILESTATES, &td, defFlags, fi->fstates);
+
+ if (!(flags & RPMFI_NOFILECAPS) && headerIsEntry(h, RPMTAG_FILECAPS)) {
+ fi->fcapcache = strcacheNew();
+ fi->fcaps = cacheTag(fi->fcapcache, h, RPMTAG_FILECAPS);
+ }
+
+ if (!(flags & RPMFI_NOFILELINKTOS)) {
+ fi->flinkcache = strcacheNew();
+ fi->flinks = cacheTag(fi->flinkcache, h, RPMTAG_FILELINKTOS);
+ }
+ /* FILELANGS are only interesting when installing */
+ if ((headerGetInstance(h) == 0) && !(flags & RPMFI_NOFILELANGS))
+ fi->flangs = cacheTag(langcache, h, RPMTAG_FILELANGS);
+
+ /* See if the package has non-md5 file digests */
+ fi->digestalgo = PGPHASHALGO_MD5;
+ if (headerGet(h, RPMTAG_FILEDIGESTALGO, &digalgo, HEADERGET_MINMEM)) {
+ uint32_t *algo = rpmtdGetUint32(&digalgo);
+ /* Hmm, what to do with unknown digest algorithms? */
+ if (algo && rpmDigestLength(*algo) != 0) {
+ fi->digestalgo = *algo;
+ }
+ }
+
+ fi->digests = NULL;
+ /* grab hex digests from header and store in binary format */
+ if (!(flags & RPMFI_NOFILEDIGESTS) &&
+ headerGet(h, RPMTAG_FILEDIGESTS, &fdigests, HEADERGET_MINMEM)) {
+ const char *fdigest;
+ size_t diglen = rpmDigestLength(fi->digestalgo);
+ fi->digests = t = xmalloc(rpmtdCount(&fdigests) * diglen);
+
+ while ((fdigest = rpmtdNextString(&fdigests))) {
+ if (!(fdigest && *fdigest != '\0')) {
+ memset(t, 0, diglen);
+ t += diglen;
+ continue;
+ }
+ for (int j = 0; j < diglen; j++, t++, fdigest += 2)
+ *t = (rnibble(fdigest[0]) << 4) | rnibble(fdigest[1]);
+ }
+ rpmtdFreeData(&fdigests);
+ }
+
+ /* XXX TR_REMOVED doesn;t need fmtimes, frdevs, finodes */
+ if (!(flags & RPMFI_NOFILEMTIMES))
+ _hgfi(h, RPMTAG_FILEMTIMES, &td, scareFlags, fi->fmtimes);
+ if (!(flags & RPMFI_NOFILERDEVS))
+ _hgfi(h, RPMTAG_FILERDEVS, &td, scareFlags, fi->frdevs);
+ if (!(flags & RPMFI_NOFILEINODES))
+ _hgfi(h, RPMTAG_FILEINODES, &td, scareFlags, fi->finodes);
+
+ if (!(flags & RPMFI_NOFILEUSER))
+ fi->fuser = cacheTag(ugcache, h, RPMTAG_FILEUSERNAME);
+ if (!(flags & RPMFI_NOFILEGROUP))
+ fi->fgroup = cacheTag(ugcache, h, RPMTAG_FILEGROUPNAME);
+
+ /* lazily alloced from rpmfiFN() */
+ fi->fn = NULL;
+
+exit:
+
+ if (fi != NULL) {
+ fi->h = (fi->fiflags & RPMFI_KEEPHEADER) ? headerLink(h) : NULL;
+ }
+
+ /* FIX: rpmfi null annotations */
+ return rpmfiLink(fi);
+
+errxit:
+ rpmfiFree(fi);
+ return NULL;
+}
+
+void rpmfiSetFReplacedSizeIndex(rpmfi fi, int ix, rpm_loff_t newsize)
+{
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->replacedSizes == NULL) {
+ fi->replacedSizes = xcalloc(fi->fc, sizeof(*fi->replacedSizes));
+ }
+ /* XXX watch out, replacedSizes is not rpm_loff_t (yet) */
+ fi->replacedSizes[ix] = (rpm_off_t) newsize;
+ }
+}
+
+rpm_loff_t rpmfiFReplacedSizeIndex(rpmfi fi, int ix)
+{
+ rpm_loff_t rsize = 0;
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->replacedSizes) {
+ rsize = fi->replacedSizes[ix];
+ }
+ }
+ return rsize;
+}
+
+void rpmfiFpLookup(rpmfi fi, fingerPrintCache fpc)
+{
+ if (fi->fc > 0 && fi->fps == NULL) {
+ fi->fps = xcalloc(fi->fc, sizeof(*fi->fps));
+ }
+ fpLookupList(fpc, fi->dnl, fi->bnl, fi->dil, fi->fc, fi->fps);
+}
+
+/*
+ * Generate iterator accessors function wrappers, these do nothing but
+ * call the corresponding rpmfiFooIndex(fi, fi->[ij])
+ */
+
+#define RPMFI_ITERFUNC(TYPE, NAME, IXV) \
+ TYPE rpmfi ## NAME(rpmfi fi) { return rpmfi ## NAME ## Index(fi, fi ? fi->IXV : -1); }
+
+RPMFI_ITERFUNC(const char *, BN, i)
+RPMFI_ITERFUNC(const char *, DN, j)
+RPMFI_ITERFUNC(const char *, FLink, i)
+RPMFI_ITERFUNC(const char *, FUser, i)
+RPMFI_ITERFUNC(const char *, FGroup, i)
+RPMFI_ITERFUNC(const char *, FCaps, i)
+RPMFI_ITERFUNC(const char *, FLangs, i)
+RPMFI_ITERFUNC(const char *, FClass, i)
+RPMFI_ITERFUNC(rpmfileState, FState, i)
+RPMFI_ITERFUNC(rpmfileAttrs, FFlags, i)
+RPMFI_ITERFUNC(rpmVerifyAttrs, VFlags, i)
+RPMFI_ITERFUNC(rpm_mode_t, FMode, i)
+RPMFI_ITERFUNC(rpm_rdev_t, FRdev, i)
+RPMFI_ITERFUNC(rpm_time_t, FMtime, i)
+RPMFI_ITERFUNC(rpm_ino_t, FInode, i)
+RPMFI_ITERFUNC(rpm_loff_t, FSize, i)
+RPMFI_ITERFUNC(rpm_color_t, FColor, i)
+RPMFI_ITERFUNC(uint32_t, FNlink, i)
+
+const char * rpmfiFN(rpmfi fi)
+{
+ const char *fn = ""; /* preserve behavior on errors */
+ if (fi != NULL) {
+ free(fi->fn);
+ fi->fn = rpmfiFNIndex(fi, fi->i);
+ if (fi->fn != NULL)
+ fn = fi->fn;
+ }
+ return fn;
+}
+
+const unsigned char * rpmfiFDigest(rpmfi fi, int *algo, size_t *len)
+{
+ return rpmfiFDigestIndex(fi, fi ? fi->i : -1, algo, len);
+}
+
+uint32_t rpmfiFDepends(rpmfi fi, const uint32_t ** fddictp)
+{
+ return rpmfiFDependsIndex(fi, fi ? fi->i : -1, fddictp);
+}
+
+int rpmfiCompare(const rpmfi afi, const rpmfi bfi)
+{
+ return rpmfiCompareIndex(afi, afi ? afi->i : -1, bfi, bfi ? bfi->i : -1);
+}
+
+rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing)
+{
+ return rpmfiDecideFateIndex(ofi, ofi ? ofi->i : -1,
+ nfi, nfi ? nfi->i : -1,
+ skipMissing);
+}
+
+int rpmfiConfigConflict(const rpmfi fi)
+{
+ return rpmfiConfigConflictIndex(fi, fi ? fi->i : -1);
+}
--- /dev/null
+Based on http://rpm.org/gitweb?p=rpm.git;a=commitdiff;h=cf1095648194104a81a58abead05974a5bfa3b9a
+====================
+--- a/lib/rpmfi.c 2013-02-04 10:29:59.342666296 +0100
++++ b/lib/rpmfi.c 2013-02-04 10:32:26.192721679 +0100
+@@ -542,19 +542,13 @@
+
+ int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix)
+ {
+- mode_t amode = rpmfiFModeIndex(afi, aix);
+- mode_t bmode = rpmfiFModeIndex(bfi, bix);
+- rpmFileTypes awhat = rpmfiWhatis(amode);
++ rpmFileTypes awhat = rpmfiWhatis(rpmfiFModeIndex(afi, aix));
++ rpmFileTypes bwhat = rpmfiWhatis(rpmfiFModeIndex(bfi, bix));
+
+ if ((rpmfiFFlagsIndex(afi, aix) & RPMFILE_GHOST) ||
+ (rpmfiFFlagsIndex(bfi, bix) & RPMFILE_GHOST)) return 0;
+
+- if (amode != bmode) return 1;
+-
+- if (!rstreq(rpmfiFUserIndex(afi, aix), rpmfiFUserIndex(bfi, bix)))
+- return 1;
+- if (!rstreq(rpmfiFGroupIndex(afi, aix), rpmfiFGroupIndex(bfi, bix)))
+- return 1;
++ if (awhat != bwhat) return 1;
+
+ if (awhat == LINK) {
+ const char * alink = rpmfiFLinkIndex(afi, aix);
--- /dev/null
+# build against xz?
+%bcond_without xz
+# just for giggles, option to build with internal Berkeley DB
+%bcond_with int_bdb
+# run internal testsuite?
+%bcond_without check
+# disable plugins initially
+%bcond_with plugins
+
+%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
+
+%define rpmhome /usr/lib/rpm
+
+%define rpmver 4.10.2
+%define srcver %{rpmver}%{?snapver:-%{snapver}}
+
+%define bdbname libdb
+%define bdbver 5.3.15
+%define dbprefix db
+%define dist .zzbbox
+
+Summary: The RPM package management system
+Name: rpm
+Version: %{rpmver}
+Release: %{?snapver:0.%{snapver}.}1%{?dist}
+Group: System Environment/Base
+Url: http://www.rpm.org/
+Source0: http://rpm.org/releases/rpm-4.10.x/%{name}-%{srcver}.tar.bz2
+%if %{with int_bdb}
+Source1: db-%{bdbver}.tar.gz
+%else
+BuildRequires: libdb-devel
+%endif
+Source10: libsymlink.attr
+
+Patch1: rpm-4.5.90-pkgconfig-path.patch
+# Fedora specspo is setup differently than what rpm expects, considering
+# this as Fedora-specific patch for now
+Patch2: rpm-4.9.90-fedora-specspo.patch
+# In current Fedora, man-pages pkg owns all the localized man directories
+Patch3: rpm-4.9.90-no-man-dirs.patch
+# gnupg2 comes installed by default, avoid need to drag in gnupg too
+Patch4: rpm-4.8.1-use-gpg2.patch
+Patch5: rpm-4.9.90-armhfp.patch
+#conditionally applied patch for arm hardware floating point
+Patch6: rpm-4.9.0-armhfp-logic.patch
+
+# Patches already in upstream
+
+# These are not yet upstream
+Patch301: rpm-4.6.0-niagara.patch
+Patch302: rpm-4.7.1-geode-i686.patch
+# Probably to be upstreamed in slightly different form
+Patch304: rpm-4.9.1.1-ld-flags.patch
+# Compressed debuginfo support (#833311)
+Patch305: rpm-4.10.0-dwz-debuginfo.patch
+# Minidebuginfo support (#834073)
+Patch306: rpm-4.10.0-minidebuginfo.patch
+# Temporary Patch to provide support for updates
+Patch400: rpm-4.9.1.2-rpmlib-filesystem-check.patch
+# Thierry : undo a change that checks for file permissions
+# and prevents from building f12 images
+Patch500: rpm-revert-fileperm.patch
+
+# Partially GPL/LGPL dual-licensed and some bits with BSD
+# SourceLicense: (GPLv2+ and LGPLv2+ with exceptions) and BSD
+License: GPLv2+
+
+Requires: coreutils
+%if %{without int_bdb}
+# db recovery tools, rpmdb_util symlinks
+Requires: %{_bindir}/%{dbprefix}_stat
+%endif
+Requires: popt%{_isa} >= 1.10.2.1
+Requires: curl
+
+%if %{without int_bdb}
+BuildRequires: %{bdbname}-devel%{_isa}
+%endif
+
+%if %{with check}
+BuildRequires: fakechroot
+%endif
+
+# XXX generally assumed to be installed but make it explicit as rpm
+# is a bit special...
+BuildRequires: redhat-rpm-config
+BuildRequires: gawk
+BuildRequires: elfutils-devel%{_isa} >= 0.112
+BuildRequires: elfutils-libelf-devel%{_isa}
+BuildRequires: readline-devel%{_isa} zlib-devel%{_isa}
+BuildRequires: nss-devel%{_isa}
+BuildRequires: nss-softokn-freebl-devel%{_isa}
+# The popt version here just documents an older known-good version
+BuildRequires: popt-devel%{_isa} >= 1.10.2
+BuildRequires: file-devel%{_isa}
+BuildRequires: gettext-devel%{_isa}
+#BuildRequires: libselinux-devel%{_isa}
+# XXX semanage is only used by sepolicy plugin but configure requires it...
+BuildRequires: libsemanage-devel%{_isa}
+BuildRequires: ncurses-devel%{_isa}
+BuildRequires: bzip2-devel%{_isa} >= 0.9.0c-2
+BuildRequires: python-devel%{_isa} >= 2.6
+BuildRequires: lua-devel%{_isa} >= 5.1
+BuildRequires: libcap-devel%{_isa}
+BuildRequires: libacl-devel%{_isa}
+%if ! %{without xz}
+BuildRequires: xz-devel%{_isa} >= 4.999.8
+%endif
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+%description
+The RPM Package Manager (RPM) is a powerful command line driven
+package management system capable of installing, uninstalling,
+verifying, querying, and updating software packages. Each software
+package consists of an archive of files along with information about
+the package like its version, a description, etc.
+
+%package libs
+Summary: Libraries for manipulating RPM packages
+Group: Development/Libraries
+License: GPLv2+ and LGPLv2+ with exceptions
+Requires: rpm = %{version}-%{release}
+# librpm uses cap_compare, introduced sometimes between libcap 2.10 and 2.16.
+# A manual require is needed, see #505596
+Requires: libcap%{_isa} >= 2.16
+
+%description libs
+This package contains the RPM shared libraries.
+
+%package build-libs
+Summary: Libraries for building and signing RPM packages
+Group: Development/Libraries
+License: GPLv2+ and LGPLv2+ with exceptions
+Requires: rpm-libs%{_isa} = %{version}-%{release}
+Requires: %{_bindir}/gpg2
+
+%description build-libs
+This package contains the RPM shared libraries for building and signing
+packages.
+
+%package devel
+Summary: Development files for manipulating RPM packages
+Group: Development/Libraries
+License: GPLv2+ and LGPLv2+ with exceptions
+Requires: rpm = %{version}-%{release}
+Requires: rpm-libs%{_isa} = %{version}-%{release}
+Requires: rpm-build-libs%{_isa} = %{version}-%{release}
+Requires: popt-devel%{_isa}
+
+%description devel
+This package contains the RPM C library and header files. These
+development files will simplify the process of writing programs that
+manipulate RPM packages and databases. These files are intended to
+simplify the process of creating graphical package managers or any
+other tools that need an intimate knowledge of RPM packages in order
+to function.
+
+This package should be installed if you want to develop programs that
+will manipulate RPM packages and databases.
+
+%package build
+Summary: Scripts and executable programs used to build packages
+Group: Development/Tools
+Requires: rpm = %{version}-%{release}
+Requires: elfutils >= 0.128 binutils
+Requires: findutils sed grep gawk diffutils file patch >= 2.5
+Requires: unzip gzip bzip2 cpio xz
+Requires: pkgconfig >= 1:0.24
+Requires: /usr/bin/gdb-add-index
+Conflicts: ocaml-runtime < 3.11.1-7
+
+%description build
+The rpm-build package contains the scripts and executable programs
+that are used to build packages using the RPM Package Manager.
+
+%package sign
+Summary: Package signing support
+Group: System Environment/Base
+Requires: rpm-build-libs%{_isa} = %{version}-%{release}
+
+%description sign
+This package contains support for digitally signing RPM packages.
+
+%package python
+Summary: Python bindings for apps which will manipulate RPM packages
+Group: Development/Libraries
+Requires: rpm = %{version}-%{release}
+
+%description python
+The rpm-python package contains a module that permits applications
+written in the Python programming language to use the interface
+supplied by RPM Package Manager libraries.
+
+This package should be installed if you want to develop Python
+programs that will manipulate RPM packages and databases.
+
+%package apidocs
+Summary: API documentation for RPM libraries
+Group: Documentation
+BuildArch: noarch
+
+%description apidocs
+This package contains API documentation for developing applications
+that will manipulate RPM packages and databases.
+
+%package cron
+Summary: Create daily logs of installed packages.
+Group: System Environment/Base
+BuildArch: noarch
+Requires: crontabs logrotate rpm = %{version}-%{release}
+
+%description cron
+This package contains a cron job which creates daily logs of installed
+packages on a system.
+
+%prep
+%setup -q -n %{name}-%{srcver} %{?with_int_bdb:-a 1}
+%patch1 -p1 -b .pkgconfig-path
+%patch2 -p1 -b .fedora-specspo
+%patch3 -p1 -b .no-man-dirs
+%patch4 -p1 -b .use-gpg2
+
+%patch301 -p1 -b .niagara
+%patch302 -p1 -b .geode
+%patch304 -p1 -b .ldflags
+%patch305 -p1 -b .dwz-debuginfo
+%patch306 -p1 -b .minidebuginfo
+
+%patch400 -p1 -b .rpmlib-filesystem-check
+
+%patch500 -p1 -b .fileperm
+
+%patch5 -p1 -b .armhfp
+# this patch cant be applied on softfp builds
+%ifnarch armv3l armv4b armv4l armv4tl armv5tel armv5tejl armv6l armv7l
+%patch6 -p1 -b .armhfp-logic
+%endif
+
+%if %{with int_bdb}
+ln -s db-%{bdbver} db
+%endif
+
+%build
+%if %{without int_bdb}
+#CPPFLAGS=-I%{_includedir}/db%{bdbver}
+#LDFLAGS=-L%{_libdir}/db%{bdbver}
+%endif
+CPPFLAGS="$CPPFLAGS `pkg-config --cflags nss`"
+CFLAGS="$RPM_OPT_FLAGS"
+export CPPFLAGS CFLAGS LDFLAGS
+
+# Using configure macro has some unwanted side-effects on rpm platform
+# setup, use the old-fashioned way for now only defining minimal paths.
+./configure \
+ --prefix=%{_usr} \
+ --sysconfdir=%{_sysconfdir} \
+ --localstatedir=%{_var} \
+ --sharedstatedir=%{_var}/lib \
+ --libdir=%{_libdir} \
+ --build=%{_target_platform} \
+ --host=%{_target_platform} \
+ --with-vendor=redhat \
+ %{!?with_int_bdb: --with-external-db} \
+ %{!?with_plugins: --disable-plugins} \
+ --with-lua \
+ --without-selinux \
+ --with-cap \
+ --with-acl \
+ --enable-python
+
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make DESTDIR="$RPM_BUILD_ROOT" install
+
+# Save list of packages through cron
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/cron.daily
+install -m 755 scripts/rpm.daily ${RPM_BUILD_ROOT}%{_sysconfdir}/cron.daily/rpm
+
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d
+install -m 644 scripts/rpm.log ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/rpm
+
+mkdir -p ${RPM_BUILD_ROOT}/usr/lib/tmpfiles.d
+echo "r /var/lib/rpm/__db.*" > ${RPM_BUILD_ROOT}/usr/lib/tmpfiles.d/rpm.conf
+
+mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rpm
+
+install -m 644 %{SOURCE10} ${RPM_BUILD_ROOT}%{rpmhome}/fileattrs/libsymlink.attr
+
+mkdir -p $RPM_BUILD_ROOT/var/lib/rpm
+for dbi in \
+ Basenames Conflictname Dirnames Group Installtid Name Obsoletename \
+ Packages Providename Requirename Triggername Sha1header Sigmd5 \
+ __db.001 __db.002 __db.003 __db.004 __db.005 __db.006 __db.007 \
+ __db.008 __db.009
+do
+ touch $RPM_BUILD_ROOT/var/lib/rpm/$dbi
+done
+
+# plant links to relevant db utils as rpmdb_foo for documention compatibility
+%if %{without int_bdb}
+for dbutil in dump load recover stat upgrade verify
+do
+ ln -s ../../bin/%{dbprefix}_${dbutil} $RPM_BUILD_ROOT/%{rpmhome}/rpmdb_${dbutil}
+done
+%endif
+
+%find_lang %{name}
+
+find $RPM_BUILD_ROOT -name "*.la"|xargs rm -f
+
+# avoid dragging in tonne of perl libs for an unused script
+chmod 0644 $RPM_BUILD_ROOT/%{rpmhome}/perldeps.pl
+
+# compress our ChangeLog, it's fairly big...
+bzip2 -9 ChangeLog
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%if %{with check}
+%check
+make check
+[ "$(ls -A tests/rpmtests.dir)" ] && cat tests/rpmtests.log
+%endif
+
+%post libs -p /sbin/ldconfig
+%postun libs -p /sbin/ldconfig
+
+%post build-libs -p /sbin/ldconfig
+%postun build-libs -p /sbin/ldconfig
+
+%posttrans
+# XXX this is klunky and ugly, rpm itself should handle this
+dbstat=/usr/lib/rpm/rpmdb_stat
+if [ -x "$dbstat" ]; then
+ if "$dbstat" -e -h /var/lib/rpm 2>&1 | grep -q "doesn't match library version \| Invalid argument"; then
+ rm -f /var/lib/rpm/__db.*
+ fi
+fi
+exit 0
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%doc GROUPS COPYING CREDITS ChangeLog.bz2 doc/manual/[a-z]*
+
+/usr/lib/tmpfiles.d/rpm.conf
+%dir %{_sysconfdir}/rpm
+
+%attr(0755, root, root) %dir /var/lib/rpm
+%attr(0644, root, root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/lib/rpm/*
+
+/bin/rpm
+%{_bindir}/rpm2cpio
+%{_bindir}/rpmdb
+%{_bindir}/rpmkeys
+%{_bindir}/rpmquery
+%{_bindir}/rpmverify
+
+%{_mandir}/man8/rpm.8*
+%{_mandir}/man8/rpmdb.8*
+%{_mandir}/man8/rpmkeys.8*
+%{_mandir}/man8/rpm2cpio.8*
+
+# XXX this places translated manuals to wrong package wrt eg rpmbuild
+%lang(fr) %{_mandir}/fr/man[18]/*.[18]*
+%lang(ko) %{_mandir}/ko/man[18]/*.[18]*
+%lang(ja) %{_mandir}/ja/man[18]/*.[18]*
+%lang(pl) %{_mandir}/pl/man[18]/*.[18]*
+%lang(ru) %{_mandir}/ru/man[18]/*.[18]*
+%lang(sk) %{_mandir}/sk/man[18]/*.[18]*
+
+%attr(0755, root, root) %dir %{rpmhome}
+%{rpmhome}/macros
+%{rpmhome}/rpmpopt*
+%{rpmhome}/rpmrc
+
+%{rpmhome}/rpmdb_*
+%{rpmhome}/rpm.daily
+%{rpmhome}/rpm.log
+%{rpmhome}/rpm.supp
+%{rpmhome}/rpm2cpio.sh
+%{rpmhome}/tgpg
+
+%{rpmhome}/platform
+
+%files libs
+%defattr(-,root,root)
+%{_libdir}/librpmio.so.*
+%{_libdir}/librpm.so.*
+%if %{with plugins}
+%{_libdir}/rpm-plugins
+%endif
+
+%files build-libs
+%defattr(-,root,root)
+%{_libdir}/librpmbuild.so.*
+%{_libdir}/librpmsign.so.*
+
+%files build
+%defattr(-,root,root)
+%{_bindir}/rpmbuild
+%{_bindir}/gendiff
+%{_bindir}/rpmspec
+
+%{_mandir}/man1/gendiff.1*
+%{_mandir}/man8/rpmbuild.8*
+%{_mandir}/man8/rpmdeps.8*
+%{_mandir}/man8/rpmspec.8*
+
+%{rpmhome}/brp-*
+%{rpmhome}/check-*
+%{rpmhome}/debugedit
+%{rpmhome}/find-debuginfo.sh
+%{rpmhome}/find-lang.sh
+%{rpmhome}/*provides*
+%{rpmhome}/*requires*
+%{rpmhome}/*deps*
+%{rpmhome}/*.prov
+%{rpmhome}/*.req
+%{rpmhome}/config.*
+%{rpmhome}/mkinstalldirs
+%{rpmhome}/macros.*
+%{rpmhome}/fileattrs
+
+%files sign
+%defattr(-,root,root)
+%{_bindir}/rpmsign
+%{_mandir}/man8/rpmsign.8*
+
+%files python
+%defattr(-,root,root)
+%{python_sitearch}/rpm
+
+%files devel
+%defattr(-,root,root)
+%{_mandir}/man8/rpmgraph.8*
+%{_bindir}/rpmgraph
+%{_libdir}/librp*[a-z].so
+%{_libdir}/pkgconfig/rpm.pc
+%{_includedir}/rpm
+
+%files cron
+%defattr(-,root,root)
+%{_sysconfdir}/cron.daily/rpm
+%config(noreplace) %{_sysconfdir}/logrotate.d/rpm
+
+%files apidocs
+%defattr(-,root,root)
+%doc COPYING doc/librpm/html/*
+
+%changelog
+* Mon Dec 10 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.2-1
+- update to 4.10.2 (http://rpm.org/wiki/Releases/4.10.2)
+
+* Thu Oct 11 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.1-3
+- fix noarch __isa_* macro filter in installplatform (#865436)
+
+* Wed Oct 10 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.1-2
+- account for intentionally skipped files when verifying hardlinks (#864622)
+
+* Wed Oct 03 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.1-1
+- update to 4.10.1 ((http://rpm.org/wiki/Releases/4.10.1)
+
+* Mon Jul 30 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-6
+- move our tmpfiles config to more politically correct location (#840192)
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.10.0-5.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Mon Jul 02 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-5
+- force _host_vendor to redhat to better match toolchain etc (#485203)
+
+* Thu Jun 28 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-4
+- merge ppc64p7 related fixes that only went into f17 (#835978)
+
+* Wed Jun 27 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-3
+- add support for minidebuginfo generation (#834073)
+
+* Mon Jun 25 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-2
+- add dwarf compression support to debuginfo generation (#833311)
+
+* Thu May 24 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-1
+- update to 4.10.0 final
+
+* Mon Apr 23 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-0.beta1.1
+- update to 4.10.0-beta1
+
+* Mon Apr 16 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11536.1
+- newer git snapshot (#809402, #808750)
+- adjust posttrans script wrt bdb string change (#803866, #805613)
+
+* Thu Apr 05 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11519.1
+- newer git snapshot to keep patch-count down
+- fixes CVE-2012-0060, CVE-2012-0061 and CVE-2012-0815
+- fix obsoletes in installing set getting matched on provides (#810077)
+
+* Wed Apr 04 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.90-0.git11505.12
+- rebuild against new libdb
+
+* Tue Apr 03 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.90-0.git11505.11
+- build with internal libdb to allow libdb build with higher soname
+
+* Fri Mar 30 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.10
+- fix base arch macro generation (#808250)
+
+* Thu Mar 29 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.9
+- accept files as command line arguments to rpmdeps again (#807767)
+
+* Mon Mar 26 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.8
+- remove fake library provide hacks now that deltarpm got rebuilt
+
+* Fri Mar 23 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.7
+- fix header data length calculation breakage
+
+* Thu Mar 22 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.6
+- fix keyid size bogosity causing breakage on 32bit systems
+
+* Wed Mar 21 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.5
+- add temporary fake library provides to get around deltarpm "bootstrap"
+ dependency (yes its dirty)
+
+* Wed Mar 21 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.4
+- fix overzealous sanity check breaking posttrans scripts
+
+* Tue Mar 20 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.3
+- fix bad interaction with yum's test-transaction and pretrans scripts
+
+* Tue Mar 20 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.90-0.git11505.2
+- rebuild
+
+* Tue Mar 20 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.1
+- update to 4.10.0 alpha (http://rpm.org/wiki/Releases/4.10.0)
+- drop/adjust patches as necessary
+
+* Wed Mar 07 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-14
+- fix backport thinko in the exclude patch
+
+* Wed Mar 07 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-13
+- fix memory corruption on rpmdb size estimation (#766260)
+- fix couple of memleaks in python bindings (#782147)
+- fix regression in verify output formatting (#797964)
+- dont process spec include in false branch of if (#782970)
+- only warn on missing excluded files on build (#745629)
+- dont free up file info sets on test transactions
+
+* Thu Feb 09 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-12
+- switch back to smaller BDB cache default (#752897)
+
+* Sun Jan 15 2012 Dennis Gilmore <dennis@ausil.us> - 4.9.1.2-11
+- always apply arm hfp macros, conditionally apply the logic to detect hfp
+
+* Tue Jan 10 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-10
+- adjust perl and python detection rules for libmagic change (#772699)
+
+* Mon Jan 09 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.1.2-9
+- recognize perl script as perl code (#772632)
+
+* Tue Dec 20 2011 Kay Sievers <kay@redhat.com> - 4.9.1.2-8
+- add temporary rpmlib patch to support filesystem transition
+ https://fedoraproject.org/wiki/Features/UsrMove
+
+* Fri Dec 02 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-7
+- switch over to libdb, aka Berkeley DB 5.x
+
+* Thu Dec 01 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-6
+- fix classification of ELF binaries with setuid/setgid bit (#758251)
+
+* Fri Nov 25 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-5
+- adjust font detection rules for libmagic change (#757105)
+
+* Wed Nov 09 2011 Dennis Gilmore <dennis@ausil.us> - 4.9.1.2-4
+- conditionally apply arm patch for hardfp on all arches but arm softfp ones
+
+* Fri Oct 28 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-3
+- adjust db util prefix & dependency due to #749293
+- warn but dont fail the build if STABS encountered by debugedit (#725378)
+
+* Wed Oct 12 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-2
+- try teaching find-lang about the new gnome help layout (#736523)
+
+* Thu Sep 29 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-1
+- update to 4.9.1.2 (CVE-2011-3378)
+- drop upstreamed rpmdb signal patch
+
+* Mon Sep 19 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.1-3
+- fix signal blocking/unblocking regression on rpmdb open/close (#739492)
+
+* Mon Aug 08 2011 Adam Jackson <ajax@redhat.com> 4.9.1.1-2
+- Add RPM_LD_FLAGS to build environment (#728974)
+
+* Tue Aug 02 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.1-1
+- update to 4.9.1.1
+
+* Tue Jul 19 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1-2
+- fix recursion of directories with trailing slash in file list (#722474)
+
+* Fri Jul 15 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1-1
+- update to 4.9.1 (http://rpm.org/wiki/Releases/4.9.1)
+- drop no longer needed patches
+
+* Thu Jun 16 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-10
+- rebuild to fix a missing interpreter dependency due to bug #712251
+
+* Fri Jun 10 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-9
+- fix crash if prep or changelog section in spec is empty (#706959)
+- fix crash on macro which undefines itself
+- fix script dependency generation with file 5.07 string changes (#712251)
+
+* Thu May 26 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-8
+- add dwarf-4 support to debugedit (#707677)
+- generate build-id symlinks for all filenames sharing a build-id (#641377)
+
+* Thu Apr 07 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-7
+- add missing ldconfig calls to build-libs sub-package
+- fix source url
+
+* Thu Apr 07 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-6
+- revert the spec query change (#693338) for now, it breaks fedpkg
+
+* Tue Apr 05 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-5
+- verify some properties of replaced and wrong-colored files (#528383)
+- only list packages that would be generated on spec query (#693338)
+- preferred color packages should be erased last (#680261)
+- fix leaks when freeing a populated transaction set
+- take file state into account for file dependencies
+
+* Tue Mar 22 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-4
+- fix classification of elf executables with sticky bit set (#689182)
+
+* Wed Mar 16 2011 Jindirch Novy <jnovy@redhat.com> - 4.9.0-3
+- fix crash in package manifest check (#688091)
+
+* Fri Mar 04 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-2
+- fix duplicate rpmsign binary in rpm main package dragging in build-libs
+
+* Wed Mar 02 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-1
+- update to 4.9.0 final
+- drop upstreamed patches
+
+* Tue Mar 01 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.4
+- spec cosmetics clean up extra whitespace + group more logically
+- wipe out BDB environment at boot via tmpfiles.d
+
+* Mon Feb 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.3
+- fix erronous double cursor open, causing yum reinstall hang (#678644)
+
+* Mon Feb 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.2
+- fix broken logic in depgen collector, hopefully curing #675002
+
+* Tue Feb 15 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.1
+- update to 4.9.0-rc1
+- drop upstream patches
+- nss packaging has changed, buildrequire nss-softokn-freebl-devel
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.9.0-0.beta1.7.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Feb 07 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.7
+- fix segfault when building more than one package at a time (#675565)
+
+* Sun Feb 06 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.6
+- adjust ocaml rule for libmagic string change
+
+* Mon Jan 31 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.5
+- dont try to remove environment files if private env used (related to #671200)
+- unbreak mono dependency extraction (#673663)
+- complain instead of silent abort if cwd is not readable (#672576)
+
+* Tue Jan 25 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.4
+- add support for Requires(posttrans) dependencies
+
+* Fri Jan 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.3
+- avoid division by zero in rpmdb size calculation (#671056)
+- fix secondary index iteration returing duplicate at end (#671149)
+- fix rebuilddb creating duplicate indexes for first header
+
+* Fri Jan 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.2
+- permit queries from rpmdb on read-only media (#671200)
+
+* Tue Jan 18 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.1
+- rpm 4.9.0-beta1 (http://rpm.org/wiki/Releases/4.9.0)
+ - drop no longer needed patches
+ - adjust requires + buildrequires to match current needs
+ - adjust rpmdb index ghosts to match the new release
+ - split librpmbuild and librpmsign to a separate rpm-build-libs package
+ - split rpmsign to its own package to allow signing without all the build goo
+ - build-conditionalize plugins, disabled for now
+ - gstreamer and printer dependency generation moving out
+ - handle .so symlink dependencies with fileattrs
+ - use gnupg2 for signing as that's what typically installed by default
+
+* Tue Jan 18 2011 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-7
+- bunch of spec tweaks, cleanups + corrections:
+ - shorten rpm-build filelist a bit with glob use, reorder for saner grouping
+ - missing isa in popt version dependency
+ - only add rpmdb_foo symlinks for actually relevant db_* utils
+ - drop no longer necessary file-devel dependency from rpm-devel
+ - drop sqlite backend build-conditional
+ - preliminaries for moving from db4 to libdb
+- use gnupg2 for signing as that's more likely to be installed by default
+
+* Mon Oct 25 2010 Jindrich Novy <jnovy@redhat.com> - 4.8.1-6
+- rebuild with new xz-5.0.0
+
+* Tue Aug 10 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-5
+- create gdb index on debuginfo generation (#617166)
+- rpm-build now requires /usr/bin/gdb-add-index for consistent index creation
+- include COPYING in -apidocs for licensing guidelines compliance
+
+* Thu Jul 22 2010 David Malcolm <dmalcolm@redhat.com> - 4.8.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild
+
+* Fri Jul 02 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-3
+- ugh, reversed condition braindamage in the font provide extractor "fix"
+
+* Wed Jun 30 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-2
+- fix a potential getOutputFrom() error from font provide extraction
+- debug-friendlier message to aid finding other similar cases (#565223)
+
+* Fri Jun 11 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-1
+- update to 4.8.1 (http://rpm.org/wiki/Releases/4.8.1)
+- drop no longer needed patches
+- fix source url pointing to testing directory
+
+* Thu Jun 03 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-19
+- also strip POSIX file capabilities from hardlinks on upgrade/erase (#598775)
+
+* Wed Jun 02 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-18
+- remove s-bits on upgrade too (#598775)
+
+* Thu May 27 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-17
+- fix segfault in spec parser (#597835)
+
+* Thu May 27 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-16
+- adjust to new pkg-config behavior wrt private dependencies (#596433)
+- rpm-build now requires pkgconfig >= 0.24
+
+* Fri May 21 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-15
+- handle non-existent dependency sets correctly in python (#593553)
+- make find-lang look in all locale dirs (#584866)
+
+* Fri Apr 23 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-14
+- lose dangling symlink to extinct (and useless) berkeley_db_svc (#585174)
+
+* Wed Mar 24 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-13
+- fix python match iterator regression wrt boolean representation
+
+* Wed Mar 17 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-12
+- unbreak find-lang --with-man from yesterdays braindamage
+
+* Tue Mar 16 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-11
+- support single PPD providing driver for devices (#568351)
+- merge the psdriver patch pile into one
+- preserve empty lines in spec prep section (#573339)
+- teach python bindings about RPMTRANS_FLAG_NOCONTEXTS (related to #573111)
+- dont own localized man directories through find_lang (#569536)
+
+* Mon Feb 15 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-10
+- drop bogus dependency on lzma, xz is used to handle the lzma format too
+
+* Fri Feb 05 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-9
+- unbreak python(abi) requires generation (#562906)
+
+* Fri Feb 05 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-8
+- more fixes to postscript provides extractor (#562228)
+- avoid accessing unrelated mount points in disk space checking (#547548)
+- fix disk space checking with erasures present in transaction (#561160)
+
+* Fri Feb 05 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-7
+- couple of fixes to the postscript provides extractor (#538101)
+
+* Thu Feb 04 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-6
+- extract provides for postscript printer drivers (#538101)
+
+* Wed Feb 03 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-5
+- python byte-compilation fixes + improvements (#558997)
+
+* Sat Jan 30 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-4
+- support parallel python versions in python dependency extractor (#532118)
+
+* Thu Jan 21 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-3
+- fix segfault on failed url retrieval
+- fix verification error code depending on verbosity level
+- if anything in testsuite fails, dump out the log
+
+* Fri Jan 08 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-2
+- put disttag back, accidentally nuked in 4.8.0 final update
+
+* Fri Jan 08 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-1
+- update to 4.8.0 final (http://rpm.org/wiki/Releases/4.8.0)
+
+* Thu Jan 07 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.6
+- pull out macro scoping "fix" for now, it breaks font package macros
+
+* Mon Jan 04 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.5
+- always clear locally defined macros when they go out of scope
+
+* Thu Dec 17 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.4
+- permit unexpanded macros when parsing spec (#547997)
+
+* Wed Dec 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.3
+- fix a bunch of python refcount-errors causing major memory leaks
+
+* Mon Dec 07 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.2
+- fix noise from python bytecompile on non-python packages (#539635)
+- make all our -devel [build]requires isa-specific
+- trim out superfluous -devel dependencies from rpm-devel
+
+* Mon Dec 07 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.1
+- update to 4.8.0-beta1 (http://rpm.org/wiki/Releases/4.8.0)
+- rpm-build conflicts with current ocaml-runtime
+
+* Fri Dec 04 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.2-2
+- missing error exit code from signing password checking (#496754)
+- dont fail build on unrecognized data files (#532489)
+- dont try to parse subkeys and secret keys (#436812)
+- fix chmod test on selinux, breaking %%{_fixperms} macro (#543035)
+
+* Wed Nov 25 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.2-1
+- update to 4.7.2 (http://rpm.org/wiki/Releases/4.7.2)
+- fixes #464750, #529214
+
+* Wed Nov 18 2009 Jindrich Novy <jnovy@redhat.com> - 4.7.1-10
+- rebuild against BDB-4.8.24
+
+* Wed Nov 18 2009 Jindrich Novy <jnovy@redhat.com> - 4.7.1-9
+- drop versioned dependency to BDB
+
+* Wed Oct 28 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-8
+- support multiple python implementations in brp-python-bytecompile (#531117)
+- make disk space problem reporting a bit saner (#517418)
+
+* Tue Oct 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-7
+- fix build with BDB 4.8.x by removing XA "support" from BDB backend
+- perl dep extractor heredoc parsing improvements (#524929)
+
+* Mon Sep 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-6
+- use relative paths within db environment (related to #507309, #507309...)
+- remove db environment on close in chrooted operation (related to above)
+- initialize rpmlib earlier in rpm2cpio (#523260)
+- fix file dependency tag extension formatting (#523282)
+
+* Tue Sep 15 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-5
+- fix duplicate dependency filtering on build (#490378)
+- permit absolute paths in file lists again (#521760)
+- use permissions 444 for all .debug files (#522194)
+- add support for optional bugurl tag (#512774)
+
+* Fri Aug 14 2009 Jesse Keating <jkeating@redhat.com> - 4.7.1-4
+- Patch to make geode appear as i686 (#517475)
+
+* Thu Aug 06 2009 Jindrich Novy <jnovy@redhat.com> - 4.7.1-3
+- rebuild because of the new xz
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.7.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Tue Jul 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-1
+- update to 4.7.1 ((http://rpm.org/wiki/Releases/4.7.1)
+- fix source url
+
+* Mon Jul 20 2009 Bill Nottingham <notting@redhat.com> - 4.7.0-9
+- enable XZ support
+
+* Thu Jun 18 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-8
+- updated OSGi dependency extractor (#506471)
+- fix segfault in symlink fingerprinting (#505777)
+- fix invalid memory access causing bogus file dependency errors (#506323)
+
+* Tue Jun 16 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-7
+- add dwarf-3 support to debugedit (#505774)
+
+* Fri Jun 12 2009 Stepan Kasal <skasal@redhat.com> - 4.7.0-6
+- require libcap >= 2.16 (#505596)
+
+* Tue Jun 03 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-5
+- don't mess up problem altNEVR in python ts.check() (#501068)
+- fix hardlink size calculation on build (#503020)
+
+* Thu May 14 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-4
+- split cron-job into a sub-package to avoid silly deps on core rpm (#500722)
+- rpm requires coreutils but not in %%post
+- build with libcap and libacl
+- fix pgp pubkey signature tag parsing
+
+* Tue Apr 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-3
+- couple of merge-review fixes (#226377)
+ - eliminate bogus leftover rpm:rpm rpmdb ownership
+ - unescaped macro in changelog
+- fix find-lang --with-kde with KDE3 (#466009)
+- switch back to default file digest algorithm
+
+* Fri Apr 17 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-2
+- file classification tweaks for text files (#494817)
+ - disable libmagic text token checks, it's way too error-prone
+ - consistently classify all text as such and include description
+
+* Thu Apr 16 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-1
+- update to 4.7.0 final (http://rpm.org/wiki/Releases/4.7.0)
+- fixes #494049, #495429
+- dont permit test-suite failure anymore
+
+* Thu Apr 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.rc1.1
+- update to 4.7.0-rc1
+- fixes #493157, #493777, #493696, #491388, #487597, #493162
+
+* Fri Apr 03 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.9
+- fix recorded file state of otherwise skipped files (#492947)
+- compress ChangeLog, drop old CHANGES file (#492440)
+
+* Thu Apr 2 2009 Tom "spot" Callaway <tcallawa@redhat.com> - 4.7.0-0.beta1.8
+- Fix sparcv9v and sparc64v targets
+
+* Tue Mar 24 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.7
+- prefer more specific types over generic "text" in classification (#491349)
+
+* Mon Mar 23 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.6
+- with the fd leak gone, let libmagic look into compressed files again (#491596)
+
+* Mon Mar 23 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.5
+- fix font provide generation on filenames with whitespace (#491597)
+
+* Thu Mar 12 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.4
+- handle RSA V4 signatures (#436812)
+- add alpha arch ISA-bits
+- enable internal testsuite on build
+
+* Mon Mar 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.3
+- fix _install_langs behavior (#489235)
+- fix recording of file states into rpmdb on install
+
+* Sun Mar 08 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.2
+- load macros before creating directories on src.rpm install (#489104)
+
+* Fri Mar 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.1
+- update to 4.7.0-beta1 (http://rpm.org/wiki/Releases/4.7.0)
+
+* Fri Feb 27 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-11
+- build rpm itself with md5 file digests for now to ensure upgradability
+
+* Thu Feb 26 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-10
+- handle NULL passed as EVR in rpmdsSingle() again (#485616)
+
+* Wed Feb 25 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-9
+- pull out python byte-compile syntax check for now
+
+* Mon Feb 23 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-8
+- make -apidocs sub-package noarch
+- fix source URL
+
+* Sat Feb 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-7
+- loosen up restrictions on dependency names (#455119)
+- handle inter-dependent pkg-config files for requires too (#473814)
+- error/warn on elf binaries in noarch package in build
+
+* Fri Feb 20 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-6
+- error out on uncompilable python code (Tim Waugh)
+
+* Tue Feb 17 2009 Jindrich Novy <jnovy@redhat.com> - 4.6.0-5
+- remove two offending hunks from anyarch patch causing that
+ RPMTAG_BUILDARCHS isn't written to SRPMs
+
+* Mon Feb 16 2009 Jindrich Novy <jnovy@redhat.com> - 4.6.0-4
+- inherit group tag from the main package (#470714)
+- ignore BuildArch tags for anyarch actions (#442105)
+- don't check package BuildRequires when doing --rmsource (#452477)
+- don't fail because of missing sources when only spec removal
+ is requested (#472427)
+
+* Mon Feb 16 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-3
+- updated fontconfig provide script - fc-query does all the hard work now
+
+* Mon Feb 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-2
+- build against db 4.7.x
+
+* Fri Feb 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-1
+- update to 4.6.0 final
+- revert libmagic looking into compressed files for now, breaks ooffice build
+
+* Fri Feb 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.5
+- enable fontconfig provides generation
+
+* Thu Feb 05 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.4
+- fixup rpm translation lookup to match Fedora specspo (#436941)
+
+* Wed Feb 04 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.3
+- extract mimehandler provides from .desktop files
+- preliminaries for extracting font provides (not enabled yet)
+- dont classify font metrics data as fonts
+- only run script dep extraction once per file, duh
+
+* Sat Jan 31 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.2
+- change platform sharedstatedir to something more sensible (#185862)
+- add rpmdb_foo links to db utils for documentation compatibility
+
+* Fri Jan 30 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.1
+- update to 4.6.0-rc4
+- fixes #475582, #478907, #476737, #479869, #476201
+
+* Fri Dec 12 2008 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc3.2
+- add back defaultdocdir patch which hadn't been applied on 4.6.x branch yet
+
+* Fri Dec 12 2008 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc3.1
+- add dist-tag, rebuild
+
+* Tue Dec 09 2008 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc3.1
+- update to rpm 4.6.0-rc3
+- fixes #475214, #474550, #473239
+
+* Wed Dec 3 2008 Jeremy Katz <katzj@redhat.com> - 4.6.0-0.rc2.9
+- I built into the wrong place
+
+* Wed Dec 3 2008 Jeremy Katz <katzj@redhat.com> - 4.6.0-0.rc2.8
+- python 2.6 rebuild again
+
+* Wed Dec 03 2008 Panu Matilainen <pmatilai@redhat.com>
+- make rpm-build require pkgconfig (#473978)
+
+* Tue Dec 02 2008 Panu Matilainen <pmatilai@redhat.com>
+- fix pkg-config provide generation when pc's depend on each other (#473814)
+
+* Mon Dec 01 2008 Jindrich Novy <jnovy@redhat.com>
+- include rpmfileutil.h from rpmmacro.h, unbreaks
+ net-snmp (#473420)
+
+* Sun Nov 30 2008 Panu Matilainen <pmatilai@redhat.com>
+- rebuild for python 2.6
+
+* Sat Nov 29 2008 Panu Matilainen <pmatilai@redhat.com>
+- update to 4.6.0-rc2
+- fixes #471820, #473167, #469355, #468319, #472507, #247374, #426672, #444661
+- enable automatic generation of pkg-config and libtool dependencies #465377
+
+* Fri Oct 31 2008 Panu Matilainen <pmatilai@redhat.com>
+- adjust find-debuginfo for "file" output change (#468129)
+
+* Tue Oct 28 2008 Panu Matilainen <pmatilai@redhat.com>
+- Florian's improved fingerprinting hash algorithm from upstream
+
+* Sat Oct 25 2008 Panu Matilainen <pmatilai@redhat.com>
+- Make noarch sub-packages actually work
+- Fix defaultdocdir logic in installplatform to avoid hardwiring mandir
+
+* Fri Oct 24 2008 Jindrich Novy <jnovy@redhat.com>
+- update compat-db dependencies (#459710)
+
+* Wed Oct 22 2008 Panu Matilainen <pmatilai@redhat.com>
+- never add identical NEVRA to transaction more than once (#467822)
+
+* Sun Oct 19 2008 Panu Matilainen <pmatilai@redhat.com>
+- permit tab as macro argument separator (#467567)
+
+* Thu Oct 16 2008 Panu Matilainen <pmatilai@redhat.com>
+- update to 4.6.0-rc1
+- fixes #465586, #466597, #465409, #216221, #466503, #466009, #463447...
+- avoid using %%configure macro for now, it has unwanted side-effects on rpm
+
+* Wed Oct 01 2008 Panu Matilainen <pmatilai@redhat.com>
+- update to official 4.5.90 alpha tarball
+- a big pile of misc bugfixes + translation updates
+- isa-macro generation fix for ppc (#464754)
+- avoid pulling in pile of perl dependencies for an unused script
+- handle both "invalid argument" and clear env version mismatch on posttrans
+
+* Thu Sep 25 2008 Jindrich Novy <jnovy@redhat.com>
+- don't treat %%patch numberless if -P parameter is present (#463942)
+
+* Thu Sep 11 2008 Panu Matilainen <pmatilai@redhat.com>
+- add hack to support extracting gstreamer plugin provides (#438225)
+- fix another macro argument handling regression (#461180)
+
+* Thu Sep 11 2008 Jindrich Novy <jnovy@redhat.com>
+- create directory structure for rpmbuild prior to build if it doesn't exist (#455387)
+- create _topdir if it doesn't exist when installing SRPM
+- don't generate broken cpio in case of hardlink pointing on softlink,
+ thanks to pixel@mandriva.com
+
+* Sat Sep 06 2008 Jindrich Novy <jnovy@redhat.com>
+- fail hard if patch isn't found (#461347)
+
+* Mon Sep 01 2008 Jindrich Novy <jnovy@redhat.com>
+- fix parsing of boolean expressions in spec (#456103)
+ (unbreaks pam, jpilot and maybe other builds)
+
+* Tue Aug 26 2008 Jindrich Novy <jnovy@redhat.com>
+- add support for noarch subpackages
+- fix segfault in case of insufficient disk space detected (#460146)
+
+* Wed Aug 13 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8461.2
+- fix archivesize tag generation on ppc (#458817)
+
+* Fri Aug 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8461.1
+- new snapshot from upstream
+- fixes #68290, #455972, #446202, #453364, #456708, #456103, #456321, #456913,
+ #458260, #458261
+- partial fix for #457360
+
+* Thu Jul 31 2008 Florian Festi <ffesti@redhat.com>
+- 4.5.90-0.git8427.1
+- new snapshot from upstream
+
+* Thu Jul 31 2008 Florian Festi <ffesti@redhat.com>
+- 4.5.90-0.git8426.10
+- rpm-4.5.90-posttrans.patch
+- use header from rpmdb in posttrans to make anaconda happy
+
+* Sat Jul 19 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.9
+- fix regression in patch number handling (#455872)
+
+* Tue Jul 15 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.8
+- fix regression in macro argument handling (#455333)
+
+* Mon Jul 14 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.7
+- fix mono dependency extraction (adjust for libmagic string change)
+
+* Sat Jul 12 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.6
+- fix type mismatch causing funky breakage on ppc64
+
+* Fri Jul 11 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.5
+- flip back to external bdb
+- fix tab vs spaces complaints from rpmlint
+- add dep for lzma and require unzip instead of zip in build (#310694)
+- add pkgconfig dependency to rpm-devel
+- drop ISA-dependencies for initial introduction
+- new snapshot from upstream for documentation fixes
+
+* Thu Jul 10 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8424.4
+- handle int vs external db in posttrans too
+
+* Wed Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8424.3
+- require curl as external url helper
+
+* Wed Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8424.2
+- add support for building with or without internal db
+
+* Wed Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- rpm 4.5.90-0.git8424.1 (alpha snapshot)
+- adjust to build against Berkeley DB 4.5.20 from compat-db for now
+- add posttrans to clean up db environment mismatch after upgrade
+- forward-port devel autodeps patch
+
+* Tue Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- adjust for rpmdb index name change
+- drop unnecessary vendor-macro patch for real
+- add ISA-dependencies among rpm subpackages
+- make lzma and sqlite deps conditional and disabled by default for now
+
+* Fri Feb 01 2008 Panu Matilainen <pmatilai@redhat.com>
+- spec largely rewritten, truncating changelog
--- /dev/null
+# build against xz?
+%bcond_without xz
+# just for giggles, option to build with internal Berkeley DB
+%bcond_with int_bdb
+# run internal testsuite?
+%bcond_without check
+# disable plugins initially
+%bcond_with plugins
+
+%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
+
+%define rpmhome /usr/lib/rpm
+
+%define rpmver 4.10.2
+%define srcver %{rpmver}%{?snapver:-%{snapver}}
+
+%define bdbname libdb
+%define bdbver 5.3.15
+%define dbprefix db
+
+Summary: The RPM package management system
+Name: rpm
+Version: %{rpmver}
+Release: %{?snapver:0.%{snapver}.}1%{?dist}
+Group: System Environment/Base
+Url: http://www.rpm.org/
+Source0: http://rpm.org/releases/rpm-4.10.x/%{name}-%{srcver}.tar.bz2
+%if %{with int_bdb}
+Source1: db-%{bdbver}.tar.gz
+%else
+BuildRequires: libdb-devel
+%endif
+Source10: libsymlink.attr
+
+Patch1: rpm-4.5.90-pkgconfig-path.patch
+# Fedora specspo is setup differently than what rpm expects, considering
+# this as Fedora-specific patch for now
+Patch2: rpm-4.9.90-fedora-specspo.patch
+# In current Fedora, man-pages pkg owns all the localized man directories
+Patch3: rpm-4.9.90-no-man-dirs.patch
+# gnupg2 comes installed by default, avoid need to drag in gnupg too
+Patch4: rpm-4.8.1-use-gpg2.patch
+Patch5: rpm-4.9.90-armhfp.patch
+#conditionally applied patch for arm hardware floating point
+Patch6: rpm-4.9.0-armhfp-logic.patch
+
+# Patches already in upstream
+
+# These are not yet upstream
+Patch301: rpm-4.6.0-niagara.patch
+Patch302: rpm-4.7.1-geode-i686.patch
+# Probably to be upstreamed in slightly different form
+Patch304: rpm-4.9.1.1-ld-flags.patch
+# Compressed debuginfo support (#833311)
+Patch305: rpm-4.10.0-dwz-debuginfo.patch
+# Minidebuginfo support (#834073)
+Patch306: rpm-4.10.0-minidebuginfo.patch
+# Temporary Patch to provide support for updates
+Patch400: rpm-4.9.1.2-rpmlib-filesystem-check.patch
+
+# Partially GPL/LGPL dual-licensed and some bits with BSD
+# SourceLicense: (GPLv2+ and LGPLv2+ with exceptions) and BSD
+License: GPLv2+
+
+Requires: coreutils
+%if %{without int_bdb}
+# db recovery tools, rpmdb_util symlinks
+Requires: %{_bindir}/%{dbprefix}_stat
+%endif
+Requires: popt%{_isa} >= 1.10.2.1
+Requires: curl
+
+%if %{without int_bdb}
+BuildRequires: %{bdbname}-devel%{_isa}
+%endif
+
+%if %{with check}
+BuildRequires: fakechroot
+%endif
+
+# XXX generally assumed to be installed but make it explicit as rpm
+# is a bit special...
+BuildRequires: redhat-rpm-config
+BuildRequires: gawk
+BuildRequires: elfutils-devel%{_isa} >= 0.112
+BuildRequires: elfutils-libelf-devel%{_isa}
+BuildRequires: readline-devel%{_isa} zlib-devel%{_isa}
+BuildRequires: nss-devel%{_isa}
+BuildRequires: nss-softokn-freebl-devel%{_isa}
+# The popt version here just documents an older known-good version
+BuildRequires: popt-devel%{_isa} >= 1.10.2
+BuildRequires: file-devel%{_isa}
+BuildRequires: gettext-devel%{_isa}
+BuildRequires: libselinux-devel%{_isa}
+# XXX semanage is only used by sepolicy plugin but configure requires it...
+BuildRequires: libsemanage-devel%{_isa}
+BuildRequires: ncurses-devel%{_isa}
+BuildRequires: bzip2-devel%{_isa} >= 0.9.0c-2
+BuildRequires: python-devel%{_isa} >= 2.6
+BuildRequires: lua-devel%{_isa} >= 5.1
+BuildRequires: libcap-devel%{_isa}
+BuildRequires: libacl-devel%{_isa}
+%if ! %{without xz}
+BuildRequires: xz-devel%{_isa} >= 4.999.8
+%endif
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+%description
+The RPM Package Manager (RPM) is a powerful command line driven
+package management system capable of installing, uninstalling,
+verifying, querying, and updating software packages. Each software
+package consists of an archive of files along with information about
+the package like its version, a description, etc.
+
+%package libs
+Summary: Libraries for manipulating RPM packages
+Group: Development/Libraries
+License: GPLv2+ and LGPLv2+ with exceptions
+Requires: rpm = %{version}-%{release}
+# librpm uses cap_compare, introduced sometimes between libcap 2.10 and 2.16.
+# A manual require is needed, see #505596
+Requires: libcap%{_isa} >= 2.16
+
+%description libs
+This package contains the RPM shared libraries.
+
+%package build-libs
+Summary: Libraries for building and signing RPM packages
+Group: Development/Libraries
+License: GPLv2+ and LGPLv2+ with exceptions
+Requires: rpm-libs%{_isa} = %{version}-%{release}
+Requires: %{_bindir}/gpg2
+
+%description build-libs
+This package contains the RPM shared libraries for building and signing
+packages.
+
+%package devel
+Summary: Development files for manipulating RPM packages
+Group: Development/Libraries
+License: GPLv2+ and LGPLv2+ with exceptions
+Requires: rpm = %{version}-%{release}
+Requires: rpm-libs%{_isa} = %{version}-%{release}
+Requires: rpm-build-libs%{_isa} = %{version}-%{release}
+Requires: popt-devel%{_isa}
+
+%description devel
+This package contains the RPM C library and header files. These
+development files will simplify the process of writing programs that
+manipulate RPM packages and databases. These files are intended to
+simplify the process of creating graphical package managers or any
+other tools that need an intimate knowledge of RPM packages in order
+to function.
+
+This package should be installed if you want to develop programs that
+will manipulate RPM packages and databases.
+
+%package build
+Summary: Scripts and executable programs used to build packages
+Group: Development/Tools
+Requires: rpm = %{version}-%{release}
+Requires: elfutils >= 0.128 binutils
+Requires: findutils sed grep gawk diffutils file patch >= 2.5
+Requires: unzip gzip bzip2 cpio xz
+Requires: pkgconfig >= 1:0.24
+Requires: /usr/bin/gdb-add-index
+Conflicts: ocaml-runtime < 3.11.1-7
+
+%description build
+The rpm-build package contains the scripts and executable programs
+that are used to build packages using the RPM Package Manager.
+
+%package sign
+Summary: Package signing support
+Group: System Environment/Base
+Requires: rpm-build-libs%{_isa} = %{version}-%{release}
+
+%description sign
+This package contains support for digitally signing RPM packages.
+
+%package python
+Summary: Python bindings for apps which will manipulate RPM packages
+Group: Development/Libraries
+Requires: rpm = %{version}-%{release}
+
+%description python
+The rpm-python package contains a module that permits applications
+written in the Python programming language to use the interface
+supplied by RPM Package Manager libraries.
+
+This package should be installed if you want to develop Python
+programs that will manipulate RPM packages and databases.
+
+%package apidocs
+Summary: API documentation for RPM libraries
+Group: Documentation
+BuildArch: noarch
+
+%description apidocs
+This package contains API documentation for developing applications
+that will manipulate RPM packages and databases.
+
+%package cron
+Summary: Create daily logs of installed packages.
+Group: System Environment/Base
+BuildArch: noarch
+Requires: crontabs logrotate rpm = %{version}-%{release}
+
+%description cron
+This package contains a cron job which creates daily logs of installed
+packages on a system.
+
+%prep
+%setup -q -n %{name}-%{srcver} %{?with_int_bdb:-a 1}
+%patch1 -p1 -b .pkgconfig-path
+%patch2 -p1 -b .fedora-specspo
+%patch3 -p1 -b .no-man-dirs
+%patch4 -p1 -b .use-gpg2
+
+%patch301 -p1 -b .niagara
+%patch302 -p1 -b .geode
+%patch304 -p1 -b .ldflags
+%patch305 -p1 -b .dwz-debuginfo
+%patch306 -p1 -b .minidebuginfo
+
+%patch400 -p1 -b .rpmlib-filesystem-check
+
+%patch5 -p1 -b .armhfp
+# this patch cant be applied on softfp builds
+%ifnarch armv3l armv4b armv4l armv4tl armv5tel armv5tejl armv6l armv7l
+%patch6 -p1 -b .armhfp-logic
+%endif
+
+%if %{with int_bdb}
+ln -s db-%{bdbver} db
+%endif
+
+%build
+%if %{without int_bdb}
+#CPPFLAGS=-I%{_includedir}/db%{bdbver}
+#LDFLAGS=-L%{_libdir}/db%{bdbver}
+%endif
+CPPFLAGS="$CPPFLAGS `pkg-config --cflags nss`"
+CFLAGS="$RPM_OPT_FLAGS"
+export CPPFLAGS CFLAGS LDFLAGS
+
+# Using configure macro has some unwanted side-effects on rpm platform
+# setup, use the old-fashioned way for now only defining minimal paths.
+./configure \
+ --prefix=%{_usr} \
+ --sysconfdir=%{_sysconfdir} \
+ --localstatedir=%{_var} \
+ --sharedstatedir=%{_var}/lib \
+ --libdir=%{_libdir} \
+ --build=%{_target_platform} \
+ --host=%{_target_platform} \
+ --with-vendor=redhat \
+ %{!?with_int_bdb: --with-external-db} \
+ %{!?with_plugins: --disable-plugins} \
+ --with-lua \
+ --with-selinux \
+ --with-cap \
+ --with-acl \
+ --enable-python
+
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make DESTDIR="$RPM_BUILD_ROOT" install
+
+# Save list of packages through cron
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/cron.daily
+install -m 755 scripts/rpm.daily ${RPM_BUILD_ROOT}%{_sysconfdir}/cron.daily/rpm
+
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d
+install -m 644 scripts/rpm.log ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/rpm
+
+mkdir -p ${RPM_BUILD_ROOT}/usr/lib/tmpfiles.d
+echo "r /var/lib/rpm/__db.*" > ${RPM_BUILD_ROOT}/usr/lib/tmpfiles.d/rpm.conf
+
+mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rpm
+
+install -m 644 %{SOURCE10} ${RPM_BUILD_ROOT}%{rpmhome}/fileattrs/libsymlink.attr
+
+mkdir -p $RPM_BUILD_ROOT/var/lib/rpm
+for dbi in \
+ Basenames Conflictname Dirnames Group Installtid Name Obsoletename \
+ Packages Providename Requirename Triggername Sha1header Sigmd5 \
+ __db.001 __db.002 __db.003 __db.004 __db.005 __db.006 __db.007 \
+ __db.008 __db.009
+do
+ touch $RPM_BUILD_ROOT/var/lib/rpm/$dbi
+done
+
+# plant links to relevant db utils as rpmdb_foo for documention compatibility
+%if %{without int_bdb}
+for dbutil in dump load recover stat upgrade verify
+do
+ ln -s ../../bin/%{dbprefix}_${dbutil} $RPM_BUILD_ROOT/%{rpmhome}/rpmdb_${dbutil}
+done
+%endif
+
+%find_lang %{name}
+
+find $RPM_BUILD_ROOT -name "*.la"|xargs rm -f
+
+# avoid dragging in tonne of perl libs for an unused script
+chmod 0644 $RPM_BUILD_ROOT/%{rpmhome}/perldeps.pl
+
+# compress our ChangeLog, it's fairly big...
+bzip2 -9 ChangeLog
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%if %{with check}
+%check
+make check
+[ "$(ls -A tests/rpmtests.dir)" ] && cat tests/rpmtests.log
+%endif
+
+%post libs -p /sbin/ldconfig
+%postun libs -p /sbin/ldconfig
+
+%post build-libs -p /sbin/ldconfig
+%postun build-libs -p /sbin/ldconfig
+
+%posttrans
+# XXX this is klunky and ugly, rpm itself should handle this
+dbstat=/usr/lib/rpm/rpmdb_stat
+if [ -x "$dbstat" ]; then
+ if "$dbstat" -e -h /var/lib/rpm 2>&1 | grep -q "doesn't match library version \| Invalid argument"; then
+ rm -f /var/lib/rpm/__db.*
+ fi
+fi
+exit 0
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%doc GROUPS COPYING CREDITS ChangeLog.bz2 doc/manual/[a-z]*
+
+/usr/lib/tmpfiles.d/rpm.conf
+%dir %{_sysconfdir}/rpm
+
+%attr(0755, root, root) %dir /var/lib/rpm
+%attr(0644, root, root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/lib/rpm/*
+
+/bin/rpm
+%{_bindir}/rpm2cpio
+%{_bindir}/rpmdb
+%{_bindir}/rpmkeys
+%{_bindir}/rpmquery
+%{_bindir}/rpmverify
+
+%{_mandir}/man8/rpm.8*
+%{_mandir}/man8/rpmdb.8*
+%{_mandir}/man8/rpmkeys.8*
+%{_mandir}/man8/rpm2cpio.8*
+
+# XXX this places translated manuals to wrong package wrt eg rpmbuild
+%lang(fr) %{_mandir}/fr/man[18]/*.[18]*
+%lang(ko) %{_mandir}/ko/man[18]/*.[18]*
+%lang(ja) %{_mandir}/ja/man[18]/*.[18]*
+%lang(pl) %{_mandir}/pl/man[18]/*.[18]*
+%lang(ru) %{_mandir}/ru/man[18]/*.[18]*
+%lang(sk) %{_mandir}/sk/man[18]/*.[18]*
+
+%attr(0755, root, root) %dir %{rpmhome}
+%{rpmhome}/macros
+%{rpmhome}/rpmpopt*
+%{rpmhome}/rpmrc
+
+%{rpmhome}/rpmdb_*
+%{rpmhome}/rpm.daily
+%{rpmhome}/rpm.log
+%{rpmhome}/rpm.supp
+%{rpmhome}/rpm2cpio.sh
+%{rpmhome}/tgpg
+
+%{rpmhome}/platform
+
+%files libs
+%defattr(-,root,root)
+%{_libdir}/librpmio.so.*
+%{_libdir}/librpm.so.*
+%if %{with plugins}
+%{_libdir}/rpm-plugins
+%endif
+
+%files build-libs
+%defattr(-,root,root)
+%{_libdir}/librpmbuild.so.*
+%{_libdir}/librpmsign.so.*
+
+%files build
+%defattr(-,root,root)
+%{_bindir}/rpmbuild
+%{_bindir}/gendiff
+%{_bindir}/rpmspec
+
+%{_mandir}/man1/gendiff.1*
+%{_mandir}/man8/rpmbuild.8*
+%{_mandir}/man8/rpmdeps.8*
+%{_mandir}/man8/rpmspec.8*
+
+%{rpmhome}/brp-*
+%{rpmhome}/check-*
+%{rpmhome}/debugedit
+%{rpmhome}/find-debuginfo.sh
+%{rpmhome}/find-lang.sh
+%{rpmhome}/*provides*
+%{rpmhome}/*requires*
+%{rpmhome}/*deps*
+%{rpmhome}/*.prov
+%{rpmhome}/*.req
+%{rpmhome}/config.*
+%{rpmhome}/mkinstalldirs
+%{rpmhome}/macros.*
+%{rpmhome}/fileattrs
+
+%files sign
+%defattr(-,root,root)
+%{_bindir}/rpmsign
+%{_mandir}/man8/rpmsign.8*
+
+%files python
+%defattr(-,root,root)
+%{python_sitearch}/rpm
+
+%files devel
+%defattr(-,root,root)
+%{_mandir}/man8/rpmgraph.8*
+%{_bindir}/rpmgraph
+%{_libdir}/librp*[a-z].so
+%{_libdir}/pkgconfig/rpm.pc
+%{_includedir}/rpm
+
+%files cron
+%defattr(-,root,root)
+%{_sysconfdir}/cron.daily/rpm
+%config(noreplace) %{_sysconfdir}/logrotate.d/rpm
+
+%files apidocs
+%defattr(-,root,root)
+%doc COPYING doc/librpm/html/*
+
+%changelog
+* Mon Dec 10 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.2-1
+- update to 4.10.2 (http://rpm.org/wiki/Releases/4.10.2)
+
+* Thu Oct 11 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.1-3
+- fix noarch __isa_* macro filter in installplatform (#865436)
+
+* Wed Oct 10 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.1-2
+- account for intentionally skipped files when verifying hardlinks (#864622)
+
+* Wed Oct 03 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.1-1
+- update to 4.10.1 ((http://rpm.org/wiki/Releases/4.10.1)
+
+* Mon Jul 30 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-6
+- move our tmpfiles config to more politically correct location (#840192)
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.10.0-5.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Mon Jul 02 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-5
+- force _host_vendor to redhat to better match toolchain etc (#485203)
+
+* Thu Jun 28 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-4
+- merge ppc64p7 related fixes that only went into f17 (#835978)
+
+* Wed Jun 27 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-3
+- add support for minidebuginfo generation (#834073)
+
+* Mon Jun 25 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-2
+- add dwarf compression support to debuginfo generation (#833311)
+
+* Thu May 24 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-1
+- update to 4.10.0 final
+
+* Mon Apr 23 2012 Panu Matilainen <pmatilai@redhat.com> - 4.10.0-0.beta1.1
+- update to 4.10.0-beta1
+
+* Mon Apr 16 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11536.1
+- newer git snapshot (#809402, #808750)
+- adjust posttrans script wrt bdb string change (#803866, #805613)
+
+* Thu Apr 05 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11519.1
+- newer git snapshot to keep patch-count down
+- fixes CVE-2012-0060, CVE-2012-0061 and CVE-2012-0815
+- fix obsoletes in installing set getting matched on provides (#810077)
+
+* Wed Apr 04 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.90-0.git11505.12
+- rebuild against new libdb
+
+* Tue Apr 03 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.90-0.git11505.11
+- build with internal libdb to allow libdb build with higher soname
+
+* Fri Mar 30 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.10
+- fix base arch macro generation (#808250)
+
+* Thu Mar 29 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.9
+- accept files as command line arguments to rpmdeps again (#807767)
+
+* Mon Mar 26 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.8
+- remove fake library provide hacks now that deltarpm got rebuilt
+
+* Fri Mar 23 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.7
+- fix header data length calculation breakage
+
+* Thu Mar 22 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.6
+- fix keyid size bogosity causing breakage on 32bit systems
+
+* Wed Mar 21 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.5
+- add temporary fake library provides to get around deltarpm "bootstrap"
+ dependency (yes its dirty)
+
+* Wed Mar 21 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.4
+- fix overzealous sanity check breaking posttrans scripts
+
+* Tue Mar 20 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.3
+- fix bad interaction with yum's test-transaction and pretrans scripts
+
+* Tue Mar 20 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.90-0.git11505.2
+- rebuild
+
+* Tue Mar 20 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.90-0.git11505.1
+- update to 4.10.0 alpha (http://rpm.org/wiki/Releases/4.10.0)
+- drop/adjust patches as necessary
+
+* Wed Mar 07 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-14
+- fix backport thinko in the exclude patch
+
+* Wed Mar 07 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-13
+- fix memory corruption on rpmdb size estimation (#766260)
+- fix couple of memleaks in python bindings (#782147)
+- fix regression in verify output formatting (#797964)
+- dont process spec include in false branch of if (#782970)
+- only warn on missing excluded files on build (#745629)
+- dont free up file info sets on test transactions
+
+* Thu Feb 09 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-12
+- switch back to smaller BDB cache default (#752897)
+
+* Sun Jan 15 2012 Dennis Gilmore <dennis@ausil.us> - 4.9.1.2-11
+- always apply arm hfp macros, conditionally apply the logic to detect hfp
+
+* Tue Jan 10 2012 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-10
+- adjust perl and python detection rules for libmagic change (#772699)
+
+* Mon Jan 09 2012 Jindrich Novy <jnovy@redhat.com> - 4.9.1.2-9
+- recognize perl script as perl code (#772632)
+
+* Tue Dec 20 2011 Kay Sievers <kay@redhat.com> - 4.9.1.2-8
+- add temporary rpmlib patch to support filesystem transition
+ https://fedoraproject.org/wiki/Features/UsrMove
+
+* Fri Dec 02 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-7
+- switch over to libdb, aka Berkeley DB 5.x
+
+* Thu Dec 01 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-6
+- fix classification of ELF binaries with setuid/setgid bit (#758251)
+
+* Fri Nov 25 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-5
+- adjust font detection rules for libmagic change (#757105)
+
+* Wed Nov 09 2011 Dennis Gilmore <dennis@ausil.us> - 4.9.1.2-4
+- conditionally apply arm patch for hardfp on all arches but arm softfp ones
+
+* Fri Oct 28 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-3
+- adjust db util prefix & dependency due to #749293
+- warn but dont fail the build if STABS encountered by debugedit (#725378)
+
+* Wed Oct 12 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-2
+- try teaching find-lang about the new gnome help layout (#736523)
+
+* Thu Sep 29 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.2-1
+- update to 4.9.1.2 (CVE-2011-3378)
+- drop upstreamed rpmdb signal patch
+
+* Mon Sep 19 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.1-3
+- fix signal blocking/unblocking regression on rpmdb open/close (#739492)
+
+* Mon Aug 08 2011 Adam Jackson <ajax@redhat.com> 4.9.1.1-2
+- Add RPM_LD_FLAGS to build environment (#728974)
+
+* Tue Aug 02 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1.1-1
+- update to 4.9.1.1
+
+* Tue Jul 19 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1-2
+- fix recursion of directories with trailing slash in file list (#722474)
+
+* Fri Jul 15 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.1-1
+- update to 4.9.1 (http://rpm.org/wiki/Releases/4.9.1)
+- drop no longer needed patches
+
+* Thu Jun 16 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-10
+- rebuild to fix a missing interpreter dependency due to bug #712251
+
+* Fri Jun 10 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-9
+- fix crash if prep or changelog section in spec is empty (#706959)
+- fix crash on macro which undefines itself
+- fix script dependency generation with file 5.07 string changes (#712251)
+
+* Thu May 26 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-8
+- add dwarf-4 support to debugedit (#707677)
+- generate build-id symlinks for all filenames sharing a build-id (#641377)
+
+* Thu Apr 07 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-7
+- add missing ldconfig calls to build-libs sub-package
+- fix source url
+
+* Thu Apr 07 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-6
+- revert the spec query change (#693338) for now, it breaks fedpkg
+
+* Tue Apr 05 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-5
+- verify some properties of replaced and wrong-colored files (#528383)
+- only list packages that would be generated on spec query (#693338)
+- preferred color packages should be erased last (#680261)
+- fix leaks when freeing a populated transaction set
+- take file state into account for file dependencies
+
+* Tue Mar 22 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-4
+- fix classification of elf executables with sticky bit set (#689182)
+
+* Wed Mar 16 2011 Jindirch Novy <jnovy@redhat.com> - 4.9.0-3
+- fix crash in package manifest check (#688091)
+
+* Fri Mar 04 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-2
+- fix duplicate rpmsign binary in rpm main package dragging in build-libs
+
+* Wed Mar 02 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-1
+- update to 4.9.0 final
+- drop upstreamed patches
+
+* Tue Mar 01 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.4
+- spec cosmetics clean up extra whitespace + group more logically
+- wipe out BDB environment at boot via tmpfiles.d
+
+* Mon Feb 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.3
+- fix erronous double cursor open, causing yum reinstall hang (#678644)
+
+* Mon Feb 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.2
+- fix broken logic in depgen collector, hopefully curing #675002
+
+* Tue Feb 15 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.rc1.1
+- update to 4.9.0-rc1
+- drop upstream patches
+- nss packaging has changed, buildrequire nss-softokn-freebl-devel
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.9.0-0.beta1.7.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Feb 07 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.7
+- fix segfault when building more than one package at a time (#675565)
+
+* Sun Feb 06 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.6
+- adjust ocaml rule for libmagic string change
+
+* Mon Jan 31 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.5
+- dont try to remove environment files if private env used (related to #671200)
+- unbreak mono dependency extraction (#673663)
+- complain instead of silent abort if cwd is not readable (#672576)
+
+* Tue Jan 25 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.4
+- add support for Requires(posttrans) dependencies
+
+* Fri Jan 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.3
+- avoid division by zero in rpmdb size calculation (#671056)
+- fix secondary index iteration returing duplicate at end (#671149)
+- fix rebuilddb creating duplicate indexes for first header
+
+* Fri Jan 21 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.2
+- permit queries from rpmdb on read-only media (#671200)
+
+* Tue Jan 18 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-0.beta1.1
+- rpm 4.9.0-beta1 (http://rpm.org/wiki/Releases/4.9.0)
+ - drop no longer needed patches
+ - adjust requires + buildrequires to match current needs
+ - adjust rpmdb index ghosts to match the new release
+ - split librpmbuild and librpmsign to a separate rpm-build-libs package
+ - split rpmsign to its own package to allow signing without all the build goo
+ - build-conditionalize plugins, disabled for now
+ - gstreamer and printer dependency generation moving out
+ - handle .so symlink dependencies with fileattrs
+ - use gnupg2 for signing as that's what typically installed by default
+
+* Tue Jan 18 2011 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-7
+- bunch of spec tweaks, cleanups + corrections:
+ - shorten rpm-build filelist a bit with glob use, reorder for saner grouping
+ - missing isa in popt version dependency
+ - only add rpmdb_foo symlinks for actually relevant db_* utils
+ - drop no longer necessary file-devel dependency from rpm-devel
+ - drop sqlite backend build-conditional
+ - preliminaries for moving from db4 to libdb
+- use gnupg2 for signing as that's more likely to be installed by default
+
+* Mon Oct 25 2010 Jindrich Novy <jnovy@redhat.com> - 4.8.1-6
+- rebuild with new xz-5.0.0
+
+* Tue Aug 10 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-5
+- create gdb index on debuginfo generation (#617166)
+- rpm-build now requires /usr/bin/gdb-add-index for consistent index creation
+- include COPYING in -apidocs for licensing guidelines compliance
+
+* Thu Jul 22 2010 David Malcolm <dmalcolm@redhat.com> - 4.8.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild
+
+* Fri Jul 02 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-3
+- ugh, reversed condition braindamage in the font provide extractor "fix"
+
+* Wed Jun 30 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-2
+- fix a potential getOutputFrom() error from font provide extraction
+- debug-friendlier message to aid finding other similar cases (#565223)
+
+* Fri Jun 11 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.1-1
+- update to 4.8.1 (http://rpm.org/wiki/Releases/4.8.1)
+- drop no longer needed patches
+- fix source url pointing to testing directory
+
+* Thu Jun 03 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-19
+- also strip POSIX file capabilities from hardlinks on upgrade/erase (#598775)
+
+* Wed Jun 02 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-18
+- remove s-bits on upgrade too (#598775)
+
+* Thu May 27 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-17
+- fix segfault in spec parser (#597835)
+
+* Thu May 27 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-16
+- adjust to new pkg-config behavior wrt private dependencies (#596433)
+- rpm-build now requires pkgconfig >= 0.24
+
+* Fri May 21 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-15
+- handle non-existent dependency sets correctly in python (#593553)
+- make find-lang look in all locale dirs (#584866)
+
+* Fri Apr 23 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-14
+- lose dangling symlink to extinct (and useless) berkeley_db_svc (#585174)
+
+* Wed Mar 24 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-13
+- fix python match iterator regression wrt boolean representation
+
+* Wed Mar 17 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-12
+- unbreak find-lang --with-man from yesterdays braindamage
+
+* Tue Mar 16 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-11
+- support single PPD providing driver for devices (#568351)
+- merge the psdriver patch pile into one
+- preserve empty lines in spec prep section (#573339)
+- teach python bindings about RPMTRANS_FLAG_NOCONTEXTS (related to #573111)
+- dont own localized man directories through find_lang (#569536)
+
+* Mon Feb 15 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-10
+- drop bogus dependency on lzma, xz is used to handle the lzma format too
+
+* Fri Feb 05 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-9
+- unbreak python(abi) requires generation (#562906)
+
+* Fri Feb 05 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-8
+- more fixes to postscript provides extractor (#562228)
+- avoid accessing unrelated mount points in disk space checking (#547548)
+- fix disk space checking with erasures present in transaction (#561160)
+
+* Fri Feb 05 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-7
+- couple of fixes to the postscript provides extractor (#538101)
+
+* Thu Feb 04 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-6
+- extract provides for postscript printer drivers (#538101)
+
+* Wed Feb 03 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-5
+- python byte-compilation fixes + improvements (#558997)
+
+* Sat Jan 30 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-4
+- support parallel python versions in python dependency extractor (#532118)
+
+* Thu Jan 21 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-3
+- fix segfault on failed url retrieval
+- fix verification error code depending on verbosity level
+- if anything in testsuite fails, dump out the log
+
+* Fri Jan 08 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-2
+- put disttag back, accidentally nuked in 4.8.0 final update
+
+* Fri Jan 08 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-1
+- update to 4.8.0 final (http://rpm.org/wiki/Releases/4.8.0)
+
+* Thu Jan 07 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.6
+- pull out macro scoping "fix" for now, it breaks font package macros
+
+* Mon Jan 04 2010 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.5
+- always clear locally defined macros when they go out of scope
+
+* Thu Dec 17 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.4
+- permit unexpanded macros when parsing spec (#547997)
+
+* Wed Dec 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.3
+- fix a bunch of python refcount-errors causing major memory leaks
+
+* Mon Dec 07 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.2
+- fix noise from python bytecompile on non-python packages (#539635)
+- make all our -devel [build]requires isa-specific
+- trim out superfluous -devel dependencies from rpm-devel
+
+* Mon Dec 07 2009 Panu Matilainen <pmatilai@redhat.com> - 4.8.0-0.beta1.1
+- update to 4.8.0-beta1 (http://rpm.org/wiki/Releases/4.8.0)
+- rpm-build conflicts with current ocaml-runtime
+
+* Fri Dec 04 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.2-2
+- missing error exit code from signing password checking (#496754)
+- dont fail build on unrecognized data files (#532489)
+- dont try to parse subkeys and secret keys (#436812)
+- fix chmod test on selinux, breaking %%{_fixperms} macro (#543035)
+
+* Wed Nov 25 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.2-1
+- update to 4.7.2 (http://rpm.org/wiki/Releases/4.7.2)
+- fixes #464750, #529214
+
+* Wed Nov 18 2009 Jindrich Novy <jnovy@redhat.com> - 4.7.1-10
+- rebuild against BDB-4.8.24
+
+* Wed Nov 18 2009 Jindrich Novy <jnovy@redhat.com> - 4.7.1-9
+- drop versioned dependency to BDB
+
+* Wed Oct 28 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-8
+- support multiple python implementations in brp-python-bytecompile (#531117)
+- make disk space problem reporting a bit saner (#517418)
+
+* Tue Oct 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-7
+- fix build with BDB 4.8.x by removing XA "support" from BDB backend
+- perl dep extractor heredoc parsing improvements (#524929)
+
+* Mon Sep 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-6
+- use relative paths within db environment (related to #507309, #507309...)
+- remove db environment on close in chrooted operation (related to above)
+- initialize rpmlib earlier in rpm2cpio (#523260)
+- fix file dependency tag extension formatting (#523282)
+
+* Tue Sep 15 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-5
+- fix duplicate dependency filtering on build (#490378)
+- permit absolute paths in file lists again (#521760)
+- use permissions 444 for all .debug files (#522194)
+- add support for optional bugurl tag (#512774)
+
+* Fri Aug 14 2009 Jesse Keating <jkeating@redhat.com> - 4.7.1-4
+- Patch to make geode appear as i686 (#517475)
+
+* Thu Aug 06 2009 Jindrich Novy <jnovy@redhat.com> - 4.7.1-3
+- rebuild because of the new xz
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.7.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Tue Jul 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.1-1
+- update to 4.7.1 ((http://rpm.org/wiki/Releases/4.7.1)
+- fix source url
+
+* Mon Jul 20 2009 Bill Nottingham <notting@redhat.com> - 4.7.0-9
+- enable XZ support
+
+* Thu Jun 18 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-8
+- updated OSGi dependency extractor (#506471)
+- fix segfault in symlink fingerprinting (#505777)
+- fix invalid memory access causing bogus file dependency errors (#506323)
+
+* Tue Jun 16 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-7
+- add dwarf-3 support to debugedit (#505774)
+
+* Fri Jun 12 2009 Stepan Kasal <skasal@redhat.com> - 4.7.0-6
+- require libcap >= 2.16 (#505596)
+
+* Tue Jun 03 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-5
+- don't mess up problem altNEVR in python ts.check() (#501068)
+- fix hardlink size calculation on build (#503020)
+
+* Thu May 14 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-4
+- split cron-job into a sub-package to avoid silly deps on core rpm (#500722)
+- rpm requires coreutils but not in %%post
+- build with libcap and libacl
+- fix pgp pubkey signature tag parsing
+
+* Tue Apr 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-3
+- couple of merge-review fixes (#226377)
+ - eliminate bogus leftover rpm:rpm rpmdb ownership
+ - unescaped macro in changelog
+- fix find-lang --with-kde with KDE3 (#466009)
+- switch back to default file digest algorithm
+
+* Fri Apr 17 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-2
+- file classification tweaks for text files (#494817)
+ - disable libmagic text token checks, it's way too error-prone
+ - consistently classify all text as such and include description
+
+* Thu Apr 16 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-1
+- update to 4.7.0 final (http://rpm.org/wiki/Releases/4.7.0)
+- fixes #494049, #495429
+- dont permit test-suite failure anymore
+
+* Thu Apr 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.rc1.1
+- update to 4.7.0-rc1
+- fixes #493157, #493777, #493696, #491388, #487597, #493162
+
+* Fri Apr 03 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.9
+- fix recorded file state of otherwise skipped files (#492947)
+- compress ChangeLog, drop old CHANGES file (#492440)
+
+* Thu Apr 2 2009 Tom "spot" Callaway <tcallawa@redhat.com> - 4.7.0-0.beta1.8
+- Fix sparcv9v and sparc64v targets
+
+* Tue Mar 24 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.7
+- prefer more specific types over generic "text" in classification (#491349)
+
+* Mon Mar 23 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.6
+- with the fd leak gone, let libmagic look into compressed files again (#491596)
+
+* Mon Mar 23 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.5
+- fix font provide generation on filenames with whitespace (#491597)
+
+* Thu Mar 12 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.4
+- handle RSA V4 signatures (#436812)
+- add alpha arch ISA-bits
+- enable internal testsuite on build
+
+* Mon Mar 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.3
+- fix _install_langs behavior (#489235)
+- fix recording of file states into rpmdb on install
+
+* Sun Mar 08 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.2
+- load macros before creating directories on src.rpm install (#489104)
+
+* Fri Mar 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.7.0-0.beta1.1
+- update to 4.7.0-beta1 (http://rpm.org/wiki/Releases/4.7.0)
+
+* Fri Feb 27 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-11
+- build rpm itself with md5 file digests for now to ensure upgradability
+
+* Thu Feb 26 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-10
+- handle NULL passed as EVR in rpmdsSingle() again (#485616)
+
+* Wed Feb 25 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-9
+- pull out python byte-compile syntax check for now
+
+* Mon Feb 23 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-8
+- make -apidocs sub-package noarch
+- fix source URL
+
+* Sat Feb 21 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-7
+- loosen up restrictions on dependency names (#455119)
+- handle inter-dependent pkg-config files for requires too (#473814)
+- error/warn on elf binaries in noarch package in build
+
+* Fri Feb 20 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-6
+- error out on uncompilable python code (Tim Waugh)
+
+* Tue Feb 17 2009 Jindrich Novy <jnovy@redhat.com> - 4.6.0-5
+- remove two offending hunks from anyarch patch causing that
+ RPMTAG_BUILDARCHS isn't written to SRPMs
+
+* Mon Feb 16 2009 Jindrich Novy <jnovy@redhat.com> - 4.6.0-4
+- inherit group tag from the main package (#470714)
+- ignore BuildArch tags for anyarch actions (#442105)
+- don't check package BuildRequires when doing --rmsource (#452477)
+- don't fail because of missing sources when only spec removal
+ is requested (#472427)
+
+* Mon Feb 16 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-3
+- updated fontconfig provide script - fc-query does all the hard work now
+
+* Mon Feb 09 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-2
+- build against db 4.7.x
+
+* Fri Feb 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-1
+- update to 4.6.0 final
+- revert libmagic looking into compressed files for now, breaks ooffice build
+
+* Fri Feb 06 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.5
+- enable fontconfig provides generation
+
+* Thu Feb 05 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.4
+- fixup rpm translation lookup to match Fedora specspo (#436941)
+
+* Wed Feb 04 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.3
+- extract mimehandler provides from .desktop files
+- preliminaries for extracting font provides (not enabled yet)
+- dont classify font metrics data as fonts
+- only run script dep extraction once per file, duh
+
+* Sat Jan 31 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.2
+- change platform sharedstatedir to something more sensible (#185862)
+- add rpmdb_foo links to db utils for documentation compatibility
+
+* Fri Jan 30 2009 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc4.1
+- update to 4.6.0-rc4
+- fixes #475582, #478907, #476737, #479869, #476201
+
+* Fri Dec 12 2008 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc3.2
+- add back defaultdocdir patch which hadn't been applied on 4.6.x branch yet
+
+* Fri Dec 12 2008 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc3.1
+- add dist-tag, rebuild
+
+* Tue Dec 09 2008 Panu Matilainen <pmatilai@redhat.com> - 4.6.0-0.rc3.1
+- update to rpm 4.6.0-rc3
+- fixes #475214, #474550, #473239
+
+* Wed Dec 3 2008 Jeremy Katz <katzj@redhat.com> - 4.6.0-0.rc2.9
+- I built into the wrong place
+
+* Wed Dec 3 2008 Jeremy Katz <katzj@redhat.com> - 4.6.0-0.rc2.8
+- python 2.6 rebuild again
+
+* Wed Dec 03 2008 Panu Matilainen <pmatilai@redhat.com>
+- make rpm-build require pkgconfig (#473978)
+
+* Tue Dec 02 2008 Panu Matilainen <pmatilai@redhat.com>
+- fix pkg-config provide generation when pc's depend on each other (#473814)
+
+* Mon Dec 01 2008 Jindrich Novy <jnovy@redhat.com>
+- include rpmfileutil.h from rpmmacro.h, unbreaks
+ net-snmp (#473420)
+
+* Sun Nov 30 2008 Panu Matilainen <pmatilai@redhat.com>
+- rebuild for python 2.6
+
+* Sat Nov 29 2008 Panu Matilainen <pmatilai@redhat.com>
+- update to 4.6.0-rc2
+- fixes #471820, #473167, #469355, #468319, #472507, #247374, #426672, #444661
+- enable automatic generation of pkg-config and libtool dependencies #465377
+
+* Fri Oct 31 2008 Panu Matilainen <pmatilai@redhat.com>
+- adjust find-debuginfo for "file" output change (#468129)
+
+* Tue Oct 28 2008 Panu Matilainen <pmatilai@redhat.com>
+- Florian's improved fingerprinting hash algorithm from upstream
+
+* Sat Oct 25 2008 Panu Matilainen <pmatilai@redhat.com>
+- Make noarch sub-packages actually work
+- Fix defaultdocdir logic in installplatform to avoid hardwiring mandir
+
+* Fri Oct 24 2008 Jindrich Novy <jnovy@redhat.com>
+- update compat-db dependencies (#459710)
+
+* Wed Oct 22 2008 Panu Matilainen <pmatilai@redhat.com>
+- never add identical NEVRA to transaction more than once (#467822)
+
+* Sun Oct 19 2008 Panu Matilainen <pmatilai@redhat.com>
+- permit tab as macro argument separator (#467567)
+
+* Thu Oct 16 2008 Panu Matilainen <pmatilai@redhat.com>
+- update to 4.6.0-rc1
+- fixes #465586, #466597, #465409, #216221, #466503, #466009, #463447...
+- avoid using %%configure macro for now, it has unwanted side-effects on rpm
+
+* Wed Oct 01 2008 Panu Matilainen <pmatilai@redhat.com>
+- update to official 4.5.90 alpha tarball
+- a big pile of misc bugfixes + translation updates
+- isa-macro generation fix for ppc (#464754)
+- avoid pulling in pile of perl dependencies for an unused script
+- handle both "invalid argument" and clear env version mismatch on posttrans
+
+* Thu Sep 25 2008 Jindrich Novy <jnovy@redhat.com>
+- don't treat %%patch numberless if -P parameter is present (#463942)
+
+* Thu Sep 11 2008 Panu Matilainen <pmatilai@redhat.com>
+- add hack to support extracting gstreamer plugin provides (#438225)
+- fix another macro argument handling regression (#461180)
+
+* Thu Sep 11 2008 Jindrich Novy <jnovy@redhat.com>
+- create directory structure for rpmbuild prior to build if it doesn't exist (#455387)
+- create _topdir if it doesn't exist when installing SRPM
+- don't generate broken cpio in case of hardlink pointing on softlink,
+ thanks to pixel@mandriva.com
+
+* Sat Sep 06 2008 Jindrich Novy <jnovy@redhat.com>
+- fail hard if patch isn't found (#461347)
+
+* Mon Sep 01 2008 Jindrich Novy <jnovy@redhat.com>
+- fix parsing of boolean expressions in spec (#456103)
+ (unbreaks pam, jpilot and maybe other builds)
+
+* Tue Aug 26 2008 Jindrich Novy <jnovy@redhat.com>
+- add support for noarch subpackages
+- fix segfault in case of insufficient disk space detected (#460146)
+
+* Wed Aug 13 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8461.2
+- fix archivesize tag generation on ppc (#458817)
+
+* Fri Aug 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8461.1
+- new snapshot from upstream
+- fixes #68290, #455972, #446202, #453364, #456708, #456103, #456321, #456913,
+ #458260, #458261
+- partial fix for #457360
+
+* Thu Jul 31 2008 Florian Festi <ffesti@redhat.com>
+- 4.5.90-0.git8427.1
+- new snapshot from upstream
+
+* Thu Jul 31 2008 Florian Festi <ffesti@redhat.com>
+- 4.5.90-0.git8426.10
+- rpm-4.5.90-posttrans.patch
+- use header from rpmdb in posttrans to make anaconda happy
+
+* Sat Jul 19 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.9
+- fix regression in patch number handling (#455872)
+
+* Tue Jul 15 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.8
+- fix regression in macro argument handling (#455333)
+
+* Mon Jul 14 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.7
+- fix mono dependency extraction (adjust for libmagic string change)
+
+* Sat Jul 12 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.6
+- fix type mismatch causing funky breakage on ppc64
+
+* Fri Jul 11 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8426.5
+- flip back to external bdb
+- fix tab vs spaces complaints from rpmlint
+- add dep for lzma and require unzip instead of zip in build (#310694)
+- add pkgconfig dependency to rpm-devel
+- drop ISA-dependencies for initial introduction
+- new snapshot from upstream for documentation fixes
+
+* Thu Jul 10 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8424.4
+- handle int vs external db in posttrans too
+
+* Wed Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8424.3
+- require curl as external url helper
+
+* Wed Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- 4.5.90-0.git8424.2
+- add support for building with or without internal db
+
+* Wed Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- rpm 4.5.90-0.git8424.1 (alpha snapshot)
+- adjust to build against Berkeley DB 4.5.20 from compat-db for now
+- add posttrans to clean up db environment mismatch after upgrade
+- forward-port devel autodeps patch
+
+* Tue Jul 08 2008 Panu Matilainen <pmatilai@redhat.com>
+- adjust for rpmdb index name change
+- drop unnecessary vendor-macro patch for real
+- add ISA-dependencies among rpm subpackages
+- make lzma and sqlite deps conditional and disabled by default for now
+
+* Fri Feb 01 2008 Panu Matilainen <pmatilai@redhat.com>
+- spec largely rewritten, truncating changelog
--- /dev/null
+From: Panu Matilainen <pmatilai@redhat.com>
+Date: Fri, 13 Apr 2012 10:16:51 +0000 (+0300)
+Subject: Raise file conflicts on differing permissions (user, group, mode)
+X-Git-Tag: rpm-4.11.0-alpha~426
+X-Git-Url: http://rpm.org/gitweb?p=rpm.git;a=commitdiff_plain;h=cf1095648194104a81a58abead05974a5bfa3b9a
+
+Raise file conflicts on differing permissions (user, group, mode)
+
+- Two files (or directories) cannot be correctly shared if their
+ permissions differ, even if the content is identical: either
+ file will end up having wrong permissions, depending on installation
+ order. This means a package can among other things silently
+ eg relax permissions of eg security sensitive directory (accidentally
+ or intentionallY).
+- We now require exact match of user, group and entire file mode
+ (previously only the file type part of mode was tested)
+---
+
+diff --git a/lib/rpmfi.c b/lib/rpmfi.c
+index 42c07db..e6e1fb3 100644
+--- a/lib/rpmfi.c
++++ b/lib/rpmfi.c
+@@ -542,13 +542,20 @@ rpmFileTypes rpmfiWhatis(rpm_mode_t mode)
+
+ int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix)
+ {
+- rpmFileTypes awhat = rpmfiWhatis(rpmfiFModeIndex(afi, aix));
+- rpmFileTypes bwhat = rpmfiWhatis(rpmfiFModeIndex(bfi, bix));
++ mode_t amode = rpmfiFModeIndex(afi, aix);
++ mode_t bmode = rpmfiFModeIndex(bfi, bix);
++ rpmFileTypes awhat = rpmfiWhatis(amode);
++ rpmFileTypes bwhat = rpmfiWhatis(bmode);
+
+ if ((rpmfiFFlagsIndex(afi, aix) & RPMFILE_GHOST) ||
+ (rpmfiFFlagsIndex(bfi, bix) & RPMFILE_GHOST)) return 0;
+
+- if (awhat != bwhat) return 1;
++ if (amode != bmode) return 1;
++
++ if (!rstreq(rpmfiFUserIndex(afi, aix), rpmfiFUserIndex(bfi, bix)))
++ return 1;
++ if (!rstreq(rpmfiFGroupIndex(afi, aix), rpmfiFGroupIndex(bfi, bix)))
++ return 1;
+
+ if (awhat == LINK) {
+ const char * alink = rpmfiFLinkIndex(afi, aix);
--- /dev/null
+http://rpm.org/gitweb?p=rpm.git;a=commitdiff;h=cf1095648194104a81a58abead05974a5bfa3b9a
--- /dev/null
+../redhat/initpost
\ No newline at end of file
--- /dev/null
+../redhat/initpre
\ No newline at end of file
--- /dev/null
+--reinstall
+
+filesystem
--- /dev/null
+coreutils
+initscripts
+rsyslog
--- /dev/null
+glibc-[0-9]*.rpm
+basesystem-*.rpm
+bash-[0-9]*.rpm
+filesystem-*.rpm
+glibc-common-*.rpm
+libgcc-[0-9]*.rpm
+ncurses-base-[0-9]*.rpm
+ncurses-libs-*.rpm
+nss-softokn-freebl-*.rpm
+setup-*.rpm
+tzdata-*.rpm
--- /dev/null
+[updates-testing]
+name=Fedora 16 - $basearch - Test Updates
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/16/$basearch/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f16&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-testing-debuginfo]
+name=Fedora 16 - $basearch - Test Updates Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/16/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f16&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-testing-source]
+name=Fedora 16 - Test Updates Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/16/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-source-f16&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
--- /dev/null
+[updates]
+name=Fedora 16 - $basearch - Updates
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/16/$basearch/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f16&arch=$basearch
+enabled=1
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-debuginfo]
+name=Fedora 16 - $basearch - Updates - Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/16/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f16&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-source]
+name=Fedora 16 - Updates Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/16/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f16&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
--- /dev/null
+[fedora]
+name=Fedora 16 - $basearch
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-16&arch=$basearch
+enabled=1
+metadata_expire=7d
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[fedora-debuginfo]
+name=Fedora 16 - $basearch - Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-16&arch=$basearch
+enabled=0
+metadata_expire=7d
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[fedora-source]
+name=Fedora 16 - Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/source/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-source-16&arch=$basearch
+enabled=0
+metadata_expire=7d
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/16/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
--- /dev/null
+[main]
+cachedir=@YUMCACHEDIR@
+persistdir=@YUMLIBDIR@
+reposdir=@YUMETCDIR@/yum.repos.d
+debuglevel=1
+logfile=@YUMLOGDIR@/log
+lockfile=@YUMLOCKDIR@/yum.pid
+pkgpolicy=newest
+distroverpkg=fedora-release
+installonlypkgs=
+exactarch=0
--- /dev/null
+../redhat/initpost
\ No newline at end of file
--- /dev/null
+../redhat/initpre.usrmove
\ No newline at end of file
--- /dev/null
+--reinstall
+
+filesystem
--- /dev/null
+coreutils
+initscripts
+rsyslog
--- /dev/null
+glibc-[0-9]*.rpm
+basesystem-*.rpm
+bash-[0-9]*.rpm
+filesystem-*.rpm
+glibc-common-*.rpm
+libgcc-[0-9]*.rpm
+ncurses-base-[0-9]*.rpm
+ncurses-libs-*.rpm
+nss-softokn-freebl-*.rpm
+setup-*.rpm
+tzdata-*.rpm
--- /dev/null
+[updates-testing]
+name=Fedora 18 - $basearch - Test Updates
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/18/$basearch/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f18&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-testing-debuginfo]
+name=Fedora 18 - $basearch - Test Updates Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/18/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f18&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-testing-source]
+name=Fedora 18 - Test Updates Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/18/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-source-f18&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
--- /dev/null
+[updates]
+name=Fedora 18 - $basearch - Updates
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/18/$basearch/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f18&arch=$basearch
+enabled=1
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-debuginfo]
+name=Fedora 18 - $basearch - Updates - Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/18/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f18&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[updates-source]
+name=Fedora 18 - Updates Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/18/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f18&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
--- /dev/null
+[fedora]
+name=Fedora 18 - $basearch
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-18&arch=$basearch
+enabled=1
+metadata_expire=7d
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[fedora-debuginfo]
+name=Fedora 18 - $basearch - Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-18&arch=$basearch
+enabled=0
+metadata_expire=7d
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
+
+[fedora-source]
+name=Fedora 18 - Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/source/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-source-18&arch=$basearch
+enabled=0
+metadata_expire=7d
+gpgcheck=1
+gpgkey=http://download.fedoraproject.org/pub/fedora/linux/releases/18/Everything/$basearch/os/RPM-GPG-KEY-fedora-$basearch
--- /dev/null
+[main]
+cachedir=@YUMCACHEDIR@
+persistdir=@YUMLIBDIR@
+reposdir=@YUMETCDIR@/yum.repos.d
+debuglevel=1
+logfile=@YUMLOGDIR@/log
+lockfile=@YUMLOCKDIR@/yum.pid
+pkgpolicy=newest
+distroverpkg=fedora-release
+installonlypkgs=
+exactarch=0
--- /dev/null
+#! /bin/bash
+
+# Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+vdir=$1/vdir
+. "$2"
+
+## Fix/workaround the misclassification of %_netsharedpath's parent directories
+mkdir -p "$vdir"/{etc/rc.d/init.d,/usr/sbin,/usr/bin}
+
+## Workaround broken kernel %post scripts
+ln -s ../bin/true "$vdir"/usr/sbin/new-kernel-pkg
--- /dev/null
+[bbox-f14]
+name=OneLab Build Boxes for fedora14
+baseurl=http://build.onelab.eu/bbox-14/$basearch
+gpgcheck=0
+#gpgkey=http://build.onelab.eu/conf/keys/RPM-ONELAB-GPG-KEY
--- /dev/null
+[updates]
+name=Fedora $releasever - $basearch - Updates
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch
+enabled=1
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+exclude=kernel* util-vserver* yum rpm-*
+
+[updates-debuginfo]
+name=Fedora $releasever - $basearch - Updates - Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+
+[updates-source]
+name=Fedora $releasever - Updates Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f$releasever&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
--- /dev/null
+[fedora]
+name=Fedora $releasever - $basearch
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
+enabled=1
+metadata_expire=7d
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+exclude=kernel* util-vserver* yum rpm-*
+
+[fedora-debuginfo]
+name=Fedora $releasever - $basearch - Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/debug/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-$releasever&arch=$basearch
+enabled=0
+metadata_expire=7d
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+
+[fedora-source]
+name=Fedora $releasever - Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/source/SRPMS/
+mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-source-$releasever&arch=$basearch
+enabled=0
+metadata_expire=7d
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch