More rpm version compatibility fiddling in raptheader
authorPanu Matilainen <pmatilai@redhat.com>
Mon, 22 Dec 2008 20:33:16 +0000 (22:33 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Mon, 22 Dec 2008 20:33:16 +0000 (22:33 +0200)
- attempt to deal with old rpm versions where you dont really know if data
  was alloced or not except by "knowing", where types mismatch between
  headerGetEntry() and headerFreeData(), where headerGetRawEntry hasn't
  been declared but used anyway since 4.0 or whatever etc... SIGH

apt-pkg/rpm/raptheader.cc
apt-pkg/rpm/raptheader.h

index a176880..17dae5f 100644 (file)
@@ -1,8 +1,6 @@
 #include <config.h>
 #include <iostream>
 
-#include <rpm/rpmlegacy.h>
-#include <rpm/rpmtag.h>
 #include "raptheader.h"
 
 using namespace std;
@@ -102,33 +100,50 @@ bool raptHeader::getTag(raptTag tag, vector<raptInt> &data)
    return ret;
 }
 #else
+#if RPM_VERSION >= 0x040000
+// No prototype from rpm after 4.0.
+extern "C" {
+int headerGetRawEntry(Header h, raptTag tag, raptTagType * type,
+                      raptTagData p, raptTagCount *c);
+}
+#endif
+
 bool raptHeader::getTag(raptTag tag, vector<string> &data, bool raw)
 {
    bool ret = false;
    void *val = NULL;
+   int rc = 0;
    raptTagCount count = 0;
    raptTagType type = RPM_NULL_TYPE;
-   if (headerGetEntry(Hdr, tag, &type, (void **) &val, &count)) {
+   if (tag == RPMTAG_OLDFILENAMES) {
+      rc = rpmHeaderGetEntry(Hdr, tag, &type, (void **) &val, &count);
+   } else if (raw) {
+      rc = headerGetRawEntry(Hdr, tag, &type, (void **) &val, &count);
+   } else {
+      rc = headerGetEntry(Hdr, tag, &type, (void **) &val, &count);
+   }
+
+   if (rc) {
       switch (type) {
         case RPM_STRING_TYPE: {
-           const char *hdata = (const char *)val;
+           char *hdata = (char *)val;
            data.push_back(hdata);
            ret = true;
            break;
         }
         case RPM_STRING_ARRAY_TYPE:
         case RPM_I18NSTRING_TYPE: {
-           const char **hdata = (const char **)val;
+           char **hdata = (char **)val;
            for (int i = 0; i < count; i++) {
               data.push_back(hdata[i]);
            }
+           free(hdata);
            ret = true;
            break;
         }
         default: 
            break;
       }
-      headerFreeData(val, type);
    }
    return ret;
 }
@@ -147,7 +162,6 @@ bool raptHeader::getTag(raptTag tag, vector<raptInt> &data)
         }
         ret = true;
       }
-      headerFreeData(val, type);
    }
    return ret;
 }
index be7d0bf..3ecce5c 100644 (file)
@@ -4,9 +4,15 @@
 #include <vector>
 #include <string>
 
-#include <rpm/header.h>
 #include "rapttypes.h"
 
+#ifndef HAVE_RPM_RPMTAG_H
+#include <rpm/rpmlib.h>
+#else
+#include <rpm/header.h>
+#include <rpm/rpmtag.h>
+#endif
+
 using std::vector;
 using std::string;