summaryrefslogtreecommitdiff
path: root/lib/backend/db3.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/backend/db3.c')
-rw-r--r--lib/backend/db3.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/backend/db3.c b/lib/backend/db3.c
index 7f302a71a..bbf10bc85 100644
--- a/lib/backend/db3.c
+++ b/lib/backend/db3.c
@@ -401,6 +401,7 @@ static int db_init(rpmdb rdb, const char * dbhome)
int rc, xx;
int retry_open = 2;
int lockfd = -1;
+ int rdonly = ((rdb->db_mode & O_ACCMODE) == O_RDONLY);
struct dbConfig_s * cfg = &rdb->cfg;
/* This is our setup, thou shall not have other setups before us */
uint32_t eflags = (DB_CREATE|DB_INIT_MPOOL|DB_INIT_CDB);
@@ -469,7 +470,7 @@ static int db_init(rpmdb rdb, const char * dbhome)
*/
if (!(eflags & DB_PRIVATE)) {
lockfd = serialize_env(dbhome);
- if (lockfd < 0) {
+ if (lockfd < 0 && rdonly) {
eflags |= DB_PRIVATE;
retry_open--;
rpmlog(RPMLOG_DEBUG, "serialize failed, using private dbenv\n");
@@ -487,7 +488,10 @@ static int db_init(rpmdb rdb, const char * dbhome)
free(fstr);
rc = (dbenv->open)(dbenv, dbhome, eflags, rdb->db_perms);
- if ((rc == EACCES || rc == EROFS) || (rc == EINVAL && errno == rc)) {
+ if (rc == EINVAL && errno == rc) {
+ eflags |= DB_PRIVATE;
+ retry_open--;
+ } else if (rdonly && (rc == EACCES || rc == EROFS)) {
eflags |= DB_PRIVATE;
retry_open--;
} else {