diff -dur systemtap-3.2.orig/configure.ac systemtap-3.2/configure.ac --- systemtap-3.2.orig/configure.ac 2017-11-13 10:02:17.000000000 +0100 +++ systemtap-3.2/configure.ac 2017-11-13 10:16:52.000000000 +0100 @@ -465,6 +465,19 @@ [AS_HELP_STRING([--with-rpm], [query rpm database for missing debuginfos])], [], [with_rpm="auto"]) if test "$with_rpm" != "no"; then + PKG_CHECK_MODULES([RPM], [rpm], [ + AC_DEFINE_UNQUOTED([HAVE_RPM],1,[Define if RPM backend is available]) + CPPFLAGS="$RPM_CFLAGS $CPPFLAGS" + stap_LIBS="$stap_LIBS $RPM_LIBS" + ], [ + AC_PATH_PROG(RPM_PATH,rpm,none) + if test "$RPM_PATH" = "none"; then + AC_MSG_ERROR([RPM executable was not found in your system]) + else + AC_DEFINE_UNQUOTED([HAVE_RPM],1,[Define if RPM backend is available]) + fi + ] +) AC_CHECK_LIB(rpm, rpmtsInitIterator, [ AC_DEFINE([HAVE_LIBRPM],[1],[have librpm]) stap_LIBS="$stap_LIBS -lc -lrpm" @@ -548,6 +548,9 @@ AC_CHECK_HEADERS([elfutils/version.h]) fi +CPPFLAGS="${CPPFLAGS} -I/usr/include/rpm" +LIBS="${LIBS} -lrpmdb" + dnl This is here mainly to make sure that configure --prefix=... changes dnl the config.h files so files depending on it are recompiled dnl prefix is passed through indirectly in the Makefile.am AM_CPPFLAGS. diff -dur systemtap-3.2.orig/rpm_finder.cxx systemtap-3.2/rpm_finder.cxx --- systemtap-3.2.orig/rpm_finder.cxx 2017-10-18 19:59:37.000000000 +0200 +++ systemtap-3.2/rpm_finder.cxx 2017-11-13 10:16:28.000000000 +0100 @@ -20,20 +20,22 @@ #ifdef HAVE_LIBRPM -extern "C" { - -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifndef xfree #define xfree free #endif -} - #if ! HAVE_LIBRPMIO && HAVE_NSS extern "C" { #include @@ -50,7 +52,7 @@ { static int rpm_init_done = 0; rpmts ts; - rpmdbMatchIterator mi; + rpmmi mi; int count = 0; if (filename == NULL) @@ -93,13 +95,15 @@ errmsg_t err; size_t rpminfolen = strlen(rpm_type); size_t srcrpmlen = sizeof (".src.rpm") - 1; - rpmdbMatchIterator mi_rpminfo; - h = rpmdbNextIterator(mi); + rpmmi mi_rpminfo; + h = rpmmiNext(mi); if (h == NULL) break; /* Verify the kernel file is not already installed. */ - rpminfo = headerFormat(h, header, &err); + char *nvra = rpmExpand("%{___NVRA}", NULL); + rpminfo = headerSprintf(h, header, rpmTagTable, rpmHeaderFormats, &err); + free(nvra); if (!rpminfo) { @@ -140,20 +144,21 @@ /* s = `-debuginfo-%{version}-%{release}.%{arch}' */ /* RPMDBI_PACKAGES requires keylen == sizeof (int). */ - /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */ - mi_rpminfo = rpmtsInitIterator(ts, (rpmTag) RPMDBI_LABEL, + /* RPMTAG_NVRA is an interface for NVR-based dbiFindByLabel(). */ + mi_rpminfo = rpmtsInitIterator(ts, (rpmTag) RPMTAG_NVRA, rpminfo, 0); if (mi_rpminfo) { - rpmdbFreeIterator(mi_rpminfo); + rpmmiFree(mi_rpminfo); count = 0; break; } /* The allocated memory gets utilized below for MISSING_RPM_HASH. */ if(strcmp(rpm_type,"-debuginfo")==0){ + char *nvra = rpmExpand("%{___NVRA}", NULL); xfree(rpminfo); - rpminfo = headerFormat(h, "%{name}-%{version}-%{release}.%{arch}", - &err); + rpminfo = headerSprintf(h, nvra, rpmTagTable, rpmHeaderFormats, &err); + free(nvra); } if (!rpminfo) { @@ -177,7 +182,7 @@ sess.rpms_to_install.insert(rpminfo); } count++; - rpmdbFreeIterator(mi); + rpmmiFree(mi); } rpmtsFree(ts);