diff options
Diffstat (limited to 'lib/backend/db3.c')
-rw-r--r-- | lib/backend/db3.c | 8 |
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 { |