char *rootdir;
RpmHead *rpmhead; /* header storage space */
- int rpmheadsize;
+ unsigned int rpmheadsize;
int dbenvopened; /* database environment opened */
- int is_ostree; /* read-only db that lives in /usr/share/rpm */
+ const char *dbpath; /* path to the database */
rpmts ts;
rpmdbMatchIterator mi; /* iterator over packages database */
}
static void
-detect_ostree(struct rpmdbstate *state)
+detect_dbpath(struct rpmdbstate *state)
{
- state->is_ostree = access_rootdir(state, "/var/lib/rpm", W_OK) == -1 &&
- access_rootdir(state, "/usr/share/rpm/Packages", R_OK) == 0 ? 1 : -1;
+ state->dbpath = access_rootdir(state, "/var/lib/rpm", W_OK) == -1
+ && access_rootdir(state, "/usr/share/rpm/Packages", R_OK) == 0
+ ? "/usr/share/rpm" : "/var/lib/rpm";
}
static int
stat_database(struct rpmdbstate *state, struct stat *statbuf)
{
static const char *dbname[] = {
- "Packages",
- "Packages.db",
- "rpmdb.sqlite",
- "data.mdb",
- "Packages", /* for error reporting */
+ "/Packages",
+ "/Packages.db",
+ "/rpmdb.sqlite",
+ "/data.mdb",
+ "/Packages", /* for error reporting */
0,
};
int i;
if (state->dbenvopened == 1)
return rpmdbFStat(rpmtsGetRdb(state->ts), statbuf);
#endif
- if (!state->is_ostree)
- detect_ostree(state);
+ if (!state->dbpath)
+ detect_dbpath(state);
for (i = 0; ; i++)
{
- char *dbpath = solv_dupjoin(state->rootdir, state->is_ostree > 0 ? "/usr/share/rpm/" : "/var/lib/rpm/", dbname[i]);
+ char *dbpath = solv_dupjoin(state->rootdir, state->dbpath, dbname[i]);
if (!stat(dbpath, statbuf))
{
free(dbpath);
static int
opendbenv(struct rpmdbstate *state)
{
- const char *rootdir = state->rootdir;
rpmts ts;
char *dbpath;
- detect_ostree(state);
- dbpath = solv_dupjoin("_dbpath ", rootdir, state->is_ostree > 0 ? "/usr/share/rpm" : "/var/lib/rpm");
+
+ if (!state->dbpath)
+ detect_dbpath(state);
+ dbpath = solv_dupjoin("_dbpath ", state->rootdir, state->dbpath);
rpmDefineMacro(NULL, dbpath, 0);
solv_free(dbpath);
ts = rpmtsCreate();
}
#if defined(HAVE_RPMDBNEXTITERATORHEADERBLOB) && !defined(ENABLE_RPMPKG_LIBRPM)
-static int
-rpm_byrpmhdrblob(struct rpmdbstate *state, const unsigned char *data, unsigned int size)
-{
- unsigned int dsize, cnt, len;
- RpmHead *rpmhead;
- if (size < 8)
- return pool_error(state->pool, 0, "corrupt rpm database (size)");
- cnt = getu32(data);
- dsize = getu32(data + 4);
- if (cnt >= MAX_HDR_CNT || dsize >= MAX_HDR_DSIZE)
- return pool_error(state->pool, 0, "corrupt rpm database (cnt/dcnt)");
- if (8 + cnt * 16 + dsize > size)
- return pool_error(state->pool, 0, "corrupt rpm database (data size)");
- len = 16 * cnt + dsize;
- if (len + 1 > state->rpmheadsize)
- {
- state->rpmheadsize = len + 128;
- state->rpmhead = solv_realloc(state->rpmhead, sizeof(*state->rpmhead) + state->rpmheadsize);
- }
- rpmhead = state->rpmhead;
- memcpy(rpmhead->data, data + 8, len);
- rpmhead->data[len] = 0;
- rpmhead->cnt = cnt;
- rpmhead->dcnt = dsize;
- rpmhead->dp = rpmhead->data + cnt * 16;
- return 1;
-}
+static int headfromhdrblob(struct rpmdbstate *state, const unsigned char *data, unsigned int size);
#endif
/* retrive header by rpmdbid, returns 0 if not found, -1 on error */
rpmdbFreeIterator(mi);
return 0;
}
- if (!rpm_byrpmhdrblob(state, uh, uhlen))
+ if (!headfromhdrblob(state, uh, uhlen))
{
rpmdbFreeIterator(mi);
return -1;
while ((uh = rpmdbNextIteratorHeaderBlob(state->mi, &uhlen)) != 0)
{
Id dbid = rpmdbGetIteratorOffset(state->mi);
- if (!rpm_byrpmhdrblob(state, uh, uhlen))
+ if (!headfromhdrblob(state, uh, uhlen))
continue;
return dbid;
}