xx = cvtdberr(dbi, "dbenv->set_mp_mmapsize", xx, _debug);
}
if (dbi->dbi_tmpdir) {
+ /* XXX this isn't correct wrt chroot in+out */
const char * root = rpmdb->db_chrootDone ? NULL : rpmdb->db_root;
char * tmpdir = rpmGenPath(root, dbi->dbi_tmpdir, NULL);
xx = dbenv->set_tmp_dir(dbenv, tmpdir);
static int db3close(dbiIndex dbi, unsigned int flags)
{
rpmdb rpmdb = dbi->dbi_rpmdb;
- const char * root = rpmdb->db_chrootDone ? NULL : rpmdb->db_root;
- char * dbhome;
+ const char * dbhome = rpmdbHome(rpmdb);
DB * db = dbi->dbi_db;
int _printit;
int rc = 0, xx;
flags = 0; /* XXX unused */
- /*
- * Get the prefix/root component and directory path.
- */
- dbhome = rpmGenPath(root, rpmdb->db_home, NULL);
-
if (db) {
rc = db->close(db, 0);
/* XXX ignore not found error messages. */
(dbi->dbi_verbose & DB_VERB_WAITSFOR));
if (dbi->dbi_tmpdir) {
+ /* XXX this isn't correct wrt chroot in+out */
+ const char * root = rpmdb->db_chrootDone ? NULL : rpmdb->db_root;
char * tmpdir = rpmGenPath(root, dbi->dbi_tmpdir, NULL);
rc = dbenv->set_tmp_dir(dbenv, tmpdir);
rc = cvtdberr(dbi, "dbenv->set_tmp_dir", rc, _debug);
exit:
dbi->dbi_db = NULL;
- free(dbhome);
-
dbi = db3Free(dbi);
return rc;
static int db3open(rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
{
extern const struct _dbiVec db3vec;
- const char * root = rpmdb->db_chrootDone ? NULL : rpmdb->db_root;
- char * dbhome;
+ const char *dbhome = rpmdbHome(rpmdb);
dbiIndex dbi = NULL;
int rc = 0;
int xx;
if ((dbi = db3New(rpmdb, rpmtag)) == NULL)
return 1;
- /*
- * Get the prefix/root component and directory path.
- */
- dbhome = rpmGenPath(root, rpmdb->db_home, NULL);
-
oflags = (dbi->dbi_oeflags | dbi->dbi_oflags);
oflags &= ~DB_TRUNCATE; /* XXX this is dangerous */
(void) db3close(dbi, 0);
}
- free(dbhome);
-
return rc;
}
#define _DB_ROOT "/"
#define _DB_HOME "%{_dbpath}"
+#define _DB_FULLPATH NULL
#define _DB_FLAGS 0
#define _DB_MODE 0
#define _DB_PERMS 0644
#define _DB_ERRPFX "rpmdb"
static struct rpmdb_s const dbTemplate = {
- _DB_ROOT, _DB_HOME, _DB_FLAGS, _DB_MODE, _DB_PERMS,
+ _DB_ROOT, _DB_HOME, _DB_FULLPATH, _DB_FLAGS, _DB_MODE, _DB_PERMS,
_DB_MAJOR, _DB_ERRPFX
};
return op;
}
+const char *rpmdbHome(rpmdb db)
+{
+ const char *dbdir = NULL;
+ if (db) {
+ dbdir = db->db_chrootDone ? db->db_home : db->db_fullpath;
+ }
+ return dbdir;
+}
+
int rpmdbSetChrootDone(rpmdb db, int chrootDone)
{
int ochrootDone = 0;
db->db_errpfx = _free(db->db_errpfx);
db->db_root = _free(db->db_root);
db->db_home = _free(db->db_home);
+ db->db_fullpath = _free(db->db_fullpath);
db->db_bits = PBM_FREE(db->db_bits);
db->_dbi = _free(db->_dbi);
return NULL;
}
db->db_root = rpmGetPath((root && *root) ? root : _DB_ROOT, NULL);
+ db->db_fullpath = rpmGenPath(db->db_root, db->db_home, NULL);
db->db_errpfx = rpmExpand( (epfx && *epfx ? epfx : _DB_ERRPFX), NULL);
/* XXX remove environment after chrooted operations, for now... */
db->db_remove_env = (!rstreq(db->db_root, "/") ? 1 : 0);
struct rpmdb_s {
char * db_root;/*!< path prefix */
char * db_home;/*!< directory path */
+ char * db_fullpath; /*!< full db path including prefix */
int db_flags;
int db_mode; /*!< open mode */
int db_perms; /*!< open permissions */
unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno);
/** \ingroup rpmdb
+ * Return rpmdb home directory (depending on chroot state)
+ * param db rpmdb handle
+ * return db home directory (or NULL on error)
+ */
+RPM_GNUC_INTERNAL
+const char *rpmdbHome(rpmdb db);
+
+/** \ingroup rpmdb
* Return database iterator.
* @param mi rpm database iterator
* @param keyp key data (NULL for sequential access)