Imported Upstream version 0.7.11
[platform/upstream/libsolv.git] / ext / repo_rpmdb_librpm.h
index b50a4b5..34e6698 100644 (file)
@@ -20,10 +20,10 @@ struct rpmdbstate {
   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 */
@@ -43,21 +43,22 @@ access_rootdir(struct rpmdbstate *state, const char *dir, int mode)
 }
 
 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;
@@ -66,11 +67,11 @@ stat_database(struct rpmdbstate *state, struct stat *statbuf)
   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);
@@ -92,11 +93,12 @@ stat_database(struct rpmdbstate *state, struct stat *statbuf)
 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();
@@ -194,33 +196,7 @@ getinstalledrpmdbids(struct rpmdbstate *state, const char *index, const char *ma
 }
 
 #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 */
@@ -248,7 +224,7 @@ getrpm_dbid(struct rpmdbstate *state, Id rpmdbid)
       rpmdbFreeIterator(mi);
       return 0;
     }
-  if (!rpm_byrpmhdrblob(state, uh, uhlen))
+  if (!headfromhdrblob(state, uh, uhlen))
     {
       rpmdbFreeIterator(mi);
       return -1;
@@ -307,7 +283,7 @@ pkgdb_cursor_getrpm(struct rpmdbstate *state)
   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;
     }