diff --git a/.files b/.files
index baf3244..8cced0a 100644
Binary files a/.files and b/.files differ
diff --git a/.rev b/.rev
index 7c85aee..7319d29 100644
--- a/.rev
+++ b/.rev
@@ -2219,4 +2219,12 @@ See bugzilla 1167537 for the gory details.
- Backport FA_TOUCH fixes from upsteam [bnc#1175025] [bnc#1177428]
842515
+
+ 293076cb2f0c72449ba431401c46cb2b
+ 4.16.0
+
+ dimstar_suse
+ - update to rpm-4.16.0
+ 861385
+
diff --git a/bdb_ro.diff b/bdb_ro.diff
deleted file mode 100644
index 8c449b8..0000000
--- a/bdb_ro.diff
+++ /dev/null
@@ -1,884 +0,0 @@
---- ./configure.ac.orig 2020-01-17 12:07:10.366060891 +0000
-+++ ./configure.ac 2020-01-17 12:07:57.129945219 +0000
-@@ -588,6 +588,20 @@ AS_IF([test "$enable_ndb" = yes],[
- AM_CONDITIONAL([NDB], [test "$enable_ndb" = yes])
-
- #=================
-+# Process --enable-bdb-ro
-+AC_ARG_ENABLE([bdb-ro], [AS_HELP_STRING([--enable-bdb-ro (EXPERIMENTAL)],[enable the read-only Berkeley DB code])],
-+[case "$enable_bdb_ro" in
-+yes|no) ;;
-+*) AC_MSG_ERROR([invalid argument to --enable-bdb-ro])
-+ ;;
-+esac],
-+[enable_bdb_ro=no])
-+AS_IF([test "$enable_bdb_ro" = yes],[
-+ AC_DEFINE(WITH_BDB_RO, 1, [Build with read-only Berkeley DB])
-+])
-+AM_CONDITIONAL([BDB_RO], [test "$enable_bdb_ro" = yes])
-+
-+#=================
- # Check for LMDB support
- AC_ARG_ENABLE([lmdb],
- [AS_HELP_STRING([--enable-lmdb=@<:@yes/no/auto@:>@ (EXPERIMENTAL)],
---- ./lib/Makefile.am.orig 2019-06-26 14:17:31.404985707 +0000
-+++ ./lib/Makefile.am 2020-01-17 12:07:57.129945219 +0000
-@@ -68,6 +68,10 @@ librpm_la_LIBADD += @WITH_DB_LIB@
- endif
- endif
-
-+if BDB_RO
-+librpm_la_SOURCES += backend/bdb_ro.c
-+endif
-+
- if NDB
- librpm_la_SOURCES += \
- backend/ndb/glue.c \
---- ./lib/backend/bdb_ro.c.orig 2020-01-17 12:07:57.129945219 +0000
-+++ ./lib/backend/bdb_ro.c 2020-01-17 12:11:21.125440629 +0000
-@@ -0,0 +1,819 @@
-+#include "system.h"
-+
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+
-+#include "lib/rpmdb_internal.h"
-+#include
-+#include
-+
-+#define BDB_HASH 0
-+#define BDB_BTREE 1
-+
-+struct dbiCursor_s;
-+
-+struct bdb_kv {
-+ unsigned char *kv;
-+ unsigned int len;
-+};
-+
-+struct bdb_db {
-+ int fd; /* file descriptor of database */
-+ int type; /* BDB_HASH / BDB_BTREE */
-+ unsigned int pagesize;
-+ unsigned int lastpage;
-+ int swapped; /* different endianess? */
-+ /* btree */
-+ unsigned int root; /* root page of the b-tree */
-+ /* hash */
-+ unsigned int maxbucket;
-+ unsigned int highmask;
-+ unsigned int lowmask;
-+ unsigned int spares[32]; /* spare pages for each splitpoint */
-+};
-+
-+struct bdb_cur {
-+ struct bdb_db *db;
-+
-+ struct bdb_kv key; /* key and value from the db entry */
-+ struct bdb_kv val;
-+
-+ unsigned char *page; /* the page we're looking at */
-+
-+ unsigned char *ovpage;
-+ struct bdb_kv keyov; /* space to store oversized keys/values */
-+ struct bdb_kv valov;
-+
-+ int state; /* 1: onpage, -1: error */
-+ int idx; /* entry index */
-+ int numidx; /* number of entries on the page */
-+ int islookup; /* we're doing a lookup operation */
-+
-+ /* hash */
-+ unsigned int bucket; /* current bucket */
-+};
-+
-+
-+static void swap16(unsigned char *p)
-+{
-+ int a = p[0];
-+ p[0] = p[1];
-+ p[1] = a;
-+}
-+
-+static void swap32(unsigned char *p)
-+{
-+ int a = p[0];
-+ p[0] = p[3];
-+ p[3] = a;
-+ a = p[1];
-+ p[1] = p[2];
-+ p[2] = a;
-+}
-+
-+static void swap32_2(unsigned char *p)
-+{
-+ swap32(p);
-+ swap32(p + 4);
-+}
-+
-+static void bdb_swapmetapage(struct bdb_db *db, unsigned char *page)
-+{
-+ int i, maxi = db->type == BDB_HASH ? 224 : 92;
-+ for (i = 8; i < maxi; i += 4)
-+ swap32((unsigned char *)(page + i));
-+ swap32((unsigned char *)(page + 24));
-+}
-+
-+static void bdb_swappage(struct bdb_db *db, unsigned char *page)
-+{
-+ unsigned int pagesize = db->pagesize;
-+ int type, i, nent, off;
-+ swap32(page + 8); /* page number */
-+ swap32_2(page + 12); /* prev/next page */
-+ swap16(page + 20); /* nitems */
-+ swap16(page + 22); /* highfree */
-+
-+ type = page[25];
-+ if (type != 2 && type != 13 && type != 3 && type != 5)
-+ return;
-+ nent = *(uint16_t *)(page + 20);
-+ if (nent > (pagesize - 26) / 2)
-+ nent = (pagesize - 26) / 2;
-+ for (i = 0; i < nent; i++) {
-+ int minoff = 26 + nent * 2;
-+ swap16(page + 26 + i * 2); /* offset */
-+ off = *(uint16_t *)(page + 26 + i * 2);
-+ if (off < minoff || off >= pagesize)
-+ continue;
-+ if (type == 2 || type == 13) { /* hash */
-+ if (page[off] == 3 && off + 12 <= pagesize)
-+ swap32_2(page + off + 4); /* page no/length */
-+ } else if (type == 3) { /* btree internal */
-+ if (off + 12 > pagesize)
-+ continue;
-+ swap16(page + off); /* length */
-+ swap32_2(page + off + 4); /* page no/num recs */
-+ if (page[off + 2] == 3 && off + 24 <= pagesize)
-+ swap32_2(page + off + 16); /* with overflow page/length */
-+ } else if (type == 5) { /* btree leaf */
-+ if (off + 3 <= pagesize && page[off + 2] == 1)
-+ swap16(page + off); /* length */
-+ else if (off + 12 <= pagesize && page[off + 2] == 3)
-+ swap32_2(page + off + 4); /* overflow page/length */
-+ }
-+ }
-+}
-+
-+static int bdb_getpage(struct bdb_db *db, unsigned char *page, unsigned int pageno)
-+{
-+ if (!pageno || pageno > db->lastpage)
-+ return -1;
-+ if (pread(db->fd, page, db->pagesize, (off_t)pageno * db->pagesize) != db->pagesize) {
-+ rpmlog(RPMLOG_ERR, "pread: %s\n", strerror(errno));
-+ return -1;
-+ }
-+ if (db->swapped)
-+ bdb_swappage(db, page);
-+ if (pageno != *(uint32_t *)(page + 8))
-+ return -1;
-+ return 0;
-+}
-+
-+static void bdb_close(struct bdb_db *db)
-+{
-+ if (db->fd >= 0)
-+ close(db->fd);
-+ free(db);
-+}
-+
-+static struct bdb_db *bdb_open(const char *name)
-+{
-+ uint32_t meta[512 / 4];
-+ int i, fd;
-+ struct bdb_db *db;
-+
-+ fd = open(name, O_RDONLY);
-+ if (!fd) {
-+ rpmlog(RPMLOG_ERR, "%s: %s\n", name, strerror(errno));
-+ return NULL;
-+ }
-+ db = xcalloc(1, sizeof(*db));
-+ db->fd = fd;
-+ if (pread(fd, meta, 512, 0) != 512) {
-+ rpmlog(RPMLOG_ERR, "%s: pread: %s\n", name, strerror(errno));
-+ bdb_close(db);
-+ return NULL;
-+ }
-+ if (meta[3] == 0x00061561 || meta[3] == 0x61150600) {
-+ db->type = BDB_HASH;
-+ db->swapped = meta[3] == 0x61150600;
-+ } else if (meta[3] == 0x00053162 || meta[3] == 0x62310500) {
-+ db->type = BDB_BTREE;
-+ db->swapped = meta[3] == 0x62310500;
-+ } else {
-+ rpmlog(RPMLOG_ERR, "%s: not a berkeley db hash/btree database\n", name);
-+ bdb_close(db);
-+ return NULL;
-+ }
-+ if (db->swapped)
-+ bdb_swapmetapage(db, (unsigned char *)meta);
-+ db->pagesize = meta[5];
-+ db->lastpage = meta[8];
-+ if (db->type == BDB_HASH) {
-+ if (meta[4] < 8 || meta[4] > 10) {
-+ rpmlog(RPMLOG_ERR, "%s: unsupported hash version %d\n", name, meta[4]);
-+ bdb_close(db);
-+ return NULL;
-+ }
-+ db->maxbucket = meta[18];
-+ db->highmask = meta[19];
-+ db->lowmask = meta[20];
-+ for (i = 0; i < 32; i++)
-+ db->spares[i] = meta[24 + i];
-+ }
-+ if (db->type == BDB_BTREE) {
-+ if (meta[4] < 9 || meta[4] > 10) {
-+ rpmlog(RPMLOG_ERR, "%s: unsupported btree version %d\n", name, meta[4]);
-+ bdb_close(db);
-+ return NULL;
-+ }
-+ db->root = meta[22];
-+ }
-+ return db;
-+}
-+
-+
-+/****** overflow handling ******/
-+
-+static int ovfl_get(struct bdb_cur *cur, struct bdb_kv *kv, struct bdb_kv *ov, uint32_t *pagenolen)
-+{
-+ unsigned int pageno = pagenolen[0];
-+ unsigned int len = pagenolen[1];
-+ unsigned int plen;
-+ unsigned char *p;
-+
-+ if (len == 0)
-+ return -1;
-+ if (len > ov->len) {
-+ if (ov->kv)
-+ ov->kv = xrealloc(ov->kv, len);
-+ else
-+ ov->kv = xmalloc(len);
-+ ov->len = len;
-+ }
-+ if (!cur->ovpage)
-+ cur->ovpage = xmalloc(cur->db->pagesize);
-+ p = ov->kv;
-+ while (len > 0) {
-+ if (bdb_getpage(cur->db, cur->ovpage, pageno))
-+ return -1;
-+ if (cur->ovpage[25] != 7)
-+ return -1;
-+ plen = *(uint16_t *)(cur->ovpage + 22);
-+ if (plen + 26 > cur->db->pagesize || plen > len)
-+ return -1;
-+ memcpy(p, cur->ovpage + 26, plen);
-+ p += plen;
-+ len -= plen;
-+ pageno = *(uint32_t *)(cur->ovpage + 16);
-+ }
-+ if (kv) {
-+ kv->kv = ov->kv;
-+ kv->len = pagenolen[1];
-+ }
-+ return 0;
-+}
-+
-+
-+/****** hash implementation ******/
-+
-+static int hash_bucket_to_page(struct bdb_db *db, unsigned int bucket)
-+{
-+ unsigned int b;
-+ int i = 0;
-+ for (b = bucket; b; b >>= 1)
-+ i++;
-+ return bucket + db->spares[i];
-+}
-+
-+static int hash_lookup(struct bdb_cur *cur, const unsigned char *key, unsigned int keyl)
-+{
-+ uint32_t bucket;
-+ unsigned int pg, i;
-+ cur->state = -1;
-+ for (bucket = 0, i = 0; i < keyl; i++)
-+ bucket = (bucket * 16777619) ^ key[i];
-+ bucket &= cur->db->highmask;
-+ if (bucket > cur->db->maxbucket)
-+ bucket &= cur->db->lowmask;
-+ cur->bucket = bucket;
-+ pg = hash_bucket_to_page(cur->db, bucket);
-+ if (bdb_getpage(cur->db, cur->page, pg))
-+ return -1;
-+ if (cur->page[25] != 8 && cur->page[25] != 13)
-+ return -1;
-+ cur->idx = (unsigned int)-2;
-+ cur->numidx = *(uint16_t *)(cur->page + 20);
-+ cur->state = 1;
-+ return 0;
-+}
-+
-+static int hash_getkv(struct bdb_cur *cur, struct bdb_kv *kv, struct bdb_kv *ov, int off, int len)
-+{
-+ if (len <= 0 || off + len > cur->db->pagesize)
-+ return -1;
-+ if (cur->page[off] == 1) {
-+ kv->kv = cur->page + off + 1;
-+ kv->len = len - 1;
-+ } else if (cur->page[off] == 3) {
-+ uint32_t ovlpage[2];
-+ if (len != 12)
-+ return -1;
-+ memcpy(ovlpage, cur->page + off + 4, 8); /* off is unaligned */
-+ if (ovfl_get(cur, kv, ov, ovlpage))
-+ return -1;
-+ } else {
-+ return -1;
-+ }
-+ return 0;
-+}
-+
-+static int hash_next(struct bdb_cur *cur)
-+{
-+ int pagesize = cur->db->pagesize;
-+ int koff, klen, voff, vlen;
-+ if (!cur->state && hash_lookup(cur, 0, 0))
-+ return -1;
-+ cur->idx += 2;
-+ for (;;) {
-+ if (cur->idx + 1 >= cur->numidx) {
-+ unsigned int pg;
-+ cur->idx = cur->numidx = 0;
-+ pg = *(uint32_t *)(cur->page + 16);
-+ if (!pg) {
-+ if (cur->islookup || cur->bucket >= cur->db->maxbucket)
-+ return 1;
-+ pg = hash_bucket_to_page(cur->db, ++cur->bucket);
-+ }
-+ if (bdb_getpage(cur->db, cur->page, pg))
-+ return -1;
-+ if (cur->page[25] != 8 && cur->page[25] != 13)
-+ return -1;
-+ cur->numidx = *(uint16_t *)(cur->page + 20);
-+ continue;
-+ }
-+ koff = *(uint16_t *)(cur->page + 26 + 2 * cur->idx);
-+ voff = *(uint16_t *)(cur->page + 28 + 2 * cur->idx);
-+ if (koff >= pagesize || voff >= pagesize)
-+ return -1;
-+ if (cur->idx == 0)
-+ klen = pagesize - koff;
-+ else
-+ klen = *(uint16_t *)(cur->page + 24 + 2 * cur->idx) - koff;
-+ vlen = koff - voff;
-+ if (hash_getkv(cur, &cur->key, &cur->keyov, koff, klen))
-+ return -1;
-+ if (!cur->islookup && hash_getkv(cur, &cur->val, &cur->valov, voff, vlen))
-+ return -1;
-+ return 0;
-+ }
-+}
-+
-+static int hash_getval(struct bdb_cur *cur)
-+{
-+ int koff, voff;
-+ if (cur->state != 1 || cur->idx + 1 >= cur->numidx)
-+ return -1;
-+ koff = *(uint16_t *)(cur->page + 26 + 2 * cur->idx);
-+ voff = *(uint16_t *)(cur->page + 28 + 2 * cur->idx);
-+ return hash_getkv(cur, &cur->val, &cur->valov, voff, koff - voff);
-+}
-+
-+
-+/****** btree implementation ******/
-+
-+static int btree_lookup(struct bdb_cur *cur, const unsigned char *key, unsigned int keylen)
-+{
-+ int pagesize = cur->db->pagesize;
-+ int off, lastoff, idx, numidx;
-+ unsigned int pg;
-+ unsigned char *ekey;
-+ unsigned int ekeylen;
-+ int cmp;
-+
-+ cur->state = -1;
-+ pg = cur->db->root;
-+ for (;;) {
-+ if (bdb_getpage(cur->db, cur->page, pg))
-+ return -1;
-+ if (cur->page[25] == 5)
-+ break; /* found leaf page */
-+ if (cur->page[25] != 3)
-+ return -1;
-+ numidx = *(uint16_t *)(cur->page + 20);
-+ if (!numidx)
-+ return -1;
-+ for (lastoff = 0, idx = 0; idx < numidx; idx++, lastoff = off) {
-+ off = *(uint16_t *)(cur->page + 26 + 2 * idx);
-+ if ((off & 3) != 0 || off + 3 > pagesize)
-+ return -1;
-+ ekeylen = *(uint16_t *)(cur->page + off);
-+ if (off + 12 + ekeylen > pagesize)
-+ return -1;
-+ if (!keylen) {
-+ lastoff = off;
-+ break;
-+ }
-+ if (idx == 0)
-+ continue;
-+ ekey = cur->page + off + 12;
-+ if ((cur->page[off + 2] & 0x7f) == 3) {
-+ if (ekeylen != 12)
-+ return -1;
-+ if (ovfl_get(cur, 0, &cur->keyov, (uint32_t *)(ekey + 4)))
-+ return -1;
-+ ekeylen = *(uint32_t *)(ekey + 8);
-+ ekey = cur->keyov.kv;
-+ } else if ((cur->page[off + 2] & 0x7f) != 1) {
-+ return -1;
-+ }
-+ cmp = memcmp(ekey, key, keylen < ekeylen ? keylen : ekeylen);
-+ if (cmp > 0 || (cmp == 0 && ekeylen > keylen))
-+ break;
-+ }
-+ pg = *(uint32_t *)(cur->page + lastoff + 4);
-+ }
-+ cur->idx = (unsigned int)-2;
-+ cur->numidx = *(uint16_t *)(cur->page + 20);
-+ cur->state = 1;
-+ return 0;
-+}
-+
-+static int btree_getkv(struct bdb_cur *cur, struct bdb_kv *kv, struct bdb_kv *ov, int off)
-+{
-+ if ((off & 3) != 0)
-+ return -1;
-+ if (cur->page[off + 2] == 1) {
-+ int len = *(uint16_t *)(cur->page + off);
-+ if (off + 3 + len > cur->db->pagesize)
-+ return -1;
-+ kv->kv = cur->page + off + 3;
-+ kv->len = len;
-+ } else if (cur->page[off + 2] == 3) {
-+ if (off + 12 > cur->db->pagesize)
-+ return -1;
-+ if (ovfl_get(cur, kv, ov, (uint32_t *)(cur->page + off + 4)))
-+ return -1;
-+ } else {
-+ return -1;
-+ }
-+ return 0;
-+}
-+
-+static int btree_next(struct bdb_cur *cur)
-+{
-+ int pagesize = cur->db->pagesize;
-+ int koff, voff;
-+ if (!cur->state && btree_lookup(cur, 0, 0))
-+ return -1;
-+ cur->idx += 2;
-+ for (;;) {
-+ if (cur->idx + 1 >= cur->numidx) {
-+ unsigned int pg;
-+ cur->idx = cur->numidx = 0;
-+ pg = *(uint32_t *)(cur->page + 16);
-+ if (cur->islookup || !pg)
-+ return 1;
-+ if (bdb_getpage(cur->db, cur->page, pg))
-+ return -1;
-+ if (cur->page[25] != 5)
-+ return -1;
-+ cur->numidx = *(uint16_t *)(cur->page + 20);
-+ continue;
-+ }
-+ koff = *(uint16_t *)(cur->page + 26 + 2 * cur->idx);
-+ voff = *(uint16_t *)(cur->page + 28 + 2 * cur->idx);
-+ if (koff + 3 > pagesize || voff + 3 > pagesize)
-+ return -1;
-+ if ((cur->page[koff + 2] & 0x80) != 0 || (cur->page[voff + 2] & 0x80) != 0)
-+ continue; /* ignore deleted */
-+ if (btree_getkv(cur, &cur->key, &cur->keyov, koff))
-+ return -1;
-+ if (!cur->islookup && btree_getkv(cur, &cur->val, &cur->valov, voff))
-+ return -1;
-+ return 0;
-+ }
-+}
-+
-+static int btree_getval(struct bdb_cur *cur)
-+{
-+ int voff;
-+ if (cur->state != 1 || cur->idx + 1 >= cur->numidx)
-+ return -1;
-+ voff = *(uint16_t *)(cur->page + 28 + 2 * cur->idx);
-+ return btree_getkv(cur, &cur->val, &cur->valov, voff);
-+}
-+
-+
-+/****** cursor functions ******/
-+
-+static struct bdb_cur *cur_open(struct bdb_db *db)
-+{
-+ struct bdb_cur *cur = xcalloc(1, sizeof(*cur));
-+ cur->db = db;
-+ cur->page = xmalloc(db->pagesize);
-+ return cur;
-+}
-+
-+static void cur_close(struct bdb_cur *cur)
-+{
-+ if (cur->page)
-+ free(cur->page);
-+ if (cur->ovpage)
-+ free(cur->ovpage);
-+ if (cur->keyov.kv)
-+ free(cur->keyov.kv);
-+ if (cur->valov.kv)
-+ free(cur->valov.kv);
-+ free(cur);
-+}
-+
-+static int cur_next(struct bdb_cur *cur)
-+{
-+ if (cur->state < 0)
-+ return -1;
-+ if (cur->db->type == BDB_HASH)
-+ return hash_next(cur);
-+ if (cur->db->type == BDB_BTREE)
-+ return btree_next(cur);
-+ return -1;
-+}
-+
-+static int cur_getval(struct bdb_cur *cur)
-+{
-+ if (cur->state < 0)
-+ return -1;
-+ if (cur->db->type == BDB_HASH)
-+ return hash_getval(cur);
-+ if (cur->db->type == BDB_BTREE)
-+ return btree_getval(cur);
-+ return -1;
-+}
-+
-+static int cur_lookup(struct bdb_cur *cur, const unsigned char *key, unsigned int keyl)
-+{
-+ int r = -1;
-+ if (cur->db->type == BDB_HASH)
-+ r = hash_lookup(cur, key, keyl);
-+ if (cur->db->type == BDB_BTREE)
-+ r = btree_lookup(cur, key, keyl);
-+ if (r != 0)
-+ return r;
-+ cur->islookup = 1;
-+ while ((r = cur_next(cur)) == 0)
-+ if (keyl == cur->key.len && !memcmp(key, cur->key.kv, keyl))
-+ break;
-+ cur->islookup = 0;
-+ if (r == 0)
-+ r = cur_getval(cur);
-+ return r;
-+}
-+
-+static int cur_lookup_ge(struct bdb_cur *cur, const unsigned char *key, unsigned int keyl)
-+{
-+ int r = -1;
-+ if (cur->db->type == BDB_BTREE)
-+ r = btree_lookup(cur, key, keyl);
-+ if (r != 0)
-+ return r;
-+ cur->islookup = 1;
-+ while ((r = cur_next(cur)) == 0) {
-+ unsigned int ekeyl = cur->key.len;
-+ int cmp = memcmp(cur->key.kv, key, keyl < ekeyl ? keyl : ekeyl);
-+ if (cmp > 0 || (cmp == 0 && ekeyl >= keyl))
-+ break;
-+ }
-+ cur->islookup = 0;
-+ if (r == 0)
-+ r = cur_getval(cur);
-+ else if (r == 1)
-+ r = cur_next(cur);
-+ return r;
-+}
-+
-+/****** glue code ******/
-+
-+static unsigned int getui32(unsigned char *x, int swapped)
-+{
-+ union _dbswap bs;
-+ memcpy(bs.uc, x, 4);
-+ if (swapped)
-+ _DBSWAP(bs);
-+ return bs.ui;
-+}
-+
-+static void setui32(unsigned char *x, uint32_t v, int swapped)
-+{
-+ union _dbswap bs;
-+ bs.ui = v;
-+ if (swapped)
-+ _DBSWAP(bs);
-+ memcpy(x, bs.uc, 4);
-+}
-+
-+static void log_error(dbiIndex dbi)
-+{
-+ rpmlog(RPMLOG_ERR, "bdb_ro error reading %s database\n", dbi->dbi_file);
-+}
-+
-+static int bdbro_Open(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
-+{
-+ const char *dbhome = rpmdbHome(rdb);
-+ dbiIndex dbi = NULL;
-+ char *path;
-+
-+ if (dbip)
-+ *dbip = NULL;
-+ if ((rdb->db_mode & O_ACCMODE) != O_RDONLY)
-+ return EPERM;
-+ if ((dbi = dbiNew(rdb, rpmtag)) == NULL)
-+ return 1;
-+ path = rstrscat(NULL, dbhome, "/", dbi->dbi_file, NULL);
-+ rpmlog(RPMLOG_DEBUG, "opening db index %s\n", path);
-+ dbi->dbi_db = bdb_open(path);
-+ if (!dbi->dbi_db) {
-+ rpmlog(RPMLOG_ERR, "could not open %s: %s\n", path, strerror(errno));
-+ free(path);
-+ dbiFree(dbi);
-+ return 1;
-+ }
-+ free(path);
-+ dbi->dbi_flags |= DBI_RDONLY;
-+ if (dbip)
-+ *dbip = dbi;
-+ else
-+ (void) dbiClose(dbi, 0);
-+ return 0;
-+}
-+
-+static int bdbro_Close(dbiIndex dbi, unsigned int flags)
-+{
-+ if (dbi->dbi_db)
-+ bdb_close(dbi->dbi_db);
-+ dbiFree(dbi);
-+ return 0;
-+}
-+
-+static int bdbro_Verify(dbiIndex dbi, unsigned int flags)
-+{
-+ return 0;
-+}
-+
-+static void bdbro_SetFSync(rpmdb rdb, int enable)
-+{
-+}
-+
-+static int bdbro_Ctrl(rpmdb rdb, dbCtrlOp ctrl)
-+{
-+ return 0;
-+}
-+
-+static dbiCursor bdbro_CursorInit(dbiIndex dbi, unsigned int flags)
-+{
-+ return dbi ? (void *)cur_open(dbi->dbi_db) : NULL;
-+}
-+
-+static dbiCursor bdbro_CursorFree(dbiIndex dbi, dbiCursor dbc)
-+{
-+ if (dbc)
-+ cur_close((void *)dbc);
-+ return NULL;
-+}
-+
-+static void appenddbt(dbiCursor dbc, unsigned char *val, unsigned int vallen, dbiIndexSet *setp)
-+{
-+ struct bdb_cur *cur = (void *)dbc;
-+ dbiIndexSet set;
-+ unsigned int i;
-+
-+ set = dbiIndexSetNew(vallen / (2 * sizeof(uint32_t)));
-+ set->count = vallen / (2 * sizeof(uint32_t));
-+
-+ for (i = 0; i < set->count; i++, val += 8) {
-+ set->recs[i].hdrNum = getui32(val, cur->db->swapped);
-+ set->recs[i].tagNum = getui32(val + 4, cur->db->swapped);
-+ }
-+ if (*setp == NULL) {
-+ *setp = set;
-+ } else {
-+ dbiIndexSetAppendSet(*setp, set, 0);
-+ dbiIndexSetFree(set);
-+ }
-+}
-+
-+static rpmRC bdbro_idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec)
-+{
-+ return RPMRC_FAIL;
-+}
-+
-+static rpmRC bdbro_idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec)
-+{
-+ return RPMRC_FAIL;
-+}
-+
-+static rpmRC bdbro_idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
-+ dbiIndexSet *set, int searchType)
-+{
-+ struct bdb_cur *cur = (void *)dbc;
-+ int r;
-+
-+ if (!cur)
-+ return RPMRC_FAIL;
-+ if (searchType == DBC_PREFIX_SEARCH) {
-+ rpmRC rc = RPMRC_NOTFOUND;
-+ if (!keyp)
-+ return RPMRC_FAIL;
-+ r = cur_lookup_ge(cur, (const unsigned char *)keyp, keylen);
-+ for (; r == 0; r = cur_next(cur)) {
-+ if (cur->key.len < keylen || memcmp(cur->key.kv, keyp, keylen) != 0)
-+ break;
-+ if (set)
-+ appenddbt(dbc, cur->val.kv, cur->val.len, set);
-+ rc = RPMRC_OK;
-+ }
-+ if (r == -1)
-+ log_error(dbi);
-+ cur->key.kv = 0;
-+ return r == -1 ? RPMRC_FAIL : rc;
-+ }
-+ if (keyp) {
-+ if (keylen == 0) {
-+ keyp = "";
-+ keylen = 1;
-+ }
-+ r = cur_lookup(cur, (const unsigned char *)keyp, keylen);
-+ } else {
-+ r = cur_next(cur);
-+ }
-+ if (r == 0) {
-+ if (set)
-+ appenddbt(dbc, cur->val.kv, cur->val.len, set);
-+ return RPMRC_OK;
-+ }
-+ if (r == -1)
-+ log_error(dbi);
-+ cur->key.kv = 0;
-+ return r == 1 ? RPMRC_NOTFOUND : RPMRC_FAIL;
-+}
-+
-+static const void *bdbro_idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen)
-+{
-+ struct bdb_cur *cur = (void *)dbc;
-+ if (!cur || !cur->key.kv)
-+ return 0;
-+ if (keylen)
-+ *keylen = cur->key.len;
-+ return cur->key.kv;
-+}
-+
-+static rpmRC bdbro_pkgdbPut(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum,
-+ unsigned char *hdrBlob, unsigned int hdrLen)
-+{
-+ return RPMRC_FAIL;
-+}
-+
-+static rpmRC bdbro_pkgdbDel(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum)
-+{
-+ return RPMRC_FAIL;
-+}
-+
-+static rpmRC bdbro_pkgdbNew(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum)
-+{
-+ return RPMRC_FAIL;
-+}
-+
-+static rpmRC bdbro_pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum,
-+ unsigned char **hdrBlob, unsigned int *hdrLen)
-+{
-+ struct bdb_cur *cur = (void *)dbc;
-+ int r;
-+ if (hdrNum) {
-+ unsigned char hdrkey[4];
-+ setui32(hdrkey, hdrNum, cur->db->swapped);
-+ r = cur_lookup(cur, hdrkey, 4);
-+ } else {
-+ r = cur_next(cur);
-+ }
-+ if (r == 0) {
-+ if (hdrBlob)
-+ *hdrBlob = cur->val.kv;
-+ if (hdrLen)
-+ *hdrLen = cur->val.len;
-+ return RPMRC_OK;
-+ }
-+ if (r == -1)
-+ log_error(dbi);
-+ cur->key.kv = 0;
-+ return r == 1 ? RPMRC_NOTFOUND : RPMRC_FAIL;
-+}
-+
-+static unsigned int bdbro_pkgdbKey(dbiIndex dbi, dbiCursor dbc)
-+{
-+ struct bdb_cur *cur = (void *)dbc;
-+ if (!cur || !cur->key.kv || cur->key.len != 4)
-+ return 0;
-+ return getui32(cur->key.kv, cur->db->swapped);
-+}
-+
-+struct rpmdbOps_s bdbro_dbops = {
-+ .name = "bdb_ro",
-+ .path = "Packages",
-+
-+ .open = bdbro_Open,
-+ .close = bdbro_Close,
-+ .verify = bdbro_Verify,
-+ .setFSync = bdbro_SetFSync,
-+ .ctrl = bdbro_Ctrl,
-+
-+ .cursorInit = bdbro_CursorInit,
-+ .cursorFree = bdbro_CursorFree,
-+
-+ .pkgdbPut = bdbro_pkgdbPut,
-+ .pkgdbDel = bdbro_pkgdbDel,
-+ .pkgdbGet = bdbro_pkgdbGet,
-+ .pkgdbNew = bdbro_pkgdbNew,
-+ .pkgdbKey = bdbro_pkgdbKey,
-+
-+ .idxdbGet = bdbro_idxdbGet,
-+ .idxdbPut = bdbro_idxdbPut,
-+ .idxdbDel = bdbro_idxdbDel,
-+ .idxdbKey = bdbro_idxdbKey
-+};
-+
---- ./lib/backend/dbi.c.orig 2020-01-17 12:07:10.382060851 +0000
-+++ ./lib/backend/dbi.c 2020-01-17 12:07:57.129945219 +0000
-@@ -22,6 +22,9 @@ const struct rpmdbOps_s *backends[] = {
- #if defined(WITH_BDB)
- &db3_dbops,
- #endif
-+#if defined(WITH_BDB_RO)
-+ &bdbro_dbops,
-+#endif
- &dummydb_dbops,
- NULL
- };
---- ./lib/backend/dbi.h.orig 2020-01-17 12:07:10.382060851 +0000
-+++ ./lib/backend/dbi.h 2020-01-17 12:07:57.129945219 +0000
-@@ -273,6 +273,11 @@ RPM_GNUC_INTERNAL
- extern struct rpmdbOps_s db3_dbops;
- #endif
-
-+#if defined(WITH_BDB_RO)
-+RPM_GNUC_INTERNAL
-+extern struct rpmdbOps_s bdbro_dbops;
-+#endif
-+
- #ifdef ENABLE_NDB
- RPM_GNUC_INTERNAL
- extern struct rpmdbOps_s ndb_dbops;
diff --git a/brp-compress-no-img.patch b/brp-compress-no-img.patch
index 0ed2573..9c53af8 100644
--- a/brp-compress-no-img.patch
+++ b/brp-compress-no-img.patch
@@ -1,6 +1,6 @@
---- ./scripts/brp-compress.orig 2019-10-02 12:09:46.263708258 +0000
-+++ ./scripts/brp-compress 2019-10-02 12:09:52.055696056 +0000
-@@ -50,6 +50,7 @@ do
+--- ./scripts/brp-compress.orig 2020-09-30 13:09:28.846434576 +0000
++++ ./scripts/brp-compress 2020-09-30 13:09:34.514422459 +0000
+@@ -51,6 +51,7 @@ do
find $d -type f ! -name dir | while read f
do
[ -f "$f" ] || continue
diff --git a/brp.diff b/brp.diff
index 6518243..048615b 100644
--- a/brp.diff
+++ b/brp.diff
@@ -1,5 +1,5 @@
---- ./scripts/brp-strip-comment-note.orig 2017-08-10 08:08:07.150108692 +0000
-+++ ./scripts/brp-strip-comment-note 2017-12-01 14:29:56.761975721 +0000
+--- ./scripts/brp-strip-comment-note.orig 2020-05-28 10:04:25.076136900 +0000
++++ ./scripts/brp-strip-comment-note 2020-09-30 12:27:44.484016581 +0000
@@ -16,6 +16,8 @@ esac
# for already stripped elf files in the build root
for f in `find "$RPM_BUILD_ROOT" -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) -exec file {} \; | \
@@ -9,13 +9,11 @@
sed -n -e 's/^\(.*\):[ ]*ELF.*, stripped.*/\1/p'`; do
note="-R .note"
if $OBJDUMP -h $f | grep '^[ ]*[0-9]*[ ]*.note[ ]' -A 1 | \
---- ./scripts/brp-strip.orig 2017-08-10 08:08:07.150108692 +0000
-+++ ./scripts/brp-strip 2017-12-01 14:29:56.761975721 +0000
-@@ -15,6 +15,7 @@ esac
- for f in `find "$RPM_BUILD_ROOT" -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) -exec file {} \; | \
- grep -v "^${RPM_BUILD_ROOT}/\?usr/lib/debug" | \
- grep -v ' shared object,' | \
-+ grep -v '/lib/modules/' | \
- sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped.*/\1/p'`; do
- $STRIP -g "$f" || :
- done
+--- ./scripts/brp-strip.orig 2020-09-30 12:27:44.484016581 +0000
++++ ./scripts/brp-strip 2020-09-30 12:28:43.959881586 +0000
+@@ -14,4 +14,4 @@ esac
+
+ # Strip ELF binaries
+ find "$RPM_BUILD_ROOT" -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) \! -regex "${RPM_BUILD_ROOT}/*usr/lib/debug.*" -print0 | \
+- xargs -0 -r -P$NCPUS -n32 sh -c "file \"\$@\" | grep -v ' shared object,' | sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped.*/\1/p' | xargs -I\{\} $STRIP -g \{\}" ARG0
++ xargs -0 -r -P$NCPUS -n32 sh -c "file \"\$@\" | grep -v ' shared object,' | grep -v '/lib/modules/' | sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped.*/\1/p' | xargs -I\{\} $STRIP -g \{\}" ARG0
diff --git a/brpcompress.diff b/brpcompress.diff
index f0d512a..ccb3736 100644
--- a/brpcompress.diff
+++ b/brpcompress.diff
@@ -1,5 +1,5 @@
---- ./scripts/brp-compress.orig 2019-10-02 09:59:40.403995534 +0000
-+++ ./scripts/brp-compress 2019-10-02 10:03:27.075537047 +0000
+--- ./scripts/brp-compress.orig 2020-05-28 10:04:25.075136894 +0000
++++ ./scripts/brp-compress 2020-10-27 15:23:57.970737863 +0000
@@ -5,6 +5,9 @@ if [ -z "$RPM_BUILD_ROOT" ] || [ "$RPM_B
exit 0
fi
@@ -10,7 +10,7 @@
PREFIX=${1:-/usr}
cd "$RPM_BUILD_ROOT"
-@@ -13,6 +16,29 @@ cd "$RPM_BUILD_ROOT"
+@@ -13,6 +16,30 @@ cd "$RPM_BUILD_ROOT"
COMPRESS=${COMPRESS:-gzip -9 -n}
COMPRESS_EXT=${COMPRESS_EXT:-.gz}
@@ -29,6 +29,7 @@
+ *.Z|*.gz) gunzip $b ;;
+ *.bz2) bunzip2 $b ;;
+ *.xz|*.lzma) unxz $b ;;
++ *.zst|*.zstd) unzstd --rm $b ;;
+ esac
+
+ type=${b##*.}
@@ -40,7 +41,7 @@
for d in .${PREFIX}/man/man* .${PREFIX}/man/*/man* .${PREFIX}/info \
.${PREFIX}/share/man/man* .${PREFIX}/share/man/*/man* \
.${PREFIX}/share/info .${PREFIX}/kerberos/man \
-@@ -21,39 +47,39 @@ for d in .${PREFIX}/man/man* .${PREFIX}/
+@@ -21,40 +48,40 @@ for d in .${PREFIX}/man/man* .${PREFIX}/
.${PREFIX}/share/fish/man/man*
do
[ -d $d ] || continue
@@ -53,9 +54,11 @@
- *.gz|*.Z) gunzip -f $f; b=`echo $f | sed -e 's/\.\(gz\|Z\)$//'`;;
- *.bz2) bunzip2 -f $f; b=`echo $f | sed -e 's/\.bz2$//'`;;
- *.xz|*.lzma) unxz -f $f; b=`echo $f | sed -e 's/\.\(xz\|lzma\)$//'`;;
+- *.zst|*.zstd) unzstd -f --rm $f; b=`echo $f | sed -e 's/\.\(zst\|zstd\)$//'`;;
+ *.gz|*.Z) gunzip -f "$f" || check_for_hard_link $d "$f"; b=`echo $f | sed -e 's/\.\(gz\|Z\)$//'`;;
+ *.bz2) bunzip2 -f "$f" || check_for_hard_link $d "$f"; b=`echo $f | sed -e 's/\.bz2$//'`;;
+ *.xz|*.lzma) unxz -f "$f" || check_for_hard_link $d "$f"; b=`echo $f | sed -e 's/\.\(xz\|lzma\)$//'`;;
++ *.zst|*.zstd) unzstd -f --rm "$f" || check_for_hard_link $d "$f"; b=`echo $f | sed -e 's/\.\(zst\|zstd\)$//'`;;
*) b=$f;;
esac
@@ -84,13 +87,13 @@
- for f in `find $d -type l`
+ find $d -type l | while read f
do
-- l=`ls -l $f | sed -e 's/.* -> //' -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\)$//'`
+- l=`ls -l $f | sed -e 's/.* -> //' -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\|zst\|zstd\)$//'`
- rm -f $f
-- b=`echo $f | sed -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\)$//'`
+- b=`echo $f | sed -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\|zst\|zstd\)$//'`
- ln -sf $l$COMPRESS_EXT $b$COMPRESS_EXT
-+ l="`ls -l "$f" | sed -e 's/.* -> //' -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\)$//'`"
++ l=`ls -l "$f" | sed -e 's/.* -> //' -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\|zst\|zstd\)$//'`
+ rm -f "$f"
-+ b="`echo "$f" | sed -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\)$//'`"
++ b=`echo "$f" | sed -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\|zst\|zstd\)$//'`
+ ln -sf "$l$COMPRESS_EXT" "$b$COMPRESS_EXT"
done
done
diff --git a/checkfilesnoinfodir.diff b/checkfilesnoinfodir.diff
index d47979f..2565e0d 100644
--- a/checkfilesnoinfodir.diff
+++ b/checkfilesnoinfodir.diff
@@ -1,12 +1,12 @@
Exclude /usr/share/info/dir from check-files. Probably only
interesting for SUSE.
---- scripts/check-files.orig 2013-06-10 15:55:10.000000000 +0000
-+++ scripts/check-files 2013-07-12 11:45:37.000000000 +0000
+--- ./scripts/check-files.orig 2020-09-30 12:36:56.398762048 +0000
++++ ./scripts/check-files 2020-09-30 12:41:15.294176572 +0000
@@ -28,5 +28,5 @@ trap "rm -f \"${FILES_DISK}\"" 0 2 3 5 1
# Find non-directory files in the build root and compare to the manifest.
# TODO: regex chars in last sed(1) expression should be escaped
find "${RPM_BUILD_ROOT}" -type f -o -type l | LC_ALL=C sort > "${FILES_DISK}"
--LC_ALL=C sort | diff -d "${FILES_DISK}" - | sed -n 's|^< '"${RPM_BUILD_ROOT}"'\(.*\)$| \1|gp'
-+LC_ALL=C sort | diff -d "${FILES_DISK}" - | sed -n -e 's|^< '"${RPM_BUILD_ROOT}"'/usr/share/info/dir$||' -e 's|^< '"${RPM_BUILD_ROOT}"'\(.*\)$| \1|gp'
+-LC_ALL=C sort | diff -d "${FILES_DISK}" - | sed -n 's!^\(-\|< \)'"${RPM_BUILD_ROOT}"'\(.*\)$! \2!gp'
++LC_ALL=C sort | diff -d "${FILES_DISK}" - | sed -n -e 's!^\(-\|< \)'"${RPM_BUILD_ROOT}"'/usr/share/info/dir$!!' -e 's!^\(-\|< \)'"${RPM_BUILD_ROOT}"'\(.*\)$! \2!gp'
diff --git a/db_conversion.diff b/db_conversion.diff
index 258bd33..7d2986c 100644
--- a/db_conversion.diff
+++ b/db_conversion.diff
@@ -1,6 +1,6 @@
---- ./lib/backend/bdb_ro.c.orig 2020-03-24 20:45:19.121907476 +0000
-+++ ./lib/backend/bdb_ro.c 2020-03-24 20:46:17.141727988 +0000
-@@ -795,6 +795,7 @@ static unsigned int bdbro_pkgdbKey(dbiIn
+--- ./lib/backend/bdb_ro.c.orig 2020-05-28 10:04:25.027136631 +0000
++++ ./lib/backend/bdb_ro.c 2021-01-07 15:24:08.866776792 +0000
+@@ -790,6 +790,7 @@ static unsigned int bdbro_pkgdbKey(dbiIn
struct rpmdbOps_s bdbro_dbops = {
.name = "bdb_ro",
.path = "Packages",
@@ -8,13 +8,13 @@
.open = bdbro_Open,
.close = bdbro_Close,
---- ./lib/backend/dbi.c.orig 2020-03-24 20:45:19.121907476 +0000
-+++ ./lib/backend/dbi.c 2020-03-24 20:46:17.141727988 +0000
-@@ -105,11 +105,20 @@ dbDetectBackend(rpmdb rdb)
+--- ./lib/backend/dbi.c.orig 2020-08-31 09:14:07.991087349 +0000
++++ ./lib/backend/dbi.c 2021-01-07 15:24:08.866776792 +0000
+@@ -119,11 +119,20 @@ exit:
}
rdb->db_descr = rdb->db_ops->name;
-+ rdb->db_ops_config = ops_config;
++ rdb->db_ops_config = cfg;
if (db_backend)
free(db_backend);
@@ -31,17 +31,17 @@
const char * dbiName(dbiIndex dbi)
{
return dbi->dbi_file;
---- ./lib/backend/dbi.h.orig 2020-03-24 20:45:19.121907476 +0000
-+++ ./lib/backend/dbi.h 2020-03-24 20:46:17.141727988 +0000
-@@ -10,6 +10,7 @@ enum rpmdbFlags {
- RPMDB_FLAG_JUSTCHECK = (1 << 0),
+--- ./lib/backend/dbi.h.orig 2021-01-07 15:23:56.122812108 +0000
++++ ./lib/backend/dbi.h 2021-01-07 15:24:08.866776792 +0000
+@@ -11,6 +11,7 @@ enum rpmdbFlags {
RPMDB_FLAG_REBUILD = (1 << 1),
RPMDB_FLAG_VERIFYONLY = (1 << 2),
-+ RPMDB_FLAG_CONVERT = (1 << 3),
+ RPMDB_FLAG_SALVAGE = (1 << 3),
++ RPMDB_FLAG_CONVERT = (1 << 4),
};
typedef enum dbCtrlOp_e {
-@@ -62,6 +63,7 @@ struct rpmdb_s {
+@@ -63,6 +64,7 @@ struct rpmdb_s {
int db_buildindex; /*!< Index rebuild indicator */
const struct rpmdbOps_s * db_ops; /*!< backend ops */
@@ -49,7 +49,7 @@
/* dbenv and related parameters */
void * db_dbenv; /*!< Backend private handle */
-@@ -201,6 +203,14 @@ RPM_GNUC_INTERNAL
+@@ -209,6 +211,14 @@ RPM_GNUC_INTERNAL
const char * dbiName(dbiIndex dbi);
/** \ingroup dbi
@@ -64,7 +64,7 @@
* Open a database cursor.
* @param dbi index database handle
* @param flags DBC_WRITE if writing, or 0 (DBC_READ) for reading
-@@ -246,6 +256,7 @@ const void * idxdbKey(dbiIndex dbi, dbiC
+@@ -252,6 +262,7 @@ const void * idxdbKey(dbiIndex dbi, dbiC
struct rpmdbOps_s {
const char *name; /* backend name */
const char *path; /* main database name */
@@ -72,27 +72,42 @@
int (*open)(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags);
int (*close)(dbiIndex dbi, unsigned int flags);
---- ./lib/rpmdb.c.orig 2020-03-24 20:45:19.117907488 +0000
-+++ ./lib/rpmdb.c 2020-03-24 21:01:54.870821518 +0000
-@@ -513,8 +513,16 @@ static int openDatabase(const char * pre
+--- ./lib/backend/ndb/rpmpkg.c.orig 2021-01-07 15:24:37.266698082 +0000
++++ ./lib/backend/ndb/rpmpkg.c 2021-01-07 15:27:46.678173133 +0000
+@@ -1116,11 +1116,12 @@ static int rpmpkgPutInternal(rpmpkgdb pk
+ if (rpmpkgWriteBlob(pkgdb, pkgidx, blkoff, blkcnt, blob, blobl, pkgdb->generation)) {
+ return RPMRC_FAIL;
+ }
++ /* update nextpkgidx if needed */
++ if (pkgidx >= pkgdb->nextpkgidx) {
++ pkgdb->nextpkgidx = pkgidx + 1;
++ }
+ /* write slot */
+ slotno = oldslot ? oldslot->slotno : pkgdb->freeslot;
+- if (!slotno) {
+- return RPMRC_FAIL;
+- }
+ if (rpmpkgWriteslot(pkgdb, slotno, pkgidx, blkoff, blkcnt)) {
+ free(pkgdb->slots);
+ pkgdb->slots = 0;
+--- ./lib/rpmdb.c.orig 2021-01-07 15:23:56.122812108 +0000
++++ ./lib/rpmdb.c 2021-01-07 15:24:08.866776792 +0000
+@@ -516,7 +516,13 @@ static int openDatabase(const char * pre
rpmsqActivate(1);
}
-+ /* Convert the database if needed */
+- rc = doOpen(db, justPkgs);
+ if (!db->db_pkgs && !justCheck && (mode & O_ACCMODE) == O_RDWR && dbiNeedConversion(db)) {
-+ rpmlog(RPMLOG_WARNING, _("Converting database from %s to %s format\n"), db->db_ops->name, db->db_ops_config->name);
-+ rc = rpmdbRebuild(prefix, NULL, NULL, RPMDB_FLAG_CONVERT);
++ rc = rpmdbRebuild(prefix, NULL, NULL, RPMDB_REBUILD_FLAG_CONVERT);
+ db->db_ops = NULL; /* force re-detection of backend */
+ }
+
- /* Just the primary Packages database opened here */
-- rc = pkgdbOpen(db, db->db_flags, NULL);
+ if (!rc)
-+ rc = pkgdbOpen(db, db->db_flags, NULL);
++ rc = doOpen(db, justPkgs);
+
if (!db->db_descr)
db->db_descr = "unknown db";
- }
-@@ -2316,6 +2324,15 @@ int rpmdbAdd(rpmdb db, Header h)
+@@ -2311,6 +2317,15 @@ int rpmdbAdd(rpmdb db, Header h)
if (db == NULL)
return 0;
@@ -108,32 +123,12 @@
hdrBlob = headerExport(h, &hdrLen);
if (hdrBlob == NULL || hdrLen == 0) {
ret = -1;
-@@ -2331,7 +2348,8 @@ int rpmdbAdd(rpmdb db, Header h)
-
- /* Add header to primary index */
- dbc = dbiCursorInit(dbi, DBC_WRITE);
-- ret = pkgdbNew(dbi, dbc, &hdrNum);
-+ if ((db->db_flags & RPMDB_FLAG_CONVERT) == 0)
-+ ret = pkgdbNew(dbi, dbc, &hdrNum);
- if (ret == 0)
- ret = pkgdbPut(dbi, dbc, hdrNum, hdrBlob, hdrLen);
- dbiCursorFree(dbi, dbc);
-@@ -2491,7 +2509,8 @@ static int rpmdbSetPermissions(char * sr
- }
-
- int rpmdbRebuild(const char * prefix, rpmts ts,
-- rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg))
-+ rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg),
-+ int newdbflags)
- {
- rpmdb olddb;
- char * dbpath = NULL;
-@@ -2512,7 +2531,22 @@ int rpmdbRebuild(const char * prefix, rp
+@@ -2506,7 +2521,22 @@ int rpmdbRebuild(const char * prefix, rp
}
rootdbpath = rpmGetPath(prefix, dbpath, NULL);
- newdbpath = rpmGetPath("%{?_dbpath_rebuild}", NULL);
-+ if ((newdbflags & RPMDB_FLAG_CONVERT) != 0) {
++ if ((rebuildflags & RPMDB_REBUILD_FLAG_CONVERT) != 0) {
+ char lbuf[PATH_MAX];
+ ssize_t s = readlink(rootdbpath, lbuf, PATH_MAX);
+ if (s > 0 && s < PATH_MAX) {
@@ -152,43 +147,24 @@
if (rstreq(newdbpath, "") || rstreq(newdbpath, dbpath)) {
newdbpath = _free(newdbpath);
rasprintf(&newdbpath, "%srebuilddb.%d", dbpath, (int) getpid());
-@@ -2536,7 +2570,7 @@ int rpmdbRebuild(const char * prefix, rp
+@@ -2532,7 +2562,9 @@ int rpmdbRebuild(const char * prefix, rp
goto exit;
}
if (openDatabase(prefix, newdbpath, &newdb,
- (O_RDWR | O_CREAT), 0644, RPMDB_FLAG_REBUILD)) {
-+ (O_RDWR | O_CREAT), 0644, RPMDB_FLAG_REBUILD | newdbflags)) {
++ (O_RDWR | O_CREAT), 0644, RPMDB_FLAG_REBUILD |
++ (rebuildflags & RPMDB_REBUILD_FLAG_CONVERT ?
++ RPMDB_FLAG_CONVERT : 0))) {
rc = 1;
goto exit;
}
---- ./lib/rpmdb_internal.h.orig 2019-06-26 14:17:31.412985694 +0000
-+++ ./lib/rpmdb_internal.h 2020-03-24 20:46:17.141727988 +0000
-@@ -63,11 +63,13 @@ int rpmdbClose (rpmdb db);
- * @param prefix path to top of install tree
- * @param ts transaction set (or NULL)
- * @param (*hdrchk) headerCheck() vector (or NULL)
-+ * @param newdbflags extra flags for the new database
- * @return 0 on success
- */
- RPM_GNUC_INTERNAL
- int rpmdbRebuild(const char * prefix, rpmts ts,
-- rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg));
-+ rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg),
-+ int newdbflags);
+--- ./lib/rpmdb_internal.h.orig 2020-05-28 10:04:25.037136686 +0000
++++ ./lib/rpmdb_internal.h 2021-01-07 15:24:08.866776792 +0000
+@@ -25,6 +25,7 @@ extern "C" {
+
+ enum rpmdbRebuildFlags_e {
+ RPMDB_REBUILD_FLAG_SALVAGE = (1 << 0),
++ RPMDB_REBUILD_FLAG_CONVERT = (1 << 1),
+ };
/** \ingroup rpmdb
- * Verify database components.
---- ./lib/rpmts.c.orig 2020-03-24 20:45:19.105907526 +0000
-+++ ./lib/rpmts.c 2020-03-24 20:46:17.145727976 +0000
-@@ -143,9 +143,9 @@ int rpmtsRebuildDB(rpmts ts)
- txn = rpmtxnBegin(ts, RPMTXN_WRITE);
- if (txn) {
- if (!(ts->vsflags & RPMVSF_NOHDRCHK))
-- rc = rpmdbRebuild(ts->rootDir, ts, headerCheck);
-+ rc = rpmdbRebuild(ts->rootDir, ts, headerCheck, 0);
- else
-- rc = rpmdbRebuild(ts->rootDir, NULL, NULL);
-+ rc = rpmdbRebuild(ts->rootDir, NULL, NULL, 0);
- rpmtxnEnd(txn);
- }
- return rc;
diff --git a/db_ops_name.diff b/db_ops_name.diff
deleted file mode 100644
index d3f32f4..0000000
--- a/db_ops_name.diff
+++ /dev/null
@@ -1,248 +0,0 @@
---- ./lib/backend/db3.c.orig 2020-01-17 11:50:39.048477444 +0000
-+++ ./lib/backend/db3.c 2020-01-17 11:58:15.351365745 +0000
-@@ -421,10 +421,6 @@ static int db_init(rpmdb rdb, const char
- if (rdb->db_dbenv != NULL) {
- rdb->db_opens++;
- return 0;
-- } else {
-- /* On first call, set backend description to something... */
-- free(rdb->db_descr);
-- rasprintf(&rdb->db_descr, "db%u", DB_VERSION_MAJOR);
- }
-
- /*
-@@ -1426,6 +1422,9 @@ static rpmRC db3_pkgdbNew(dbiIndex dbi,
- }
-
- struct rpmdbOps_s db3_dbops = {
-+ .name = "bdb",
-+ .path = "Packages",
-+
- .open = db3_dbiOpen,
- .close = db3_dbiClose,
- .verify = db3_dbiVerify,
---- ./lib/backend/dbi.c.orig 2020-01-17 11:54:38.207894769 +0000
-+++ ./lib/backend/dbi.c 2020-01-17 11:56:45.555584517 +0000
-@@ -12,6 +12,19 @@
- #include "lib/rpmdb_internal.h"
- #include "debug.h"
-
-+const struct rpmdbOps_s *backends[] = {
-+#if defined(WITH_LMDB)
-+ &lmdb_dbops,
-+#endif
-+#ifdef ENABLE_NDB
-+ &ndb_dbops,
-+#endif
-+#if defined(WITH_BDB)
-+ &db3_dbops,
-+#endif
-+ &dummydb_dbops,
-+ NULL
-+};
-
- dbiIndex dbiFree(dbiIndex dbi)
- {
-@@ -38,59 +51,58 @@ dbDetectBackend(rpmdb rdb)
- const char *dbhome = rpmdbHome(rdb);
- char *db_backend = rpmExpand("%{?_db_backend}", NULL);
- char *path = NULL;
-+ const struct rpmdbOps_s **ops, *ops_config;
-
--#if defined(WITH_LMDB)
-- if (!strcmp(db_backend, "lmdb")) {
-- rdb->db_ops = &lmdb_dbops;
-- } else
--#endif
--#ifdef ENABLE_NDB
-- if (!strcmp(db_backend, "ndb")) {
-- rdb->db_ops = &ndb_dbops;
-- } else
--#endif
--#if defined(WITH_BDB)
-- {
-- rdb->db_ops = &db3_dbops;
-- if (*db_backend == '\0') {
-- free(db_backend);
-- db_backend = xstrdup("bdb");
-+ rdb->db_ops = NULL;
-+
-+ ops_config = NULL;
-+ for (ops = backends; *ops; ops++) {
-+ if (rstreq(db_backend, (*ops)->name)) {
-+ ops_config = *ops;
-+ break;
- }
- }
--#endif
-
--#if defined(WITH_LMDB)
-- path = rstrscat(NULL, dbhome, "/data.mdb", NULL);
-- if (access(path, F_OK) == 0 && rdb->db_ops != &lmdb_dbops) {
-- rdb->db_ops = &lmdb_dbops;
-- rpmlog(RPMLOG_WARNING, _("Found LMDB data.mdb database while attempting %s backend: using lmdb backend.\n"), db_backend);
-+ /* if we have a configured backend, check it first */
-+ if (ops_config && ops_config->path) {
-+ path = rstrscat(NULL, dbhome, "/", ops_config->path, NULL);
-+ if (access(path, F_OK) == 0)
-+ rdb->db_ops = ops_config;
-+ free(path);
- }
-- free(path);
--#endif
-
--#ifdef ENABLE_NDB
-- path = rstrscat(NULL, dbhome, "/Packages.db", NULL);
-- if (access(path, F_OK) == 0 && rdb->db_ops != &ndb_dbops) {
-- rdb->db_ops = &ndb_dbops;
-- rpmlog(RPMLOG_WARNING, _("Found NDB Packages.db database while attempting %s backend: using ndb backend.\n"), db_backend);
-- }
-- free(path);
--#endif
-+ /* if it did not match, check all available backends */
-+ if (rdb->db_ops == NULL) {
-+ for (ops = backends; *ops; ops++) {
-+ if ((*ops)->path == NULL || *ops == ops_config)
-+ continue;
-
--#if defined(WITH_BDB)
-- path = rstrscat(NULL, dbhome, "/Packages", NULL);
-- if (access(path, F_OK) == 0 && rdb->db_ops != &db3_dbops) {
-- rdb->db_ops = &db3_dbops;
-- rpmlog(RPMLOG_WARNING, _("Found BDB Packages database while attempting %s backend: using bdb backend.\n"), db_backend);
-+ path = rstrscat(NULL, dbhome, "/", (*ops)->path, NULL);
-+ if (access(path, F_OK) == 0) {
-+ rpmlog(RPMLOG_DEBUG,
-+ _("Found %s %s database while attempting %s backend: "
-+ "using %s backend.\n"),
-+ (*ops)->name, (*ops)->path, db_backend, (*ops)->name);
-+ rdb->db_ops = *ops;
-+ }
-+ free(path);
-+ if (rdb->db_ops != NULL)
-+ break;
-+ }
- }
-- free(path);
--#endif
-
-+ /* if we did not find a match, use the configured backend */
-+ if (rdb->db_ops == NULL && ops_config)
-+ rdb->db_ops = ops_config;
-+
-+ /* if everything failed fall back to dummydb */
- if (rdb->db_ops == NULL) {
- rdb->db_ops = &dummydb_dbops;
-- rpmlog(RPMLOG_DEBUG, "using dummy database, installs not possible\n");
-+ rpmlog(RPMLOG_WARNING, "using dummy database, installs not possible\n");
- }
-
-+ rdb->db_descr = rdb->db_ops->name;
-+
- if (db_backend)
- free(db_backend);
- }
---- ./lib/backend/dbi.h.orig 2020-01-17 11:52:17.960236465 +0000
-+++ ./lib/backend/dbi.h 2020-01-17 11:57:36.907459407 +0000
-@@ -51,7 +51,7 @@ struct rpmdb_s {
- int db_flags;
- int db_mode; /*!< open mode */
- int db_perms; /*!< open permissions */
-- char * db_descr; /*!< db backend description (for error msgs) */
-+ const char * db_descr; /*!< db backend description (for error msgs) */
- struct dbChk_s * db_checked;/*!< headerCheck()'ed package instances */
- rpmdb db_next;
- int db_opens;
-@@ -61,7 +61,7 @@ struct rpmdb_s {
- dbiIndex * db_indexes; /*!< Tag indices. */
- int db_buildindex; /*!< Index rebuild indicator */
-
-- struct rpmdbOps_s * db_ops; /*!< backend ops */
-+ const struct rpmdbOps_s * db_ops; /*!< backend ops */
-
- /* dbenv and related parameters */
- void * db_dbenv; /*!< Backend private handle */
-@@ -244,6 +244,9 @@ RPM_GNUC_INTERNAL
- const void * idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen);
-
- struct rpmdbOps_s {
-+ const char *name; /* backend name */
-+ const char *path; /* main database name */
-+
- int (*open)(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags);
- int (*close)(dbiIndex dbi, unsigned int flags);
- int (*verify)(dbiIndex dbi, unsigned int flags);
---- ./lib/backend/dummydb.c.orig 2020-01-17 11:50:49.472452046 +0000
-+++ ./lib/backend/dummydb.c 2020-01-17 11:52:08.048260613 +0000
-@@ -93,6 +93,9 @@ static const void * dummydb_idxdbKey(dbi
-
-
- struct rpmdbOps_s dummydb_dbops = {
-+ .name = "dummy",
-+ .path = NULL,
-+
- .open = dummydb_Open,
- .close = dummydb_Close,
- .verify = dummydb_Verify,
---- ./lib/backend/lmdb.c.orig 2020-01-17 11:50:45.808460969 +0000
-+++ ./lib/backend/lmdb.c 2020-01-17 11:58:30.247329459 +0000
-@@ -137,10 +137,6 @@ static int db_init(rpmdb rdb, const char
- if (rdb->db_dbenv != NULL) {
- rdb->db_opens++;
- return 0;
-- } else {
-- /* On first call, set backend description to something... */
-- free(rdb->db_descr);
-- rdb->db_descr = xstrdup("lmdb");
- }
-
- MDB_dbi maxdbs = 32;
-@@ -916,6 +912,9 @@ exit:
- }
-
- struct rpmdbOps_s lmdb_dbops = {
-+ .name = "lmdb",
-+ .path = "data.mdb",
-+
- .open = lmdb_dbiOpen,
- .close = lmdb_dbiClose,
- .verify = lmdb_dbiVerify,
---- ./lib/backend/ndb/glue.c.orig 2020-01-17 11:51:09.708402746 +0000
-+++ ./lib/backend/ndb/glue.c 2020-01-17 11:51:56.272289298 +0000
-@@ -482,6 +482,9 @@ static const void * ndb_idxdbKey(dbiInde
-
-
- struct rpmdbOps_s ndb_dbops = {
-+ .name = "ndb",
-+ .path = "Packages.db",
-+
- .open = ndb_Open,
- .close = ndb_Close,
- .verify = ndb_Verify,
---- ./lib/rpmdb.c.orig 2020-01-17 11:59:15.279219743 +0000
-+++ ./lib/rpmdb.c 2020-01-17 12:00:36.495021876 +0000
-@@ -417,7 +417,6 @@ int rpmdbClose(rpmdb db)
- db->db_fullpath = _free(db->db_fullpath);
- db->db_checked = dbChkFree(db->db_checked);
- db->db_indexes = _free(db->db_indexes);
-- db->db_descr = _free(db->db_descr);
-
- if (next) {
- *prev = next->db_next;
-@@ -482,7 +481,6 @@ static rpmdb newRpmdb(const char * root,
- db->db_tags = dbiTags;
- db->db_ndbi = sizeof(dbiTags) / sizeof(rpmDbiTag);
- db->db_indexes = xcalloc(db->db_ndbi, sizeof(*db->db_indexes));
-- db->db_descr = xstrdup("unknown db");
- db->nrefs = 0;
- return rpmdbLink(db);
- }
-@@ -517,6 +515,8 @@ static int openDatabase(const char * pre
-
- /* Just the primary Packages database opened here */
- rc = pkgdbOpen(db, db->db_flags, NULL);
-+ if (!db->db_descr)
-+ db->db_descr = "unknown db";
- }
-
- if (rc || justCheck || dbp == NULL)
diff --git a/dbrointerruptable.diff b/dbrointerruptable.diff
index e2c77b9..6288ff6 100644
--- a/dbrointerruptable.diff
+++ b/dbrointerruptable.diff
@@ -1,5 +1,5 @@
---- ./lib/rpmdb.c.orig 2018-08-08 13:40:18.153941351 +0000
-+++ ./lib/rpmdb.c 2018-10-16 09:20:11.196708098 +0000
+--- ./lib/rpmdb.c.orig 2020-05-28 10:04:25.037136686 +0000
++++ ./lib/rpmdb.c 2020-09-30 12:23:50.708547165 +0000
@@ -387,9 +387,11 @@ int rpmdbClose(rpmdb db)
{
rpmdb * prev, next;
@@ -12,7 +12,7 @@
prev = &rpmdbRock;
while ((next = *prev) != NULL && next != db)
-@@ -424,7 +426,7 @@ int rpmdbClose(rpmdb db)
+@@ -423,7 +425,7 @@ int rpmdbClose(rpmdb db)
db = _free(db);
@@ -21,9 +21,9 @@
rpmsqActivate(0);
}
exit:
-@@ -509,7 +511,7 @@ static int openDatabase(const char * pre
- rc = rpmioMkpath(rpmdbHome(db), 0755, getuid(), getgid());
- if (rc == 0) {
+@@ -510,7 +512,7 @@ static int openDatabase(const char * pre
+ int justPkgs = (db->db_flags & RPMDB_FLAG_REBUILD) &&
+ ((db->db_mode & O_ACCMODE) == O_RDONLY);
/* Enable signal queue on the first db open */
- if (db->db_next == NULL) {
+ if (db->db_next == NULL && (db->db_mode & (O_RDWR|O_WRONLY)) != 0) {
diff --git a/disable_bdb.diff b/disable_bdb.diff
deleted file mode 100644
index d44632e..0000000
--- a/disable_bdb.diff
+++ /dev/null
@@ -1,15 +0,0 @@
---- configure.ac.orig 2020-01-17 12:25:06.451387587 +0000
-+++ configure.ac 2020-01-17 12:25:17.707357939 +0000
-@@ -537,11 +537,11 @@ AC_ARG_ENABLE([bdb],
- [enable_bdb="$enableval"],
- [enable_bdb=yes])
-
-+have_bdb="no"
- AS_IF([test "x$enable_bdb" != "xno"], [
- if [ test -x db/dist/configure ]; then
- have_bdb="internal"
- else
-- have_bdb="no"
- AC_CHECK_HEADERS([db.h],[
- AC_PREPROC_IFELSE([
- AC_LANG_SOURCE([
diff --git a/empty_dbbackend.diff b/empty_dbbackend.diff
new file mode 100644
index 0000000..e4f33f8
--- /dev/null
+++ b/empty_dbbackend.diff
@@ -0,0 +1,20 @@
+--- ./lib/backend/dbi.c.orig 2020-11-18 09:37:08.314743771 +0000
++++ ./lib/backend/dbi.c 2020-11-18 09:42:34.025792074 +0000
+@@ -77,7 +77,7 @@ dbDetectBackend(rpmdb rdb)
+ }
+ }
+
+- if (!cfg) {
++ if (!cfg && (rdb->db_flags & RPMDB_FLAG_REBUILD) != 0) {
+ rpmlog(RPMLOG_WARNING, _("invalid %%_db_backend: %s\n"), db_backend);
+ goto exit;
+ }
+@@ -97,7 +97,7 @@ dbDetectBackend(rpmdb rdb)
+ rpmlog(RPMLOG_WARNING,
+ _("Converting database from %s to %s backend\n"),
+ ondisk->name, cfg->name);
+- } else {
++ } else if (*db_backend) {
+ rpmlog(RPMLOG_WARNING,
+ _("Found %s %s database while attempting %s backend: "
+ "using %s backend.\n"),
diff --git a/findsupplements.diff b/findsupplements.diff
index c45c0e1..272c93a 100644
--- a/findsupplements.diff
+++ b/findsupplements.diff
@@ -1,25 +1,25 @@
---- ./scripts/Makefile.am.orig 2019-06-26 14:17:31.452985634 +0000
-+++ ./scripts/Makefile.am 2019-10-02 12:27:55.885450155 +0000
+--- ./scripts/Makefile.am.orig 2020-05-28 10:04:25.075136894 +0000
++++ ./scripts/Makefile.am 2020-09-30 13:11:48.626135765 +0000
@@ -16,7 +16,7 @@ EXTRA_DIST = \
- perl.prov perl.req pythondeps.sh pythondistdeps.py \
- rpmdb_loadcvt rpm.daily rpm.log rpm.supp rpm2cpio.sh \
+ rpmdb_dump rpmdb_load \
+ rpm.daily rpm.log rpm.supp rpm2cpio.sh \
tgpg vpkg-provides.sh \
- find-requires find-provides \
+ find-requires find-provides find-supplements \
find-requires.php find-provides.php \
- ocaml-find-requires.sh ocaml-find-provides.sh \
- pkgconfigdeps.sh libtooldeps.sh metainfo.prov \
-@@ -29,7 +29,7 @@ rpmconfig_SCRIPTS = \
+ ocamldeps.sh \
+ pkgconfigdeps.sh libtooldeps.sh \
+@@ -28,7 +28,7 @@ rpmconfig_SCRIPTS = \
+ brp-strip-shared brp-strip-static-archive \
check-files check-prereqs \
check-buildroot check-rpaths check-rpaths-worker \
- debuginfo.prov \
- find-lang.sh find-requires find-provides \
+ find-lang.sh find-requires find-provides find-supplements \
- perl.prov perl.req pythondeps.sh pythondistdeps.py \
- metainfo.prov \
+ perl.prov perl.req pythondistdeps.py \
pkgconfigdeps.sh libtooldeps.sh \
---- ./scripts/find-supplements.orig 2019-10-02 12:27:55.885450155 +0000
-+++ ./scripts/find-supplements 2019-10-02 12:27:55.885450155 +0000
+ ocamldeps.sh \
+--- ./scripts/find-supplements.orig 2020-09-30 13:10:46.546268477 +0000
++++ ./scripts/find-supplements 2020-09-30 13:10:46.546268477 +0000
@@ -0,0 +1,3 @@
+#!/bin/sh
+
diff --git a/gcryptdsa2.diff b/gcryptdsa2.diff
deleted file mode 100644
index b9d1037..0000000
--- a/gcryptdsa2.diff
+++ /dev/null
@@ -1,19 +0,0 @@
---- ./rpmio/digest_libgcrypt.c.orig
-+++ ./rpmio/digest_libgcrypt.c
-@@ -302,10 +302,16 @@ static int pgpVerifySigDSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig, uint8_t *hash, si
- struct pgpDigSigDSA_s *sig = pgpsig->data;
- gcry_sexp_t sexp_sig = NULL, sexp_data = NULL, sexp_pkey = NULL;
- int rc = 1;
-+ size_t qlen;
-
- if (!sig || !key)
- return rc;
-
-+ qlen = (mpi_get_nbits(key->q) + 7) / 8;
-+ if (qlen < 20)
-+ qlen = 20; /* sanity */
-+ if (hashlen > qlen)
-+ hashlen = qlen; /* dsa2: truncate hash to qlen */
- gcry_sexp_build(&sexp_sig, NULL, "(sig-val (dsa (r %M) (s %M)))", sig->r, sig->s);
- gcry_sexp_build(&sexp_data, NULL, "(data (flags raw) (value %b))", (int)hashlen, (const char *)hash);
- gcry_sexp_build(&sexp_pkey, NULL, "(public-key (dsa (p %M) (q %M) (g %M) (y %M)))", key->p, key->q, key->g, key->y);
diff --git a/ignore-auxv.diff b/ignore-auxv.diff
index 0b0de33..209df32 100644
--- a/ignore-auxv.diff
+++ b/ignore-auxv.diff
@@ -1,6 +1,6 @@
---- ./lib/rpmrc.c.orig 2019-06-26 14:17:31.416985688 +0000
-+++ ./lib/rpmrc.c 2019-10-02 09:52:05.076903733 +0000
-@@ -79,11 +79,13 @@ struct rpmOption {
+--- ./lib/rpmrc.c.orig 2020-09-30 07:48:01.215567727 +0000
++++ ./lib/rpmrc.c 2020-09-30 12:22:46.612692258 +0000
+@@ -78,10 +78,12 @@ struct rpmOption {
int localize;
};
@@ -8,22 +8,21 @@
static struct rpmat_s {
const char *platform;
uint64_t hwcap;
- uint64_t hwcap2;
} rpmat;
+#endif
typedef struct defaultEntry_s {
char * name;
-@@ -950,7 +952,7 @@ static int is_geode(void)
+@@ -948,7 +950,7 @@ static int is_geode(void)
#endif
-#if defined(__linux__)
+#if defined(__linux__) && (defined(__powerpc__) || defined(__sparc__) || (defined(__arm__) && defined(__ARM_PCS_VFP)))
- #ifndef AT_HWCAP2 /* glibc < 2.18 */
- #define AT_HWCAP2 26
- #endif
-@@ -1013,7 +1015,7 @@ static void defaultMachine(rpmrcCtx ctx,
+ /**
+ * Populate rpmat structure with auxv values
+ */
+@@ -1004,7 +1006,7 @@ static void defaultMachine(rpmrcCtx ctx,
canonEntry canon;
int rc;
diff --git a/initgcrypt.diff b/initgcrypt.diff
deleted file mode 100644
index bd03088..0000000
--- a/initgcrypt.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- ./rpmio/digest_libgcrypt.c.orig 2020-04-06 10:10:26.096842925 +0000
-+++ ./rpmio/digest_libgcrypt.c 2020-04-06 10:10:39.832806646 +0000
-@@ -20,6 +20,8 @@ struct DIGEST_CTX_s {
- /**************************** init ************************************/
-
- int rpmInitCrypto(void) {
-+ gcry_check_version (NULL);
-+ gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
- return 0;
- }
-
diff --git a/lazystatfs.diff b/lazystatfs.diff
deleted file mode 100644
index 7f17c90..0000000
--- a/lazystatfs.diff
+++ /dev/null
@@ -1,50 +0,0 @@
-Prefer sys/vfs.h, as statvfs stats all filesystems again
---- ./configure.ac.orig 2011-05-12 12:36:32.000000000 +0000
-+++ ./configure.ac 2011-05-12 12:36:42.000000000 +0000
-@@ -402,25 +402,25 @@ dnl
- found_struct_statfs=no
-
- if test X$found_struct_statfs = Xno ; then
--dnl Solaris 2.6+ wants to use statvfs
-+dnl first try including sys/vfs.h
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
- #ifdef HAVE_SYS_TYPES_H
- #include
- #endif
--#include ]], [[struct statvfs sfs;]])],[AC_MSG_RESULT(in sys/statvfs.h)
-- AC_DEFINE(STATFS_IN_SYS_STATVFS, 1,
-- [statfs in (for solaris 2.6+ systems)])
-+#include ]], [[struct statfs sfs;]])],[AC_MSG_RESULT(in sys/vfs.h)
-+ AC_DEFINE(STATFS_IN_SYS_VFS, 1, [statfs in (for linux systems)])
- found_struct_statfs=yes],[])
- fi
-
- if test X$found_struct_statfs = Xno ; then
--dnl first try including sys/vfs.h
-+dnl Solaris 2.6+ wants to use statvfs
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
- #ifdef HAVE_SYS_TYPES_H
- #include
- #endif
--#include ]], [[struct statfs sfs;]])],[AC_MSG_RESULT(in sys/vfs.h)
-- AC_DEFINE(STATFS_IN_SYS_VFS, 1, [statfs in (for linux systems)])
-+#include ]], [[struct statvfs sfs;]])],[AC_MSG_RESULT(in sys/statvfs.h)
-+ AC_DEFINE(STATFS_IN_SYS_STATVFS, 1,
-+ [statfs in (for solaris 2.6+ systems)])
- found_struct_statfs=yes],[])
- fi
-
---- ./lib/transaction.c.orig 2011-05-12 12:36:55.000000000 +0000
-+++ ./lib/transaction.c 2011-05-12 12:38:03.000000000 +0000
-@@ -114,7 +114,11 @@ static rpmDiskSpaceInfo rpmtsCreateDSI(c
- dsi->bneeded = 0;
- dsi->ineeded = 0;
- #ifdef STATFS_HAS_F_BAVAIL
-+# ifdef ST_RDONLY
- dsi->bavail = (sfb.f_flag & ST_RDONLY) ? 0 : sfb.f_bavail;
-+# else
-+ dsi->bavail = sfb.f_bavail;
-+# endif
- #else
- /* FIXME: the statfs struct doesn't have a member to tell how many blocks are
- * available for non-superusers. f_blocks - f_bfree is probably too big, but
diff --git a/macrosin.diff b/macrosin.diff
index 3e38ac6..9de921f 100644
--- a/macrosin.diff
+++ b/macrosin.diff
@@ -1,5 +1,5 @@
---- ./macros.in.orig 2019-10-02 11:13:35.966773848 +0000
-+++ ./macros.in 2019-10-02 11:17:37.210282271 +0000
+--- ./macros.in.orig 2020-09-30 12:42:09.146057387 +0000
++++ ./macros.in 2020-09-30 12:45:30.517611707 +0000
@@ -177,7 +177,7 @@
%{?_unique_build_ids:--build-id-seed "%{VERSION}-%{RELEASE}"} \\\
%{?_unique_debug_names:--unique-debug-suffix "-%{VERSION}-%{RELEASE}.%{_arch}"} \\\
@@ -19,7 +19,7 @@
%_defaultlicensedir %{_datadir}/licenses
# Following macros for filtering auto deps must not be used in spec files.
-@@ -276,7 +277,8 @@ package or when debugging this package.\
+@@ -280,7 +281,8 @@ package or when debugging this package.\
%_tmppath %{_var}/tmp
# Path to top of build area.
@@ -29,7 +29,7 @@
# The path to the unzip executable (legacy, use %{__unzip} instead).
%_unzipbin %{__unzip}
-@@ -388,7 +390,7 @@ package or when debugging this package.\
+@@ -392,7 +394,7 @@ package or when debugging this package.\
# "w.ufdio" uncompressed
#
#%_source_payload w9.gzdio
@@ -38,7 +38,7 @@
# Algorithm to use for generating file checksum digests on build.
# If not specified or 0, MD5 is used.
-@@ -495,6 +497,19 @@ package or when debugging this package.\
+@@ -499,6 +501,19 @@ package or when debugging this package.\
#
#%_include_minidebuginfo 1
@@ -58,7 +58,7 @@
#
# Include a .gdb_index section in the .debug files.
# Requires _enable_debug_packages and gdb-add-index installed.
-@@ -527,7 +542,7 @@ package or when debugging this package.\
+@@ -531,7 +546,7 @@ package or when debugging this package.\
# Same as for "separate" but if the __debug_package global is set then
# the -debuginfo package will have a compatibility link for the main
# ELF /usr/lib/debug/.build-id/xx/yyy -> /usr/lib/.build-id/xx/yyy
@@ -67,7 +67,7 @@
# Whether build-ids should be made unique between package version/releases
# when generating debuginfo packages. If set to 1 this will pass
-@@ -556,10 +571,10 @@ package or when debugging this package.\
+@@ -560,10 +575,10 @@ package or when debugging this package.\
%_unique_debug_srcs 1
# Whether rpm should put debug source files into its own subpackage
@@ -80,9 +80,9 @@
#
# Use internal dependency generator rather than external helpers?
-@@ -572,6 +587,10 @@ package or when debugging this package.\
+@@ -576,6 +591,10 @@ package or when debugging this package.\
# Directories whose contents should be considered as documentation.
- %__docdir_path %{_datadir}/doc:%{_datadir}/man:%{_datadir}/info:%{_datadir}/gtk-doc/html:%{?_docdir}:%{?_mandir}:%{?_infodir}:%{?_javadocdir}:/usr/doc:/usr/man:/usr/info:/usr/X11R6/man
+ %__docdir_path %{_datadir}/doc:%{_datadir}/man:%{_datadir}/info:%{_datadir}/gtk-doc/html:%{_datadir}/gnome/help:%{?_docdir}:%{?_mandir}:%{?_infodir}:%{?_javadocdir}:/usr/doc:/usr/man:/usr/info:/usr/X11R6/man
+# maxnum,cuttime,minnum
+# 2014/10/13 (SLES12 GA)
@@ -91,7 +91,7 @@
#
# Path to scripts to autogenerate package dependencies,
#
-@@ -582,6 +601,7 @@ package or when debugging this package.\
+@@ -586,6 +605,7 @@ package or when debugging this package.\
%__find_requires %{_rpmconfigdir}/find-requires
#%__find_conflicts ???
#%__find_obsoletes ???
@@ -99,7 +99,7 @@
#
# Path to file attribute classifications for automatic dependency
-@@ -660,10 +680,10 @@ package or when debugging this package.\
+@@ -665,10 +685,10 @@ package or when debugging this package.\
# Misc BDB tuning options
%__dbi_other mp_mmapsize=128Mb mp_size=1Mb
@@ -112,7 +112,7 @@
#==============================================================================
# ---- GPG/PGP/PGP5 signature macros.
-@@ -1000,7 +1020,7 @@ package or when debugging this package.\
+@@ -1011,7 +1031,7 @@ package or when debugging this package.\
%_build_vendor %{_host_vendor}
%_build_os %{_host_os}
%_host @host@
@@ -121,15 +121,18 @@
%_host_cpu @host_cpu@
%_host_vendor @host_vendor@
%_host_os @host_os@
-@@ -1119,7 +1139,10 @@ package or when debugging this package.\
+@@ -1130,11 +1150,13 @@ package or when debugging this package.\
#------------------------------------------------------------------------------
- # arch macro for all supported ARM processors
--%arm armv3l armv4b armv4l armv4tl armv5tl armv5tel armv5tejl armv6l armv6hl armv7l armv7hl armv7hnl armv8l armv8hl armv8hnl armv8hcnl
-+%arm armv3l armv4b armv4l armv4tl armv5b armv5l armv5teb armv5tel armv5tejl armv6l armv6hl armv7l armv7hl armv7hnl armv8l armv8hl armv8hnl armv8hcnl
-+%arml armv3l armv4l armv5l armv5tel armv6l armv6hl armv7l armv7hl armv7hnl armv8l armv8hl armv8hnl armv8hcnl
-+%armb armv4b armv5b armv5teb
-+%arm64 aarch64
+ # arch macro for all supported 32-bit ARM processors
+-%arm32 armv3l armv4b armv4l armv4tl armv5tl armv5tel armv5tejl armv6l armv6hl armv7l armv7hl armv7hnl armv8l armv8hl armv8hnl armv8hcnl
++%arm32 armv3l armv4b armv4l armv4tl armv5b armv5l armv5teb armv5tel armv5tejl armv6l armv6hl armv7l armv7hl armv7hnl armv8l armv8hl armv8hnl armv8hcnl
#------------------------------------------------------------------------------
- # arch macro for 32-bit MIPS processors
+ # arch macro for all supported 32-bit ARM processors (legacy, use %%arm32 instead)
+ %arm %{arm32}
++%arml armv3l armv4l armv5l armv5tel armv6l armv6hl armv7l armv7hl armv7hnl armv8l armv8hl armv8hnl armv8hcnl
++%armb armv4b armv5b armv5teb
+
+ #------------------------------------------------------------------------------
+ # arch macro for all supported 64-bit ARM processors
diff --git a/ndb_backport.diff b/ndb_backport.diff
deleted file mode 100644
index 24d6744..0000000
--- a/ndb_backport.diff
+++ /dev/null
@@ -1,733 +0,0 @@
---- ./lib/backend/ndb/glue.c.orig 2020-01-23 12:47:46.527816289 +0000
-+++ ./lib/backend/ndb/glue.c 2020-02-03 12:57:34.817304473 +0000
-@@ -52,8 +52,8 @@ static void closeEnv(rpmdb rdb)
- if (ndbenv->data)
- free(ndbenv->data);
- free(ndbenv);
-+ rdb->db_dbenv = 0;
- }
-- rdb->db_dbenv = 0;
- }
-
- static struct ndbEnv_s *openEnv(rpmdb rdb)
-@@ -80,6 +80,31 @@ static int ndb_Close(dbiIndex dbi, unsig
- return 0;
- }
-
-+static void ndb_CheckIndexSync(rpmpkgdb pkgdb, rpmxdb xdb)
-+{
-+ unsigned int generation, xdb_generation;
-+ if (!pkgdb || !xdb)
-+ return;
-+ if (rpmpkgLock(pkgdb, 0))
-+ return;
-+ if (rpmpkgGeneration(pkgdb, &generation)) {
-+ rpmpkgUnlock(pkgdb, 0);
-+ return;
-+ }
-+ if (!rpmxdbGetUserGeneration(xdb, &xdb_generation) && generation == xdb_generation) {
-+ rpmpkgUnlock(pkgdb, 0);
-+ return;
-+ }
-+ rpmpkgUnlock(pkgdb, 0);
-+ /* index corrupt or with different generation */
-+ if (rpmxdbIsRdonly(xdb)) {
-+ rpmlog(RPMLOG_WARNING, _("Detected outdated index databases\n"));
-+ } else {
-+ rpmlog(RPMLOG_WARNING, _("Rebuilding outdated index databases\n"));
-+ rpmxdbDelAllBlobs(xdb);
-+ }
-+}
-+
- static int ndb_Open(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
- {
- const char *dbhome = rpmdbHome(rdb);
-@@ -130,12 +155,13 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
- }
- if (!ndbenv->xdb) {
- char *path = rstrscat(NULL, dbhome, "/Index.db", NULL);
-+ int created = 0;
- rpmlog(RPMLOG_DEBUG, "opening db index %s mode=0x%x\n", path, rdb->db_mode);
-
- /* Open indexes readwrite if possible */
- ioflags = O_RDWR;
- rc = rpmxdbOpen(&ndbenv->xdb, rdb->db_pkgs->dbi_db, path, ioflags, 0666);
-- if (rc && errno == EACCES) {
-+ if (rc && (errno == EACCES || errno == EROFS)) {
- /* If it is not asked for rw explicitly, try to open ro */
- if (!(oflags & O_RDWR)) {
- ioflags = O_RDONLY;
-@@ -144,6 +170,7 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
- } else if (rc && errno == ENOENT) {
- ioflags = O_CREAT|O_RDWR;
- rc = rpmxdbOpen(&ndbenv->xdb, rdb->db_pkgs->dbi_db, path, ioflags, 0666);
-+ created = 1;
- }
- if (rc) {
- perror("rpmxdbOpen");
-@@ -153,6 +180,8 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
- }
- free(path);
- rpmxdbSetFsync(ndbenv->xdb, ndbenv->dofsync);
-+ if (!created)
-+ ndb_CheckIndexSync(ndbenv->pkgdb, ndbenv->xdb);
- }
- if (rpmxdbLookupBlob(ndbenv->xdb, &id, rpmtag, 0, 0) == RPMRC_NOTFOUND) {
- dbi->dbi_flags |= DBI_CREATED;
-@@ -179,7 +208,13 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
-
- static int ndb_Verify(dbiIndex dbi, unsigned int flags)
- {
-- return 0;
-+ int rc;
-+ if (dbi->dbi_type == DBI_PRIMARY) {
-+ rc = rpmpkgVerify(dbi->dbi_db);
-+ } else {
-+ rc = 0; /* cannot verify the index databases */
-+ }
-+ return rc;
- }
-
- static void ndb_SetFSync(rpmdb rdb, int enable)
-@@ -396,15 +431,15 @@ static rpmRC ndb_idxdbIter(dbiIndex dbi,
- }
- k = dbc->listdata + dbc->list[dbc->ilist];
- kl = dbc->list[dbc->ilist + 1];
--#if 0
-- if (searchType == DBC_KEY_SEARCH) {
-+
-+ if (set == NULL) {
- dbc->ilist += 2;
- dbc->key = k;
- dbc->keylen = kl;
- rc = RPMRC_OK;
- break;
- }
--#endif
-+
- pkglist = 0;
- pkglistn = 0;
- rc = rpmidxGet(dbc->dbi->dbi_db, k, kl, &pkglist, &pkglistn);
---- ./lib/backend/ndb/rpmpkg.c.orig 2019-11-13 09:19:29.306710577 +0000
-+++ ./lib/backend/ndb/rpmpkg.c 2020-01-23 12:48:59.739630414 +0000
-@@ -7,7 +7,6 @@
- #include
- #include
- #include
--#include
- #include
- #include
- #include
-@@ -19,10 +18,6 @@
- #define RPMRC_NOTFOUND 1
- #define RPMRC_OK 0
-
--#ifdef RPMPKG_LZO
--static int rpmpkgLZOCompress(unsigned char **blobp, unsigned int *bloblp);
--static int rpmpkgLZODecompress(unsigned char **blobp, unsigned int *bloblp);
--#endif
-
- static int rpmpkgVerifyblob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt);
-
-@@ -49,23 +44,19 @@ typedef struct rpmpkgdb_s {
- unsigned int nextpkgidx;
-
- struct pkgslot_s *slots;
-- unsigned int aslots; /* allocated slots */
- unsigned int nslots; /* used slots */
-
- unsigned int *slothash;
- unsigned int nslothash;
-
- unsigned int freeslot; /* first free slot */
-- int slotorder;
-+ int ordered; /* slots are ordered by the blk offsets */
-
- char *filename;
- unsigned int fileblks; /* file size in blks */
- int dofsync;
- } * rpmpkgdb;
-
--#define SLOTORDER_UNORDERED 0
--#define SLOTORDER_BLKOFF 1
--
-
- static inline unsigned int le2h(unsigned char *p)
- {
-@@ -144,10 +135,6 @@ static int rpmpkgReadHeader(rpmpkgdb pkg
- if (pkgdb->slots && (pkgdb->generation != generation || pkgdb->slotnpages != slotnpages)) {
- free(pkgdb->slots);
- pkgdb->slots = 0;
-- if (pkgdb->slothash) {
-- free(pkgdb->slothash);
-- pkgdb->slothash = 0;
-- }
- }
- pkgdb->generation = generation;
- pkgdb->slotnpages = slotnpages;
-@@ -200,6 +187,7 @@ static inline unsigned int hashpkgidx(un
- return h;
- }
-
-+/* (re-)create a hash mapping pkgidx numbers to slots */
- static int rpmpkgHashSlots(rpmpkgdb pkgdb)
- {
- unsigned int nslots, num;
-@@ -208,14 +196,14 @@ static int rpmpkgHashSlots(rpmpkgdb pkgd
- int i;
- pkgslot *slot;
-
-- pkgdb->nslothash = 0;
-- num = pkgdb->nslots;
-+ num = pkgdb->nslots + 32;
- while (num & (num - 1))
- num = num & (num - 1);
- num *= 4;
- hash = pkgdb->slothash;
- if (!hash || pkgdb->nslothash != num) {
-- free(pkgdb->slothash);
-+ if (hash)
-+ free(hash);
- hash = pkgdb->slothash = xcalloc(num, sizeof(unsigned int));
- pkgdb->nslothash = num;
- } else {
-@@ -228,8 +216,6 @@ static int rpmpkgHashSlots(rpmpkgdb pkgd
- ;
- hash[h] = i + 1;
- }
-- pkgdb->slothash = hash;
-- pkgdb->nslothash = num;
- return RPMRC_OK;
- }
-
-@@ -247,10 +233,6 @@ static int rpmpkgReadSlots(rpmpkgdb pkgd
- free(pkgdb->slots);
- pkgdb->slots = 0;
- }
-- if (pkgdb->slothash) {
-- free(pkgdb->slothash);
-- pkgdb->slothash = 0;
-- }
- pkgdb->nslots = 0;
- pkgdb->freeslot = 0;
-
-@@ -262,8 +244,7 @@ static int rpmpkgReadSlots(rpmpkgdb pkgd
- fileblks = stb.st_size / BLK_SIZE;
-
- /* read (and somewhat verify) all slots */
-- pkgdb->aslots = slotnpages * (PAGE_SIZE / SLOT_SIZE);
-- pkgdb->slots = xcalloc(pkgdb->aslots, sizeof(*pkgdb->slots));
-+ pkgdb->slots = xcalloc(slotnpages * (PAGE_SIZE / SLOT_SIZE), sizeof(*pkgdb->slots));
- i = 0;
- slot = pkgdb->slots;
- minblkoff = slotnpages * (PAGE_SIZE / BLK_SIZE);
-@@ -299,7 +280,7 @@ static int rpmpkgReadSlots(rpmpkgdb pkgd
- }
- }
- pkgdb->nslots = i;
-- pkgdb->slotorder = SLOTORDER_UNORDERED; /* XXX: always order? */
-+ pkgdb->ordered = 0;
- pkgdb->fileblks = fileblks;
- pkgdb->freeslot = freeslot;
- if (rpmpkgHashSlots(pkgdb)) {
-@@ -317,15 +298,13 @@ static int orderslots_blkoff_cmp(const v
- return blkoffa > blkoffb ? 1 : blkoffa < blkoffb ? -1 : 0;
- }
-
--static void rpmpkgOrderSlots(rpmpkgdb pkgdb, int slotorder)
-+static void rpmpkgOrderSlots(rpmpkgdb pkgdb)
- {
-- if (pkgdb->slotorder == slotorder)
-+ if (pkgdb->ordered)
- return;
-- if (slotorder == SLOTORDER_BLKOFF) {
-- if (pkgdb->nslots > 1)
-- qsort(pkgdb->slots, pkgdb->nslots, sizeof(*pkgdb->slots), orderslots_blkoff_cmp);
-- }
-- pkgdb->slotorder = slotorder;
-+ if (pkgdb->nslots > 1)
-+ qsort(pkgdb->slots, pkgdb->nslots, sizeof(*pkgdb->slots), orderslots_blkoff_cmp);
-+ pkgdb->ordered = 1;
- rpmpkgHashSlots(pkgdb);
- }
-
-@@ -340,6 +319,8 @@ static inline pkgslot *rpmpkgFindSlot(rp
- return 0;
- }
-
-+/* Find an empty space for blkcnt blocks. If dontprepend is true, ignore
-+ the space between the slot area and the first blob */
- static int rpmpkgFindEmptyOffset(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkcnt, unsigned *blkoffp, pkgslot **oldslotp, int dontprepend)
- {
- unsigned int i, nslots = pkgdb->nslots;
-@@ -348,8 +329,8 @@ static int rpmpkgFindEmptyOffset(rpmpkgd
- unsigned int lastblkend = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
- pkgslot *slot, *oldslot = 0;
-
-- if (pkgdb->slotorder != SLOTORDER_BLKOFF)
-- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
-+ if (!pkgdb->ordered)
-+ rpmpkgOrderSlots(pkgdb);
-
- if (dontprepend && nslots) {
- lastblkend = pkgdb->slots[0].blkoff;
-@@ -382,14 +363,15 @@ static int rpmpkgFindEmptyOffset(rpmpkgd
- return RPMRC_OK;
- }
-
-+/* verify the blobs to the left and right of a free area */
- static int rpmpkgNeighbourCheck(rpmpkgdb pkgdb, unsigned int blkoff, unsigned int blkcnt, unsigned int *newblkcnt)
- {
- unsigned int i, nslots = pkgdb->nslots;
- unsigned int lastblkend = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
- pkgslot *slot, *left = 0, *right = 0;
-
-- if (pkgdb->slotorder != SLOTORDER_BLKOFF)
-- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
-+ if (!pkgdb->ordered)
-+ rpmpkgOrderSlots(pkgdb);
- if (blkoff < lastblkend)
- return RPMRC_FAIL;
- for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
-@@ -413,7 +395,7 @@ static int rpmpkgNeighbourCheck(rpmpkgdb
- if (right && rpmpkgVerifyblob(pkgdb, right->pkgidx, right->blkoff, right->blkcnt) != RPMRC_OK)
- return RPMRC_FAIL;
- *newblkcnt = right ? right->blkoff - blkoff : blkcnt;
-- /* bounds are intect. free area. */
-+ /* bounds are intact. ok to zero area. */
- return RPMRC_OK;
- }
-
-@@ -433,6 +415,7 @@ static int rpmpkgWriteslot(rpmpkgdb pkgd
- return RPMRC_FAIL;
- }
- pkgdb->generation++;
-+ /* rpmpkgFsync() is done by rpmpkgWriteHeader() */
- if (rpmpkgWriteHeader(pkgdb)) {
- return RPMRC_FAIL;
- }
-@@ -527,7 +510,7 @@ static int rpmpkgValidateZero(rpmpkgdb p
-
- /*** Blob primitives ***/
-
--/* head: magic + pkgidx + timestamp + bloblen */
-+/* head: magic + pkgidx + generation + bloblen */
- /* tail: adler32 + bloblen + magic */
-
- #define BLOBHEAD_MAGIC ('B' | 'l' << 8 | 'b' << 16 | 'S' << 24)
-@@ -536,10 +519,10 @@ static int rpmpkgValidateZero(rpmpkgdb p
- #define BLOBHEAD_SIZE (4 + 4 + 4 + 4)
- #define BLOBTAIL_SIZE (4 + 4 + 4)
-
--static int rpmpkgReadBlob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt, unsigned char *blob, unsigned int *bloblp, unsigned int *tstampp)
-+static int rpmpkgReadBlob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt, unsigned char *blob, unsigned int *bloblp, unsigned int *generationp)
- {
- unsigned char buf[BLOBHEAD_SIZE > BLOBTAIL_SIZE ? BLOBHEAD_SIZE : BLOBTAIL_SIZE];
-- unsigned int bloblen, toread, tstamp;
-+ unsigned int bloblen, toread, generation;
- off_t fileoff;
- unsigned int adl;
- int verifyadler = bloblp ? 0 : 1;
-@@ -555,7 +538,7 @@ static int rpmpkgReadBlob(rpmpkgdb pkgdb
- return RPMRC_FAIL; /* bad blob */
- if (le2h(buf + 4) != pkgidx)
- return RPMRC_FAIL; /* bad blob */
-- tstamp = le2h(buf + 8);
-+ generation = le2h(buf + 8);
- bloblen = le2h(buf + 12);
- if (blkcnt != (BLOBHEAD_SIZE + bloblen + BLOBTAIL_SIZE + BLK_SIZE - 1) / BLK_SIZE)
- return RPMRC_FAIL; /* bad blob */
-@@ -600,8 +583,8 @@ static int rpmpkgReadBlob(rpmpkgdb pkgdb
- }
- if (bloblp)
- *bloblp = bloblen;
-- if (tstampp)
-- *tstampp = tstamp;
-+ if (generationp)
-+ *generationp = generation;
- return RPMRC_OK;
- }
-
-@@ -684,14 +667,14 @@ static int rpmpkgMoveBlob(rpmpkgdb pkgdb
- unsigned int blkoff = slot->blkoff;
- unsigned int blkcnt = slot->blkcnt;
- unsigned char *blob;
-- unsigned int tstamp, blobl;
-+ unsigned int generation, blobl;
-
- blob = xmalloc((size_t)blkcnt * BLK_SIZE);
-- if (rpmpkgReadBlob(pkgdb, pkgidx, blkoff, blkcnt, blob, &blobl, &tstamp)) {
-+ if (rpmpkgReadBlob(pkgdb, pkgidx, blkoff, blkcnt, blob, &blobl, &generation)) {
- free(blob);
- return RPMRC_FAIL;
- }
-- if (rpmpkgWriteBlob(pkgdb, pkgidx, newblkoff, blkcnt, blob, blobl, tstamp)) {
-+ if (rpmpkgWriteBlob(pkgdb, pkgidx, newblkoff, blkcnt, blob, blobl, generation)) {
- free(blob);
- return RPMRC_FAIL;
- }
-@@ -703,15 +686,15 @@ static int rpmpkgMoveBlob(rpmpkgdb pkgdb
- return RPMRC_FAIL;
- }
- slot->blkoff = newblkoff;
-- pkgdb->slotorder = SLOTORDER_UNORDERED;
-+ pkgdb->ordered = 0;
- return RPMRC_OK;
- }
-
- static int rpmpkgAddSlotPage(rpmpkgdb pkgdb)
- {
- unsigned int cutoff;
-- if (pkgdb->slotorder != SLOTORDER_BLKOFF)
-- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
-+ if (!pkgdb->ordered)
-+ rpmpkgOrderSlots(pkgdb);
- cutoff = (pkgdb->slotnpages + 1) * (PAGE_SIZE / BLK_SIZE);
-
- /* now move every blob before cutoff */
-@@ -729,7 +712,7 @@ static int rpmpkgAddSlotPage(rpmpkgdb pk
- if (rpmpkgMoveBlob(pkgdb, slot, newblkoff)) {
- return RPMRC_FAIL;
- }
-- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
-+ rpmpkgOrderSlots(pkgdb);
- }
-
- /* make sure our new page is empty */
-@@ -958,6 +941,7 @@ static int rpmpkgPutInternal(rpmpkgdb pk
- pkgslot *oldslot;
-
- /* we always read all slots when writing, just in case */
-+ /* this also will set pkgdb->freeslot */
- if (rpmpkgReadSlots(pkgdb)) {
- return RPMRC_FAIL;
- }
-@@ -981,14 +965,15 @@ static int rpmpkgPutInternal(rpmpkgdb pk
- return RPMRC_FAIL;
- }
- /* write new blob */
-- if (rpmpkgWriteBlob(pkgdb, pkgidx, blkoff, blkcnt, blob, blobl, (unsigned int)time(0))) {
-+ if (rpmpkgWriteBlob(pkgdb, pkgidx, blkoff, blkcnt, blob, blobl, pkgdb->generation)) {
- return RPMRC_FAIL;
- }
-+ /* update nextpkgidx if needed */
-+ if (pkgidx >= pkgdb->nextpkgidx) {
-+ pkgdb->nextpkgidx = pkgidx + 1;
-+ }
- /* write slot */
- slotno = oldslot ? oldslot->slotno : pkgdb->freeslot;
-- if (!slotno) {
-- return RPMRC_FAIL;
-- }
- if (rpmpkgWriteslot(pkgdb, slotno, pkgidx, blkoff, blkcnt)) {
- free(pkgdb->slots);
- pkgdb->slots = 0;
-@@ -1006,7 +991,7 @@ static int rpmpkgPutInternal(rpmpkgdb pk
- /* just update the slot, no need to free the slot data */
- oldslot->blkoff = blkoff;
- oldslot->blkcnt = blkcnt;
-- pkgdb->slotorder = SLOTORDER_UNORDERED;
-+ pkgdb->ordered = 0;
- } else {
- free(pkgdb->slots);
- pkgdb->slots = 0;
-@@ -1023,7 +1008,7 @@ static int rpmpkgDelInternal(rpmpkgdb pk
- if (rpmpkgReadSlots(pkgdb)) {
- return RPMRC_FAIL;
- }
-- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
-+ rpmpkgOrderSlots(pkgdb);
- slot = rpmpkgFindSlot(pkgdb, pkgidx);
- if (!slot) {
- return RPMRC_OK;
-@@ -1049,9 +1034,10 @@ static int rpmpkgDelInternal(rpmpkgdb pk
- }
- slot->blkoff = 0;
- slot->blkcnt = 0;
-+ /* try to move the last two slots, the bigger one first */
- slot = pkgdb->slots + pkgdb->nslots - 2;
- if (slot->blkcnt < slot[1].blkcnt)
-- slot++; /* bigger slot first */
-+ slot++; /* bigger slot first */
- for (i = 0; i < 2; i++, slot++) {
- if (slot == pkgdb->slots + pkgdb->nslots)
- slot -= 2;
-@@ -1065,7 +1051,7 @@ static int rpmpkgDelInternal(rpmpkgdb pk
- blkoff += slot->blkcnt;
- blkcnt -= slot->blkcnt;
- }
-- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
-+ rpmpkgOrderSlots(pkgdb);
- } else {
- slot->blkoff = 0;
- slot->blkcnt = 0;
-@@ -1104,7 +1090,7 @@ static int rpmpkgListInternal(rpmpkgdb p
- *npkgidxlistp = pkgdb->nslots;
- return RPMRC_OK;
- }
-- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
-+ rpmpkgOrderSlots(pkgdb);
- nslots = pkgdb->nslots;
- pkgidxlist = xcalloc(nslots + 1, sizeof(unsigned int));
- for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
-@@ -1115,6 +1101,22 @@ static int rpmpkgListInternal(rpmpkgdb p
- return RPMRC_OK;
- }
-
-+static int rpmpkgVerifyInternal(rpmpkgdb pkgdb)
-+{
-+ unsigned int i, nslots;
-+ pkgslot *slot;
-+
-+ if (rpmpkgReadSlots(pkgdb))
-+ return RPMRC_FAIL;
-+ rpmpkgOrderSlots(pkgdb);
-+ nslots = pkgdb->nslots;
-+ for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
-+ if (rpmpkgVerifyblob(pkgdb, slot->pkgidx, slot->blkoff, slot->blkcnt))
-+ return RPMRC_FAIL;
-+ }
-+ return RPMRC_OK;
-+}
-+
- int rpmpkgGet(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char **blobp, unsigned int *bloblp)
- {
- int rc;
-@@ -1127,10 +1129,6 @@ int rpmpkgGet(rpmpkgdb pkgdb, unsigned i
- return RPMRC_FAIL;
- rc = rpmpkgGetInternal(pkgdb, pkgidx, blobp, bloblp);
- rpmpkgUnlock(pkgdb, 0);
--#ifdef RPMPKG_LZO
-- if (!rc)
-- rc = rpmpkgLZODecompress(blobp, bloblp);
--#endif
- return rc;
- }
-
-@@ -1143,16 +1141,7 @@ int rpmpkgPut(rpmpkgdb pkgdb, unsigned i
- }
- if (rpmpkgLockReadHeader(pkgdb, 1))
- return RPMRC_FAIL;
--#ifdef RPMPKG_LZO
-- if (rpmpkgLZOCompress(&blob, &blobl)) {
-- rpmpkgUnlock(pkgdb, 1);
-- return RPMRC_FAIL;
-- }
--#endif
- rc = rpmpkgPutInternal(pkgdb, pkgidx, blob, blobl);
--#ifdef RPMPKG_LZO
-- free(blob);
--#endif
- rpmpkgUnlock(pkgdb, 1);
- return rc;
- }
-@@ -1184,6 +1173,16 @@ int rpmpkgList(rpmpkgdb pkgdb, unsigned
- return rc;
- }
-
-+int rpmpkgVerify(rpmpkgdb pkgdb)
-+{
-+ int rc;
-+ if (rpmpkgLockReadHeader(pkgdb, 0))
-+ return RPMRC_FAIL;
-+ rc = rpmpkgVerifyInternal(pkgdb);
-+ rpmpkgUnlock(pkgdb, 0);
-+ return rc;
-+}
-+
- int rpmpkgNextPkgIdx(rpmpkgdb pkgdb, unsigned int *pkgidxp)
- {
- if (rpmpkgLockReadHeader(pkgdb, 1))
-@@ -1233,64 +1232,3 @@ int rpmpkgStats(rpmpkgdb pkgdb)
- return RPMRC_OK;
- }
-
--#ifdef RPMPKG_LZO
--
--#include "lzo/lzoconf.h"
--#include "lzo/lzo1x.h"
--
--#define BLOBLZO_MAGIC ('L' | 'Z' << 8 | 'O' << 16 | 'B' << 24)
--
--static int rpmpkgLZOCompress(unsigned char **blobp, unsigned int *bloblp)
--{
-- unsigned char *blob = *blobp;
-- unsigned int blobl = *bloblp;
-- unsigned char *lzoblob, *workmem;
-- unsigned int lzoblobl;
-- lzo_uint blobl2;
--
-- if (lzo_init() != LZO_E_OK) {
-- return RPMRC_FAIL;
-- }
-- workmem = xmalloc(LZO1X_1_MEM_COMPRESS);
-- lzoblobl = 4 + 4 + blobl + blobl / 16 + 64 + 3;
-- lzoblob = xmalloc(lzoblobl);
-- h2le(BLOBLZO_MAGIC, lzoblob);
-- h2le(blobl, lzoblob + 4);
-- if (lzo1x_1_compress(blob, blobl, lzoblob + 8, &blobl2, workmem) != LZO_E_OK) {
-- free(workmem);
-- free(lzoblob);
-- return RPMRC_FAIL;
-- }
-- free(workmem);
-- *blobp = lzoblob;
-- *bloblp = 8 + blobl2;
-- return RPMRC_OK;
--}
--
--static int rpmpkgLZODecompress(unsigned char **blobp, unsigned int *bloblp)
--{
-- unsigned char *lzoblob = *blobp;
-- unsigned int lzoblobl = *bloblp;
-- unsigned char *blob;
-- unsigned int blobl;
-- lzo_uint blobl2;
--
-- if (!lzoblob || lzoblobl < 8)
-- return RPMRC_FAIL;
-- if (le2h(lzoblob) != BLOBLZO_MAGIC)
-- return RPMRC_FAIL;
-- if (lzo_init() != LZO_E_OK)
-- return RPMRC_FAIL;
-- blobl = le2h(lzoblob + 4);
-- blob = xmalloc(blobl ? blobl : 1);
-- if (lzo1x_decompress(lzoblob + 8, lzoblobl - 8, blob, &blobl2, 0) != LZO_E_OK || blobl2 != blobl) {
-- free(blob);
-- return RPMRC_FAIL;
-- }
-- free(lzoblob);
-- *blobp = blob;
-- *bloblp = blobl;
-- return RPMRC_OK;
--}
--
--#endif
---- ./lib/backend/ndb/rpmpkg.h.orig 2019-06-26 14:17:31.406985703 +0000
-+++ ./lib/backend/ndb/rpmpkg.h 2020-01-23 12:48:20.919728972 +0000
-@@ -12,6 +12,7 @@ int rpmpkgGet(rpmpkgdb pkgdb, unsigned i
- int rpmpkgPut(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char *blob, unsigned int blobl);
- int rpmpkgDel(rpmpkgdb pkgdb, unsigned int pkgidx);
- int rpmpkgList(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsigned int *npkgidxlistp);
-+int rpmpkgVerify(rpmpkgdb pkgdb);
-
- int rpmpkgNextPkgIdx(rpmpkgdb pkgdb, unsigned int *pkgidxp);
- int rpmpkgGeneration(rpmpkgdb pkgdb, unsigned int *generationp);
---- ./lib/backend/ndb/rpmxdb.c.orig 2019-11-13 09:19:29.307710583 +0000
-+++ ./lib/backend/ndb/rpmxdb.c 2020-01-23 12:48:20.919728972 +0000
-@@ -224,11 +224,33 @@ static int usedslots_cmp(const void *a,
- return sa->startpage > sb->startpage ? 1 : -1;
- }
-
-+static int rpmxdbReadHeaderRaw(rpmxdb xdb, unsigned int *generationp, unsigned int *slotnpagesp, unsigned int *pagesizep, unsigned int *usergenerationp)
-+{
-+ unsigned int header[XDB_HEADER_SIZE / sizeof(unsigned int)];
-+ unsigned int version;
-+ if (pread(xdb->fd, header, sizeof(header), 0) != sizeof(header))
-+ return RPMRC_FAIL;
-+ if (le2ha((unsigned char *)header + XDB_OFFSET_MAGIC) != XDB_MAGIC)
-+ return RPMRC_FAIL;
-+ version = le2ha((unsigned char *)header + XDB_OFFSET_VERSION);
-+ if (version != XDB_VERSION) {
-+ rpmlog(RPMLOG_ERR, _("rpmxdb: Version mismatch. Expected version: %u. "
-+ "Found version: %u\n"), XDB_VERSION, version);
-+ return RPMRC_FAIL;
-+ }
-+ *generationp = le2ha((unsigned char *)header + XDB_OFFSET_GENERATION);
-+ *slotnpagesp = le2ha((unsigned char *)header + XDB_OFFSET_SLOTNPAGES);
-+ *pagesizep = le2ha((unsigned char *)header + XDB_OFFSET_PAGESIZE);
-+ *usergenerationp = le2ha((unsigned char *)header + XDB_OFFSET_USERGENERATION);
-+ if (!*slotnpagesp || !*pagesizep)
-+ return RPMRC_FAIL;
-+ return RPMRC_OK;
-+}
-+
- static int rpmxdbReadHeader(rpmxdb xdb)
- {
- struct xdb_slot *slot;
-- unsigned int header[XDB_HEADER_SIZE / sizeof(unsigned int)];
-- unsigned int slotnpages, pagesize, generation, usergeneration, version;
-+ unsigned int slotnpages, pagesize, generation, usergeneration;
- unsigned int page, *lastfreep;
- unsigned char *pageptr;
- struct xdb_slot *slots, **usedslots, *lastslot;
-@@ -246,23 +268,9 @@ static int rpmxdbReadHeader(rpmxdb xdb)
- if (fstat(xdb->fd, &stb)) {
- return RPMRC_FAIL;
- }
-- if (pread(xdb->fd, header, sizeof(header), 0) != sizeof(header)) {
-- return RPMRC_FAIL;
-- }
-- if (le2ha((unsigned char *)header + XDB_OFFSET_MAGIC) != XDB_MAGIC)
-- return RPMRC_FAIL;
-- version = le2ha((unsigned char *)header + XDB_OFFSET_VERSION);
-- if (version != XDB_VERSION) {
-- rpmlog(RPMLOG_ERR, _("rpmxdb: Version mismatch. Expected version: %u. "
-- "Found version: %u\n"), XDB_VERSION, version);
-+ if (rpmxdbReadHeaderRaw(xdb, &generation, &slotnpages, &pagesize, &usergeneration))
- return RPMRC_FAIL;
-- }
--
-- generation = le2ha((unsigned char *)header + XDB_OFFSET_GENERATION);
-- slotnpages = le2ha((unsigned char *)header + XDB_OFFSET_SLOTNPAGES);
-- pagesize = le2ha((unsigned char *)header + XDB_OFFSET_PAGESIZE);
-- usergeneration = le2ha((unsigned char *)header + XDB_OFFSET_USERGENERATION);
-- if (!slotnpages || !pagesize || stb.st_size % pagesize != 0)
-+ if (stb.st_size % pagesize != 0)
- return RPMRC_FAIL;
- xdb->pagesize = pagesize;
- xdb->mapflags = xdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE;
-@@ -922,6 +930,43 @@ int rpmxdbDelBlob(rpmxdb xdb, unsigned i
- rpmxdbUnlock(xdb, 1);
- return RPMRC_OK;
- }
-+
-+int rpmxdbDelAllBlobs(rpmxdb xdb)
-+{
-+ unsigned int slotnpages, pagesize, generation, usergeneration;
-+ if (rpmxdbLockOnly(xdb, 1))
-+ return RPMRC_FAIL;
-+ /* unmap all blobs */
-+ if (xdb->slots) {
-+ int i;
-+ struct xdb_slot *slot;
-+ for (i = 1, slot = xdb->slots + i; i < xdb->nslots; i++, slot++) {
-+ if (slot->startpage && slot->mapped) {
-+ unmapslot(xdb, slot);
-+ slot->mapcallback(xdb, slot->mapcallbackdata, 0, 0);
-+ }
-+ }
-+ free(xdb->slots);
-+ xdb->slots = 0;
-+ }
-+ if (xdb->mapped)
-+ unmapheader(xdb);
-+ if (rpmxdbReadHeaderRaw(xdb, &generation, &slotnpages, &pagesize, &usergeneration)) {
-+ rpmxdbUnlock(xdb, 1);
-+ return RPMRC_FAIL;
-+ }
-+ xdb->generation = generation + 1;
-+ xdb->slotnpages = 1;
-+ xdb->pagesize = pagesize;
-+ xdb->usergeneration = usergeneration;
-+ if (rpmxdbWriteEmptySlotpage(xdb, 0)) {
-+ rpmxdbUnlock(xdb, 1);
-+ return RPMRC_FAIL;
-+ }
-+ ftruncate(xdb->fd, xdb->pagesize);
-+ rpmxdbUnlock(xdb, 1);
-+ return RPMRC_OK;
-+}
-
- int rpmxdbResizeBlob(rpmxdb xdb, unsigned int id, size_t newsize)
- {
---- ./lib/backend/ndb/rpmxdb.h.orig 2019-11-13 09:19:29.307710583 +0000
-+++ ./lib/backend/ndb/rpmxdb.h 2020-01-23 12:48:20.919728972 +0000
-@@ -14,6 +14,7 @@ int rpmxdbUnlock(rpmxdb xdb, int excl);
-
- int rpmxdbLookupBlob(rpmxdb xdb, unsigned int *idp, unsigned int blobtag, unsigned int subtag, int flags);
- int rpmxdbDelBlob(rpmxdb xdb, unsigned int id) ;
-+int rpmxdbDelAllBlobs(rpmxdb xdb);
-
- int rpmxdbMapBlob(rpmxdb xdb, unsigned int id, int flags, void (*mapcallback)(rpmxdb xdb, void *data, void *newaddr, size_t newsize), void *mapcallbackdata);
- int rpmxdbUnmapBlob(rpmxdb xdb, unsigned int id);
diff --git a/ndb_backport2.diff b/ndb_backport2.diff
deleted file mode 100644
index 8f15b8b..0000000
--- a/ndb_backport2.diff
+++ /dev/null
@@ -1,305 +0,0 @@
---- ./lib/backend/ndb/glue.c.orig 2020-04-03 10:24:27.954135180 +0000
-+++ ./lib/backend/ndb/glue.c 2020-04-14 09:48:23.304231127 +0000
-@@ -143,9 +143,6 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
- free(path);
- dbi->dbi_db = ndbenv->pkgdb = pkgdb;
- rpmpkgSetFsync(pkgdb, ndbenv->dofsync);
--
-- if ((oflags & (O_RDWR | O_RDONLY)) == O_RDONLY)
-- dbi->dbi_flags |= DBI_RDONLY;
- } else {
- unsigned int id;
- rpmidxdb idxdb = 0;
-@@ -184,20 +181,20 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
- ndb_CheckIndexSync(ndbenv->pkgdb, ndbenv->xdb);
- }
- if (rpmxdbLookupBlob(ndbenv->xdb, &id, rpmtag, 0, 0) == RPMRC_NOTFOUND) {
-+ oflags = O_RDWR|O_CREAT;
- dbi->dbi_flags |= DBI_CREATED;
- }
- rpmlog(RPMLOG_DEBUG, "opening db index %s tag=%d\n", dbiName(dbi), rpmtag);
-- if (rpmidxOpenXdb(&idxdb, rdb->db_pkgs->dbi_db, ndbenv->xdb, rpmtag)) {
-+ if (rpmidxOpenXdb(&idxdb, rdb->db_pkgs->dbi_db, ndbenv->xdb, rpmtag, oflags)) {
- perror("rpmidxOpenXdb");
- ndb_Close(dbi, 0);
- return 1;
- }
- dbi->dbi_db = idxdb;
--
-- if (rpmxdbIsRdonly(ndbenv->xdb))
-- dbi->dbi_flags |= DBI_RDONLY;
- }
-
-+ if ((oflags & (O_RDWR | O_RDONLY)) == O_RDONLY)
-+ dbi->dbi_flags |= DBI_RDONLY;
-
- if (dbip != NULL)
- *dbip = dbi;
---- ./lib/backend/ndb/rpmidx.c.orig 2019-11-13 09:19:29.305710571 +0000
-+++ ./lib/backend/ndb/rpmidx.c 2020-04-14 09:48:23.304231127 +0000
-@@ -885,13 +885,17 @@ int rpmidxOpen(rpmidxdb *idxdbp, rpmpkgd
- return RPMRC_FAIL;
- }
-
--int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag)
-+int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag, int flags)
- {
- rpmidxdb idxdb;
- unsigned int id;
- *idxdbp = 0;
- int rc;
-
-+ if (rpmxdbIsRdonly(xdb) && (flags & (O_RDONLY|O_RDWR)) != O_RDONLY) {
-+ errno = EACCES;
-+ return RPMRC_FAIL;
-+ }
- if (rpmxdbLock(xdb, 0))
- return RPMRC_FAIL;
- rc = rpmxdbLookupBlob(xdb, &id, xdbtag, IDXDB_XDB_SUBTAG, 0);
-@@ -907,7 +911,7 @@ int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmp
- idxdb->xdbid = id;
- idxdb->pkgdb = pkgdb;
- idxdb->pagesize = rpmxdbPagesize(xdb);
-- idxdb->rdonly = rpmxdbIsRdonly(xdb) ? 1 : 0;
-+ idxdb->rdonly = (flags & (O_RDONLY|O_RDWR)) == O_RDONLY ? 1 : 0;
- if (!id) {
- if (rpmidxInit(idxdb)) {
- free(idxdb);
---- ./lib/backend/ndb/rpmidx.h.orig 2019-06-26 14:17:31.406985703 +0000
-+++ ./lib/backend/ndb/rpmidx.h 2020-04-14 09:48:23.304231127 +0000
-@@ -5,7 +5,7 @@ struct rpmidxdb_s;
- typedef struct rpmidxdb_s *rpmidxdb;
-
- int rpmidxOpen(rpmidxdb *idxdbp, rpmpkgdb pkgdb, const char *filename, int flags, int mode);
--int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag);
-+int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag, int flags);
- int rpmidxDelXdb(rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag);
- void rpmidxClose(rpmidxdb idxdbp);
-
---- ./lib/backend/ndb/rpmxdb.c.orig 2020-04-03 10:24:27.954135180 +0000
-+++ ./lib/backend/ndb/rpmxdb.c 2020-04-14 09:48:23.304231127 +0000
-@@ -36,7 +36,7 @@ typedef struct rpmxdb_s {
- unsigned int usergeneration;
-
- unsigned char *mapped;
-- int mapflags;
-+ int mappedrw;
- unsigned int mappedlen;
-
- struct xdb_slot {
-@@ -57,6 +57,7 @@ typedef struct rpmxdb_s {
- unsigned int usedblobpages;
- unsigned int systempagesize;
- int dofsync;
-+ unsigned int locked_excl;
- } *rpmxdb;
-
-
-@@ -125,17 +126,19 @@ static void unmapmem(void *addr, size_t
- #define ROUNDTOSYSTEMPAGE(xdb, size) (((size) + (xdb->systempagesize - 1)) & ~(xdb->systempagesize - 1))
-
- /* xdb header mapping functions */
--static int mapheader(rpmxdb xdb, unsigned int slotnpages)
-+static int mapheader(rpmxdb xdb, unsigned int slotnpages, int rw)
- {
- unsigned char *mapped;
- size_t mappedlen = slotnpages * xdb->pagesize;
-+ int mapflags = rw ? PROT_READ | PROT_WRITE : PROT_READ;
-
- mappedlen = ROUNDTOSYSTEMPAGE(xdb, mappedlen);
-- mapped = mapmem(xdb->mapped, xdb->mappedlen, mappedlen, xdb->mapflags, xdb->fd, 0);
-+ mapped = mapmem(xdb->mapped, xdb->mappedlen, mappedlen, mapflags, xdb->fd, 0);
- if ((void *)mapped == MAP_FAILED)
- return RPMRC_FAIL;
- xdb->mapped = mapped;
- xdb->mappedlen = mappedlen;
-+ xdb->mappedrw = rw;
- return RPMRC_OK;
- }
-
-@@ -247,7 +250,7 @@ static int rpmxdbReadHeaderRaw(rpmxdb xd
- return RPMRC_OK;
- }
-
--static int rpmxdbReadHeader(rpmxdb xdb)
-+static int rpmxdbReadHeader(rpmxdb xdb, int rw)
- {
- struct xdb_slot *slot;
- unsigned int slotnpages, pagesize, generation, usergeneration;
-@@ -261,6 +264,11 @@ static int rpmxdbReadHeader(rpmxdb xdb)
-
- if (xdb->mapped) {
- if (le2ha(xdb->mapped + XDB_OFFSET_GENERATION) == xdb->generation) {
-+ if (rw && !xdb->mappedrw) {
-+ unmapheader(xdb);
-+ if (mapheader(xdb, xdb->slotnpages, rw))
-+ return RPMRC_FAIL;
-+ }
- return RPMRC_OK;
- }
- unmapheader(xdb);
-@@ -273,9 +281,8 @@ static int rpmxdbReadHeader(rpmxdb xdb)
- if (stb.st_size % pagesize != 0)
- return RPMRC_FAIL;
- xdb->pagesize = pagesize;
-- xdb->mapflags = xdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE;
-
-- if (mapheader(xdb, slotnpages))
-+ if (mapheader(xdb, slotnpages, rw))
- return RPMRC_FAIL;
-
- /* read in all slots */
-@@ -368,6 +375,8 @@ static int rpmxdbReadHeader(rpmxdb xdb)
- nslot->mapcallback(xdb, nslot->mapcallbackdata, 0, 0);
- }
- }
-+ } else {
-+ nslot->mapped = slot->mapped;
- }
- }
- }
-@@ -382,17 +391,14 @@ static int rpmxdbReadHeader(rpmxdb xdb)
- return RPMRC_OK;
- }
-
--static int rpmxdbWriteHeader(rpmxdb xdb)
-+static void rpmxdbWriteHeader(rpmxdb xdb)
- {
-- if (!xdb->mapped)
-- return RPMRC_FAIL;
- h2lea(XDB_MAGIC, xdb->mapped + XDB_OFFSET_MAGIC);
- h2lea(XDB_VERSION, xdb->mapped + XDB_OFFSET_VERSION);
- h2lea(xdb->generation, xdb->mapped + XDB_OFFSET_GENERATION);
- h2lea(xdb->slotnpages, xdb->mapped + XDB_OFFSET_SLOTNPAGES);
- h2lea(xdb->pagesize, xdb->mapped + XDB_OFFSET_PAGESIZE);
- h2lea(xdb->usergeneration, xdb->mapped + XDB_OFFSET_USERGENERATION);
-- return RPMRC_OK;
- }
-
- static void rpmxdbUpdateSlot(rpmxdb xdb, struct xdb_slot *slot)
-@@ -473,19 +479,25 @@ static int rpmxdbInitInternal(rpmxdb xdb
- /* we use the master pdb for locking */
- static int rpmxdbLockOnly(rpmxdb xdb, int excl)
- {
-+ int rc;
- if (excl && xdb->rdonly)
- return RPMRC_FAIL;
-- return rpmpkgLock(xdb->pkgdb, excl);
-+ rc = rpmpkgLock(xdb->pkgdb, excl);
-+ if (!rc && excl)
-+ xdb->locked_excl++;
-+ return rc;
- }
-
--/* this is the same as rpmxdbLockReadHeader. It does the
-+/* This is similar to rpmxdbLockReadHeader. It does the
- * ReadHeader to sync the mappings if xdb moved some blobs.
-+ * Note that we just ask for rad-only access in the
-+ * rpmxdbReadHeader call.
- */
- int rpmxdbLock(rpmxdb xdb, int excl)
- {
- if (rpmxdbLockOnly(xdb, excl))
- return RPMRC_FAIL;
-- if (rpmxdbReadHeader(xdb)) {
-+ if (rpmxdbReadHeader(xdb, 0)) {
- rpmxdbUnlock(xdb, excl);
- return RPMRC_FAIL;
- }
-@@ -494,14 +506,25 @@ int rpmxdbLock(rpmxdb xdb, int excl)
-
- int rpmxdbUnlock(rpmxdb xdb, int excl)
- {
-+ if (excl && xdb->locked_excl) {
-+ xdb->locked_excl--;
-+ if (!xdb->locked_excl && xdb->mapped && xdb->mappedrw) {
-+ unmapheader(xdb);
-+ mapheader(xdb, xdb->slotnpages, 0);
-+ }
-+ }
- return rpmpkgUnlock(xdb->pkgdb, excl);
- }
-
-+/* Like rpmxdbLock, but map the header rw if excl is set.
-+ * This is what the functions in this module use, whereas
-+ * rpmidx uses rpmxdbLock.
-+ */
- static int rpmxdbLockReadHeader(rpmxdb xdb, int excl)
- {
- if (rpmxdbLockOnly(xdb, excl))
- return RPMRC_FAIL;
-- if (rpmxdbReadHeader(xdb)) {
-+ if (rpmxdbReadHeader(xdb, excl)) {
- rpmxdbUnlock(xdb, excl);
- return RPMRC_FAIL;
- }
-@@ -594,6 +617,8 @@ void rpmxdbClose(rpmxdb xdb)
- }
- if (xdb->slots)
- free(xdb->slots);
-+ if (xdb->mapped)
-+ unmapheader(xdb);
- if (xdb->fd >= 0)
- close(xdb->fd);
- if (xdb->filename)
-@@ -623,7 +648,8 @@ static int moveblobto(rpmxdb xdb, struct
- didmap = 0;
- oldpagecnt = oldslot->pagecnt;
- if (!oldslot->mapped && oldpagecnt) {
-- oldslot->mapflags = PROT_READ;
-+ if (!oldslot->mapcallback)
-+ oldslot->mapflags = PROT_READ;
- if (mapslot(xdb, oldslot))
- return RPMRC_FAIL;
- didmap = 1;
-@@ -772,7 +798,7 @@ static int addslotpage(rpmxdb xdb)
- return RPMRC_FAIL;
-
- /* remap the header */
-- if (mapheader(xdb, xdb->slotnpages + 1))
-+ if (mapheader(xdb, xdb->slotnpages + 1, xdb->mappedrw))
- return RPMRC_FAIL;
-
- /* update the header */
-@@ -852,7 +878,8 @@ int rpmxdbLookupBlob(rpmxdb xdb, unsigne
- {
- struct xdb_slot *slot;
- unsigned int i, nslots;
-- if (rpmxdbLockReadHeader(xdb, flags ? 1 : 0))
-+ int excl = flags ? 1 : 0;
-+ if (rpmxdbLockReadHeader(xdb, excl))
- return RPMRC_FAIL;
- nslots = xdb->nslots;
- slot = 0;
-@@ -865,18 +892,18 @@ int rpmxdbLookupBlob(rpmxdb xdb, unsigne
- i = 0;
- if (i && (flags & O_TRUNC) != 0) {
- if (rpmxdbResizeBlob(xdb, i, 0)) {
-- rpmxdbUnlock(xdb, flags ? 1 : 0);
-+ rpmxdbUnlock(xdb, excl);
- return RPMRC_FAIL;
- }
- }
- if (!i && (flags & O_CREAT) != 0) {
- if (createblob(xdb, &i, blobtag, subtag)) {
-- rpmxdbUnlock(xdb, flags ? 1 : 0);
-+ rpmxdbUnlock(xdb, excl);
- return RPMRC_FAIL;
- }
- }
- *idp = i;
-- rpmxdbUnlock(xdb, flags ? 1 : 0);
-+ rpmxdbUnlock(xdb, excl);
- return i ? RPMRC_OK : RPMRC_NOTFOUND;
- }
-
---- ./lib/rpmdb.c.orig 2020-04-03 10:24:27.954135180 +0000
-+++ ./lib/rpmdb.c 2020-04-14 09:48:23.304231127 +0000
-@@ -2622,6 +2622,7 @@ int rpmdbRebuild(const char * prefix, rp
- }
-
- rpmdbClose(olddb);
-+ dbCtrl(newdb, DB_CTRL_INDEXSYNC);
- rpmdbClose(newdb);
-
- if (failed) {
diff --git a/ndbglue.diff b/ndbglue.diff
new file mode 100644
index 0000000..872ba4f
--- /dev/null
+++ b/ndbglue.diff
@@ -0,0 +1,39 @@
+--- ./lib/backend/ndb/glue.c.orig 2021-01-05 15:36:03.097744355 +0000
++++ ./lib/backend/ndb/glue.c 2021-01-07 10:28:58.656228804 +0000
+@@ -311,12 +311,13 @@ static void setdata(dbiCursor dbc, unsi
+
+ static rpmRC ndb_pkgdbPut(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum, unsigned char *hdrBlob, unsigned int hdrLen)
+ {
++ struct ndbEnv_s *ndbenv = dbc->dbi->dbi_rpmdb->db_dbenv;
+ unsigned int hnum = *hdrNum;
+ int rc = RPMRC_OK;
+
+ if (hnum == 0) {
+ rc = rpmpkgNextPkgIdx(dbc->dbi->dbi_db, &hnum);
+- if (!rc)
++ if (!rc && ndbenv->hdrNum == hnum)
+ setdata(dbc, hnum, 0, 0);
+ }
+
+@@ -325,7 +326,8 @@ static rpmRC ndb_pkgdbPut(dbiIndex dbi,
+
+ if (!rc) {
+ dbc->hdrNum = hnum;
+- setdata(dbc, hnum, 0, 0);
++ if (ndbenv->hdrNum == hnum)
++ setdata(dbc, hnum, 0, 0);
+ *hdrNum = hnum;
+ }
+ return rc;
+@@ -333,8 +335,10 @@ static rpmRC ndb_pkgdbPut(dbiIndex dbi,
+
+ static rpmRC ndb_pkgdbDel(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum)
+ {
++ struct ndbEnv_s *ndbenv = dbc->dbi->dbi_rpmdb->db_dbenv;
+ dbc->hdrNum = 0;
+- setdata(dbc, 0, 0, 0);
++ if (ndbenv->hdrNum == hdrNum)
++ setdata(dbc, 0, 0, 0);
+ return rpmpkgDel(dbc->dbi->dbi_db, hdrNum);
+ }
+
diff --git a/nextiteratorheaderblob.diff b/nextiteratorheaderblob.diff
new file mode 100644
index 0000000..f35ec18
--- /dev/null
+++ b/nextiteratorheaderblob.diff
@@ -0,0 +1,68 @@
+--- ./lib/rpmdb.c.orig 2020-11-27 13:09:17.968992873 +0000
++++ ./lib/rpmdb.c 2020-11-27 13:14:21.524165780 +0000
+@@ -2679,6 +2679,48 @@ int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl
+ return dbctrl ? dbCtrl(db, dbctrl) : 1;
+ }
+
++const unsigned char *rpmdbNextIteratorHeaderBlob(rpmdbMatchIterator mi, unsigned int *size)
++{
++ dbiIndex dbi = NULL;
++ unsigned char * uh;
++ unsigned int uhlen;
++ int rc;
++ if (mi == NULL || mi->mi_re != NULL)
++ return NULL;
++ if (pkgdbOpen(mi->mi_db, 0, &dbi))
++ return NULL;
++ if (mi->mi_dbc == NULL)
++ mi->mi_dbc = dbiCursorInit(dbi, mi->mi_cflags);
++ miFreeHeader(mi, dbi);
++ uh = NULL;
++ uhlen = 0;
++ do {
++ if (mi->mi_set) {
++ if (!(mi->mi_setx < mi->mi_set->count))
++ return NULL;
++ mi->mi_offset = dbiIndexRecordOffset(mi->mi_set, mi->mi_setx);
++ mi->mi_filenum = dbiIndexRecordFileNumber(mi->mi_set, mi->mi_setx);
++ } else {
++ rc = pkgdbGet(dbi, mi->mi_dbc, 0, &uh, &uhlen);
++ if (rc == 0)
++ mi->mi_offset = pkgdbKey(dbi, mi->mi_dbc);
++
++ /* Terminate on error or end of keys */
++ if (rc || (mi->mi_setx && mi->mi_offset == 0))
++ return NULL;
++ }
++ mi->mi_setx++;
++ } while (mi->mi_offset == 0);
++ if (uh == NULL) {
++ rc = pkgdbGet(dbi, mi->mi_dbc, mi->mi_offset, &uh, &uhlen);
++ if (rc || uh == NULL)
++ return NULL;
++ }
++ if (size)
++ *size = uhlen;
++ return uh;
++}
++
+ char *rpmdbCookie(rpmdb db)
+ {
+ void *cookie = NULL;
+--- ./lib/rpmdb.h.orig 2020-11-27 13:09:17.968992873 +0000
++++ ./lib/rpmdb.h 2020-11-27 13:09:36.352942782 +0000
+@@ -253,6 +253,14 @@ int rpmdbStat(const char *prefix, struct
+ */
+ int rpmdbFStat(rpmdb db, struct stat *statbuf);
+
++/** \ingroup rpmdb
++ * Return next unverified package header blob from iteration.
++ * @param mi rpm database iterator
++ * @retval size header blob size in bytes
++ * @return NULL on end of iteration.
++ */
++const unsigned char *rpmdbNextIteratorHeaderBlob(rpmdbMatchIterator mi, unsigned int *size);
++
+ #ifdef __cplusplus
+ }
+ #endif
diff --git a/nobuildcolor.diff b/nobuildcolor.diff
index cee312f..c57834c 100644
--- a/nobuildcolor.diff
+++ b/nobuildcolor.diff
@@ -1,11 +1,11 @@
Disable file coloring for SUSE systems
---- build/rpmfc.c.orig 2013-07-12 12:12:45.000000000 +0000
-+++ build/rpmfc.c 2013-07-12 12:15:51.000000000 +0000
-@@ -1305,7 +1305,8 @@ rpmRC rpmfcGenerateDepends(const rpmSpec
- /* XXX Make sure only primary (i.e. Elf32/Elf64) colors are added. */
- for (int i = 0; i < fc->nfiles; i++)
- fc->fcolor[i] &= 0x0f;
+--- ./build/rpmfc.c.orig 2020-09-30 13:06:07.502865543 +0000
++++ ./build/rpmfc.c 2020-09-30 13:07:08.530734545 +0000
+@@ -1607,7 +1607,8 @@ rpmRC rpmfcGenerateDepends(const rpmSpec
+ goto exit;
+
+ /* Add per-file colors(#files) */
- headerPutUint32(pkg->header, RPMTAG_FILECOLORS, fc->fcolor, fc->nfiles);
+ if (rpmExpandNumeric("%{?_transaction_color}") != 0)
+ headerPutUint32(pkg->header, RPMTAG_FILECOLORS, fc->fcolor, fc->nfiles);
diff --git a/nomagiccheck.diff b/nomagiccheck.diff
index 7d56f44..2e54c89 100644
--- a/nomagiccheck.diff
+++ b/nomagiccheck.diff
@@ -1,13 +1,13 @@
Don't let rpm complain about a missing /etc/magic.mgc file
---- ./build/rpmfc.c.orig 2019-10-02 11:41:15.063357579 +0000
-+++ ./build/rpmfc.c 2019-10-02 11:41:42.583298884 +0000
-@@ -1065,7 +1065,7 @@ static int initAttrs(rpmfc fc)
+--- ./build/rpmfc.c.orig 2020-09-30 13:08:18.770584384 +0000
++++ ./build/rpmfc.c 2020-09-30 13:08:54.306508417 +0000
+@@ -1159,7 +1159,7 @@ static uint32_t getElfColor(const char *
rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
{
-- int msflags = MAGIC_CHECK | MAGIC_COMPRESS | MAGIC_NO_CHECK_TOKENS;
-+ int msflags = MAGIC_COMPRESS | MAGIC_NO_CHECK_TOKENS;
+- int msflags = MAGIC_CHECK | MAGIC_COMPRESS | MAGIC_NO_CHECK_TOKENS | MAGIC_ERROR;
++ int msflags = MAGIC_COMPRESS | MAGIC_NO_CHECK_TOKENS | MAGIC_ERROR;
+ int mimeflags = msflags | MAGIC_MIME_TYPE;
int nerrors = 0;
rpmRC rc = RPMRC_FAIL;
-
diff --git a/platformin.diff b/platformin.diff
index 12e6bf4..0d7a384 100644
--- a/platformin.diff
+++ b/platformin.diff
@@ -21,7 +21,7 @@
+@suse@%__chgrp_Rhf %{__chgrp} -Rhf
+@suse@%_fixowner [ `%{__id_u}` = '0' ] && %{__chown_Rhf} root
+@suse@%_fixgroup [ `%{__id_u}` = '0' ] && %{__chgrp_Rhf} root
-+@suse@%_fixperms %{__chmod} -Rf @FIXPERMS@
++@suse@%_fixperms %{__chmod} -Rf a+rX,u+w,g-w,o-w
+@suse@
+@suse@#---------------------------------------------------------------------
+@suse@# Expanded at start of %build
diff --git a/python-rpm.changes b/python-rpm.changes
index f427ace..1ded4f0 100644
--- a/python-rpm.changes
+++ b/python-rpm.changes
@@ -1,4 +1,9 @@
-------------------------------------------------------------------
+Wed Sep 30 14:17:40 CEST 2020 - mls@suse.de
+
+- update to rpm-4.16.0
+
+-------------------------------------------------------------------
Tue Nov 19 11:09:08 CET 2019 - mls@suse.de
- update to rpm-4.15.1
diff --git a/python-rpm.spec b/python-rpm.spec
index 093afb5..48c2934 100644
--- a/python-rpm.spec
+++ b/python-rpm.spec
@@ -1,7 +1,7 @@
#
# spec file for package python-rpm
#
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
# Copyright (c) 2017 Neal Gompa .
#
# All modifications and additions to the file contributed by third parties
@@ -21,7 +21,7 @@
%global with_python 1
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-rpm
-Version: 4.15.1
+Version: 4.16.0
Release: 0
Summary: Python Bindings for Manipulating RPM Packages
License: GPL-2.0-or-later
diff --git a/rpm-4.12.0.1-fix-bashisms.patch b/rpm-4.12.0.1-fix-bashisms.patch
deleted file mode 100644
index 719134a..0000000
--- a/rpm-4.12.0.1-fix-bashisms.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Ndur rpm-4.12.0.1/scripts/check-rpaths rpm-4.12.0.1-fix-bashisms/scripts/check-rpaths
---- rpm-4.12.0.1/scripts/check-rpaths 2014-06-30 11:47:14.000000000 +0300
-+++ rpm-4.12.0.1-fix-bashisms/scripts/check-rpaths 2014-11-30 04:51:05.189260640 +0200
-@@ -17,7 +17,7 @@
-
-
- test -z "$QA_SKIP_RPATHS" || {
-- echo $"WARNING: '\$QA_SKIP_RPATHS' is obsoleted by 'QA_RPATHS=[0-7]'" >&2
-+ echo "WARNING: '\$QA_SKIP_RPATHS' is obsoleted by 'QA_RPATHS=[0-7]'" >&2
- exit 0
- }
-
diff --git a/rpm-4.15.1.tar.bz2 b/rpm-4.15.1.tar.bz2
deleted file mode 120000
index 8a401d0..0000000
--- a/rpm-4.15.1.tar.bz2
+++ /dev/null
@@ -1 +0,0 @@
-/ipfs/bafybeiaxjf7pqu5giweeilarjd34wdxab7v5ucrsssoauxjje62fsepq7a
\ No newline at end of file
diff --git a/rpm-4.16.0.tar.bz2 b/rpm-4.16.0.tar.bz2
new file mode 120000
index 0000000..f410b60
--- /dev/null
+++ b/rpm-4.16.0.tar.bz2
@@ -0,0 +1 @@
+/ipfs/bafybeiddqsr5nxto5baptdsgrm5yrhobndpoctdgurzfcqohegidc3a7lq
\ No newline at end of file
diff --git a/rpm-shorten-changelog.diff b/rpm-shorten-changelog.diff
index db4aaff..39a48c0 100644
--- a/rpm-shorten-changelog.diff
+++ b/rpm-shorten-changelog.diff
@@ -1,6 +1,6 @@
---- ./build/pack.c.orig 2019-06-26 14:17:31.395985720 +0000
-+++ ./build/pack.c 2019-10-02 11:31:05.908639084 +0000
-@@ -743,11 +743,78 @@ static rpmRC packageBinary(rpmSpec spec,
+--- ./build/pack.c.orig 2020-09-30 12:49:33.397074156 +0000
++++ ./build/pack.c 2020-09-30 12:51:34.628805840 +0000
+@@ -728,6 +728,71 @@ static rpmRC packageBinary(rpmSpec spec,
return rc;
}
@@ -69,19 +69,21 @@
+ rpmtdFreeData(×td);
+}
+
- rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
- {
- rpmRC rc = RPMRC_OK;
- Package pkg;
+ static int compareBinaries(const void *p1, const void *p2) {
+ Package pkg1 = *(Package *)p1;
+ Package pkg2 = *(Package *)p2;
+@@ -751,6 +816,8 @@ rpmRC packageBinaries(rpmSpec spec, cons
+ Package *tasks;
+ int npkgs = 0;
+ trimChangelog(spec->packages->header);
+
- /* Run binary creation in parallel */
- #pragma omp parallel
- #pragma omp single
---- ./build/parseChangelog.c.orig 2019-06-26 14:17:31.395985720 +0000
-+++ ./build/parseChangelog.c 2019-10-02 11:29:26.684840735 +0000
-@@ -253,6 +253,11 @@ static rpmRC addChangelog(Header h, ARGV
+ for (pkg = spec->packages; pkg != NULL; pkg = pkg->next)
+ npkgs++;
+ tasks = xcalloc(npkgs, sizeof(Package));
+--- ./build/parseChangelog.c.orig 2020-08-31 09:14:07.991087349 +0000
++++ ./build/parseChangelog.c 2020-09-30 12:49:33.401074147 +0000
+@@ -267,6 +267,11 @@ static rpmRC addChangelog(Header h, ARGV
goto exit;
}
diff --git a/rpm.changes b/rpm.changes
index b0a9f2a..827c183 100644
--- a/rpm.changes
+++ b/rpm.changes
@@ -1,4 +1,63 @@
-------------------------------------------------------------------
+Mon Dec 21 16:29:40 CET 2020 - mls@suse.de
+
+- fix potential access of freed mem in ndb's glue code [bnc#1179416]
+ * new patch: ndbglue.diff
+
+-------------------------------------------------------------------
+Wed Nov 18 10:46:03 CET 2020 - mls@suse.de
+
+- allow opening the rpm database with an unset db_backend
+ * new patch: empty_dbbackend.diff
+
+-------------------------------------------------------------------
+Tue Oct 27 10:08:05 CET 2020 - Callum Farmer
+
+- RPM no longer ships config.sub and config.guess, just copy it
+ from Libtool since it is identical
+
+-------------------------------------------------------------------
+Tue Oct 27 10:07:05 CET 2020 - mls@suse.de
+
+- update to rpm-4.16.0
+ * powerful macro and %if expressions including ternary operator
+ and native version comparison
+ * optional MIME type based file classification
+ * dependency generation by parametric macros
+ * a new version parsing and comparison API in C and Python
+ * parallelise test-suite execution
+ * clarify RPM license
+- add method to iterate over header blobs
+ * new patch: nextiteratorheaderblob.diff
+- modified patches:
+ * brpcompress.diff
+ * brp-compress-no-img.patch
+ * brp.diff
+ * checkfilesnoinfodir.diff
+ * db_conversion.diff
+ * dbrointerruptable.diff
+ * findsupplements.diff
+ * ignore-auxv.diff
+ * macrosin.diff
+ * nobuildcolor.diff
+ * nomagiccheck.diff
+ * platformin.diff
+ * rpmqpack.diff
+ * rpm-shorten-changelog.diff
+ * suspendlock.diff
+- dropped patches:
+ * rpm-4.12.0.1-fix-bashisms.patch
+ * lazystatfs.diff
+ * db_ops_name.diff
+ * bdb_ro.diff
+ * disable_bdb.diff
+ * ndb_backport.diff
+ * initgcrypt.diff
+ * gcryptdsa2.diff
+ * ndb_backport2.diff
+ * touch_backport.diff
+
+-------------------------------------------------------------------
Mon Oct 19 11:53:00 CEST 2020 - mls@suse.de
- Backport FA_TOUCH fixes from upsteam [bnc#1175025] [bnc#1177428]
diff --git a/rpm.spec b/rpm.spec
index 8bea542..5cd2cf0 100644
--- a/rpm.spec
+++ b/rpm.spec
@@ -1,7 +1,7 @@
#
# spec file for package rpm
#
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -59,11 +59,11 @@ Requires: /usr/bin/awk
Summary: The RPM Package Manager
License: GPL-2.0-or-later
Group: System/Packages
-Version: 4.15.1
+Version: 4.16.0
Release: 0
URL: https://rpm.org/
#Git-Clone: https://github.com/rpm-software-management/rpm
-Source: http://ftp.rpm.org/releases/rpm-4.15.x/rpm-%{version}.tar.bz2
+Source: http://ftp.rpm.org/releases/rpm-4.16.x/rpm-%{version}.tar.bz2
Source1: RPM-HOWTO.tar.bz2
Source5: rpmsort
Source8: rpmconfigcheck
@@ -72,7 +72,6 @@ Source11: db-4.8.30.tar.bz2
Source12: baselibs.conf
Source13: rpmconfigcheck.service
Patch2: db.diff
-Patch3: rpm-4.12.0.1-fix-bashisms.patch
Patch5: usr-lib-sysimage-rpm.patch
# quilt patches start here
Patch11: debugedit.diff
@@ -104,7 +103,6 @@ Patch51: specfilemacro.diff
Patch55: debugsubpkg.diff
Patch56: debuglink.diff
Patch57: debuginfo-mono.patch
-Patch58: lazystatfs.diff
Patch60: safeugid.diff
Patch61: noprereqdeprec.diff
Patch66: remove-translations.diff
@@ -126,16 +124,11 @@ Patch102: emptymanifest.diff
Patch103: find-lang-qt-qm.patch
Patch109: pythondistdeps.diff
Patch117: findsupplements.diff
-Patch118: db_ops_name.diff
-Patch119: bdb_ro.diff
-Patch120: disable_bdb.diff
-Patch121: ndb_backport.diff
Patch122: db_conversion.diff
-Patch123: initgcrypt.diff
-Patch124: gcryptdsa2.diff
-Patch125: ndb_backport2.diff
-Patch126: touch_backport.diff
+Patch123: nextiteratorheaderblob.diff
Patch127: finddebuginfo-check-res-file.patch
+Patch128: empty_dbbackend.diff
+Patch129: ndbglue.diff
Patch6464: auto-config-update-aarch64-ppc64le.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#
@@ -237,6 +230,7 @@ Provides and requires generator for .pl files and modules.
%prep
%setup -q -n rpm-%{version}
rm -rf sqlite
+cp /usr/share/libtool/build-aux/config.guess /usr/share/libtool/build-aux/config.sub .
%if 0%{?!without_bdb:1}
tar xjf %{SOURCE11}
ln -s db-4.8.30 db
@@ -247,21 +241,19 @@ chmod -R u+w db/*
rm -f rpmdb/db.h
cp config.guess config.sub db/dist/
%endif
-%patch3 -p1
%patch5 -p1
%patch -P 11 -P 12 -P 13 -P 15 -P 16 -P 18
%patch -P 20 -P 21 -P 24 -P 25 -P 26 -P 27 -P 29
%patch -P 30 -P 32 -P 33 -P 34 -P 35 -P 36 -P 38
%patch -P 43 -P 45 -P 46 -P 47 -P 49
-%patch -P 51 -P 55 -P 56 -P 57 -P 58
+%patch -P 51 -P 55 -P 56 -P 57
%patch -P 60 -P 61 -P 66 -P 67 -P 68 -P 69
%patch -P 70 -P 71 -P 73 -P 75 -P 77 -P 78
%patch -P 85
%patch -P 93 -P 94 -P 99
%patch -P 100 -P 102 -P 103
%patch -P 109 -P 117
-%patch -P 118 -P 119 -P 120 -P 121 -P 122 -P 123 -P 124 -P 125
-%patch -P 126 -P 127
+%patch -P 122 -P 123 -P 127 -P 128 -P 129
%ifarch aarch64 ppc64le riscv64
%patch6464
@@ -352,7 +344,6 @@ mkdir -p %{buildroot}%{_fillupdir}
install -c -m0644 %{SOURCE9} %{buildroot}%{_fillupdir}/
rm -f %{buildroot}/usr/lib/rpm/cpanflute %{buildroot}/usr/lib/rpm/cpanflute2
install -m 755 %{SOURCE5} %{buildroot}/usr/lib/rpm
-install -m 755 scripts/debuginfo.prov %{buildroot}/usr/lib/rpm
rm -f %{buildroot}/usr/lib/locale %{buildroot}/usr/lib/rpmrc
mkdir -p %{buildroot}/etc/rpm
chmod 755 %{buildroot}/etc/rpm
@@ -484,7 +475,7 @@ fi
/usr/bin/rpmbuild
/usr/lib/rpm/libtooldeps.sh
/usr/lib/rpm/pkgconfigdeps.sh
-/usr/lib/rpm/pythondeps.sh
+/usr/lib/rpm/ocamldeps.sh
/usr/lib/rpm/elfdeps
/usr/lib/rpm/rpmdeps
/usr/lib/rpm/debugedit
diff --git a/rpmqpack.diff b/rpmqpack.diff
index 726d695..02f9a40 100644
--- a/rpmqpack.diff
+++ b/rpmqpack.diff
@@ -1,6 +1,6 @@
---- ./Makefile.am.orig 2017-12-01 15:04:09.723014378 +0000
-+++ ./Makefile.am 2017-12-01 15:04:13.396003910 +0000
-@@ -187,6 +187,10 @@ rpmgraph_LDADD = lib/librpm.la rpmio/lib
+--- ./Makefile.am.orig 2020-09-30 12:47:19.181371209 +0000
++++ ./Makefile.am 2020-09-30 12:47:25.797356566 +0000
+@@ -198,6 +198,10 @@ rpmgraph_LDADD = lib/librpm.la rpmio/lib
dist_bin_SCRIPTS = scripts/gendiff
@@ -11,19 +11,19 @@
rpmconfig_DATA = rpmrc
rpmrc: $(top_srcdir)/rpmrc.in
@$(SED) \
---- ./doc/Makefile.am.orig 2017-12-01 15:04:13.397003907 +0000
-+++ ./doc/Makefile.am 2017-12-01 15:04:42.681920389 +0000
+--- ./doc/Makefile.am.orig 2020-09-30 12:47:25.797356566 +0000
++++ ./doc/Makefile.am 2020-09-30 12:48:22.709230608 +0000
@@ -8,7 +8,7 @@ EXTRA_DIST += $(man_man1_DATA)
man_man8dir = $(mandir)/man8
man_man8_DATA = rpm.8 rpm-misc.8 rpmbuild.8 rpmdeps.8 rpmgraph.8 rpm2cpio.8
-man_man8_DATA += rpmdb.8 rpmkeys.8 rpmsign.8 rpmspec.8
+man_man8_DATA += rpmdb.8 rpmkeys.8 rpmsign.8 rpmspec.8 rpmqpack.8
- man_man8_DATA += rpm-plugin-systemd-inhibit.8
+
EXTRA_DIST += $(man_man8_DATA)
---- ./doc/rpmqpack.8.orig 2017-12-01 15:04:13.397003907 +0000
-+++ ./doc/rpmqpack.8 2017-12-01 15:04:13.397003907 +0000
+--- ./doc/rpmqpack.8.orig 2020-09-30 12:47:25.797356566 +0000
++++ ./doc/rpmqpack.8 2020-09-30 12:47:25.797356566 +0000
@@ -0,0 +1,25 @@
+.TH RPMQPACK 8 "Mar 2002"
+.SH NAME
@@ -50,8 +50,8 @@
+
+.SH AUTHOR
+Michael Schroeder
---- ./rpmqpack.c.orig 2019-12-06 10:14:03.989178873 +0000
-+++ ./rpmqpack.c 2019-12-06 10:32:16.430275015 +0000
+--- ./rpmqpack.c.orig 2020-09-30 12:47:25.797356566 +0000
++++ ./rpmqpack.c 2020-09-30 12:47:25.797356566 +0000
@@ -0,0 +1,60 @@
+#include
+#include
diff --git a/suspendlock.diff b/suspendlock.diff
index 6082f6f..3ac23cd 100644
--- a/suspendlock.diff
+++ b/suspendlock.diff
@@ -2,9 +2,9 @@ Suspend exclusive database lock when scriptlets get called, allowing
read access in scriptlets. Only needed for DB_PRIVATE (aka global)
locking.
---- ./lib/backend/db3.c.orig 2019-10-02 09:56:46.416347458 +0000
-+++ ./lib/backend/db3.c 2019-10-02 09:56:52.084335992 +0000
-@@ -552,6 +552,46 @@ static void db3_dbSetFSync(rpmdb rdb, in
+--- ./lib/backend/db3.c.orig 2020-09-30 12:25:06.516375109 +0000
++++ ./lib/backend/db3.c 2020-09-30 12:25:10.312366497 +0000
+@@ -549,6 +549,46 @@ static void db3_dbSetFSync(rpmdb rdb, in
static int db3_Ctrl(rpmdb rdb, dbCtrlOp ctrl)
{
@@ -51,9 +51,9 @@ locking.
return 0;
}
---- ./lib/backend/dbi.h.orig 2019-10-02 09:56:46.416347458 +0000
-+++ ./lib/backend/dbi.h 2019-10-02 09:56:52.084335992 +0000
-@@ -17,7 +17,9 @@ typedef enum dbCtrlOp_e {
+--- ./lib/backend/dbi.h.orig 2020-09-30 12:25:06.516375109 +0000
++++ ./lib/backend/dbi.h 2020-09-30 12:25:10.312366497 +0000
+@@ -18,7 +18,9 @@ typedef enum dbCtrlOp_e {
DB_CTRL_UNLOCK_RO = 2,
DB_CTRL_LOCK_RW = 3,
DB_CTRL_UNLOCK_RW = 4,
@@ -64,9 +64,9 @@ locking.
} dbCtrlOp;
typedef struct dbiIndex_s * dbiIndex;
---- ./lib/rpmdb.c.orig 2019-10-02 09:56:46.416347458 +0000
-+++ ./lib/rpmdb.c 2019-10-02 09:56:52.084335992 +0000
-@@ -2644,6 +2644,12 @@ int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl
+--- ./lib/rpmdb.c.orig 2020-09-30 12:25:06.516375109 +0000
++++ ./lib/rpmdb.c 2020-09-30 12:25:10.312366497 +0000
+@@ -2637,6 +2637,12 @@ int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl
case RPMDB_CTRL_INDEXSYNC:
dbctrl = DB_CTRL_INDEXSYNC;
break;
@@ -79,9 +79,9 @@ locking.
}
return dbctrl ? dbCtrl(db, dbctrl) : 1;
}
---- ./lib/rpmdb.h.orig 2019-06-26 14:17:31.412985694 +0000
-+++ ./lib/rpmdb.h 2019-10-02 09:56:52.088335984 +0000
-@@ -35,7 +35,9 @@ typedef enum rpmdbCtrlOp_e {
+--- ./lib/rpmdb.h.orig 2020-05-28 10:04:25.037136686 +0000
++++ ./lib/rpmdb.h 2020-09-30 12:25:10.312366497 +0000
+@@ -36,7 +36,9 @@ typedef enum rpmdbCtrlOp_e {
RPMDB_CTRL_UNLOCK_RO = 2,
RPMDB_CTRL_LOCK_RW = 3,
RPMDB_CTRL_UNLOCK_RW = 4,
@@ -92,17 +92,17 @@ locking.
} rpmdbCtrlOp;
/** \ingroup rpmdb
---- ./lib/transaction.c.orig 2019-10-02 09:56:52.088335984 +0000
-+++ ./lib/transaction.c 2019-10-02 09:58:36.956123870 +0000
-@@ -1601,6 +1601,7 @@ rpmRC runScript(rpmts ts, rpmte te, Head
+--- ./lib/transaction.c.orig 2020-09-30 07:48:01.215567727 +0000
++++ ./lib/transaction.c 2020-09-30 12:25:10.312366497 +0000
+@@ -1692,6 +1692,7 @@ rpmRC runScript(rpmts ts, rpmte te, Head
rpmTagVal stag = rpmScriptTag(script);
FD_t sfd = NULL;
int warn_only = !(rpmScriptFlags(script) & RPMSCRIPT_FLAG_CRITICAL);
+ rpmdb rdb = rpmtsGetRdb(ts);
- /* Create a temporary transaction element for triggers from rpmdb */
- if (te == NULL) {
-@@ -1612,10 +1613,12 @@ rpmRC runScript(rpmts ts, rpmte te, Head
+ if (rpmChrootIn())
+ return RPMRC_FAIL;
+@@ -1706,10 +1707,12 @@ rpmRC runScript(rpmts ts, rpmte te, Head
if (sfd == NULL)
sfd = rpmtsScriptFd(ts);
diff --git a/touch_backport.diff b/touch_backport.diff
deleted file mode 100644
index 1d753f7..0000000
--- a/touch_backport.diff
+++ /dev/null
@@ -1,64 +0,0 @@
---- ./lib/fsm.c.orig 2019-06-26 14:17:31.407985702 +0000
-+++ ./lib/fsm.c 2020-10-19 09:49:02.709129763 +0000
-@@ -926,10 +926,6 @@ int rpmPackageFilesInstall(rpmts ts, rpm
- if (!skip) {
- int setmeta = 1;
-
-- /* When touching we don't need any of this... */
-- if (action == FA_TOUCH)
-- goto touch;
--
- /* Directories replacing something need early backup */
- if (!suffix) {
- rc = fsmBackup(fi, action);
-@@ -941,6 +937,17 @@ int rpmPackageFilesInstall(rpmts ts, rpm
- rc = RPMERR_ENOENT;
- }
-
-+ /* See if the file was removed while our attention was elsewhere */
-+ if (rc == RPMERR_ENOENT && action == FA_TOUCH) {
-+ rpmlog(RPMLOG_DEBUG, "file %s vanished unexpectedly\n", fpath);
-+ action = FA_CREATE;
-+ fsmDebug(fpath, action, &sb);
-+ }
-+
-+ /* When touching we don't need any of this... */
-+ if (action == FA_TOUCH)
-+ goto touch;
-+
- if (S_ISREG(sb.st_mode)) {
- if (rc == RPMERR_ENOENT) {
- rc = fsmMkfile(fi, fpath, files, psm, nodigest,
---- ./lib/transaction.c.orig 2020-10-19 09:47:25.761418056 +0000
-+++ ./lib/transaction.c 2020-10-19 09:48:20.837254277 +0000
-@@ -483,13 +483,6 @@ static void handleInstInstalledFile(cons
- rpmfsSetAction(fs, fx, action);
- }
-
-- /* Skip already existing files - if 'minimize_writes' is set. */
-- if ((!isCfgFile) && (rpmfsGetAction(fs, fx) == FA_UNKNOWN) && ts->min_writes) {
-- if (rpmfileContentsEqual(otherFi, ofx, fi, fx)) {
-- rpmfsSetAction(fs, fx, FA_TOUCH);
-- }
-- }
--
- otherFileSize = rpmfilesFSize(otherFi, ofx);
-
- /* Only account for the last file of a hardlink set */
-@@ -499,6 +492,16 @@ static void handleInstInstalledFile(cons
-
- /* Add one to make sure the size is not zero */
- rpmfilesSetFReplacedSize(fi, fx, otherFileSize + 1);
-+
-+ /* Just touch already existing files if minimize_writes is enabled */
-+ if (ts->min_writes) {
-+ if ((!isCfgFile) && (rpmfsGetAction(fs, fx) == FA_UNKNOWN)) {
-+ /* XXX fsm can't handle FA_TOUCH of hardlinked files */
-+ int nolinks = (nlink == 1 && rpmfilesFNlink(fi, fx) == 1);
-+ if (nolinks && rpmfileContentsEqual(otherFi, ofx, fi, fx))
-+ rpmfsSetAction(fs, fx, FA_TOUCH);
-+ }
-+ }
- }
-
- /**