1 --- pcp-3.9.6/configure.ac.orig 2014-05-28 22:05:42.575179206 +0200
2 +++ pcp-3.9.6/configure.ac 2014-05-30 20:21:36.818374363 +0200
5 AC_MSG_CHECKING([for rpmlib > 4.4.2])
7 - [AC_LANG_PROGRAM([[#include <rpm/header.h>]],
8 - [[(void)HEADERGET_EXT;]])],
9 + [AC_LANG_PROGRAM([[#include <rpm/rpmtypes.h>]],
10 + [[(void)RPMSCRIPT_PREIN;]])],
14 --- pcp-3.9.4/src/pmdas/rpm/GNUmakefile.orig 2014-04-15 11:10:23.000000000 +0200
15 +++ pcp-3.9.4/src/pmdas/rpm/GNUmakefile 2014-06-01 07:52:17.205709769 +0200
16 @@ -31,9 +31,9 @@ VERSION_SCRIPT = exports
17 LSRCFILES = Install Remove pmns root help
18 LDIRT = domain.h $(IAM).log $(VERSION_SCRIPT)
21 +LIB_FOR_RPM = -lrpm -lrpmdb -lrpmio
22 LLDLIBS = $(PCP_PMDALIB) $(LIB_FOR_RPM) $(LIB_FOR_PTHREADS)
23 -LCFLAGS = $(INVISIBILITY)
24 +LCFLAGS = $(INVISIBILITY) -I/usr/include/rpm
28 --- pcp-3.9.4/src/pmdas/rpm/rpm.c.orig 2014-04-15 11:10:23.000000000 +0200
29 +++ pcp-3.9.4/src/pmdas/rpm/rpm.c 2014-06-01 07:51:37.589043928 +0200
35 #include <sys/inotify.h>
36 -#include <rpm/rpmlib.h>
37 -#include <rpm/header.h>
38 +#include <rpm/rpm46compat.h>
39 #include <rpm/rpmts.h>
40 #include <rpm/rpmdb.h>
41 #include <pcp/pmapi.h>
42 @@ -436,7 +436,7 @@ rpm_extract_metadata(const char *name, r
43 m->license = dict_insert(rpm_extract_string(td, h, RPMTAG_LICENSE));
44 m->packager = dict_insert(rpm_extract_string(td, h, RPMTAG_PACKAGER));
45 m->release = dict_insert(rpm_extract_string(td, h, RPMTAG_RELEASE));
46 - m->longsize = rpm_extract_value(td, h, RPMTAG_LONGSIZE);
47 + m->longsize = rpm_extract_value(td, h, RPMTAG_PACKAGESIZE);
48 m->sourcerpm = dict_insert(rpm_extract_string(td, h, RPMTAG_SOURCERPM));
49 m->summary = dict_insert(rpm_extract_string(td, h, RPMTAG_SUMMARY));
50 m->url = dict_insert(rpm_extract_string(td, h, RPMTAG_URL));
51 @@ -444,6 +444,157 @@ rpm_extract_metadata(const char *name, r
52 m->version = dict_insert(rpm_extract_string(td, h, RPMTAG_VERSION));
56 +static char *rstrscat(char **dest, const char *arg, ...)
59 + size_t arg_size, dst_size;
63 + dst = dest ? *dest : NULL;
65 + if ( arg == NULL ) {
70 + for (arg_size=0, s=arg; s; s = va_arg(ap, const char *))
71 + arg_size += strlen(s);
74 + dst_size = dst ? strlen(dst) : 0;
75 + dst = realloc(dst, dst_size+arg_size+1); /* include '\0' */
79 + for (s = arg; s; s = va_arg(ap, const char *)) {
80 + size_t size = strlen(s);
81 + memmove(p, s, size);
94 +static const char * headerGetString(Header h, int32_t tag)
96 + const char *res = NULL;
99 + if (headerGet(h, tag, &td, HEADERGET_MINMEM)) {
100 + if (rpmtdCount(&td) == 1) {
101 + res = rpmtdGetString(&td);
103 + rpmtdFreeData(&td);
108 +static int rasprintf(char **strp, const char *fmt, ...)
118 + n = vsnprintf(NULL, 0, fmt, ap);
125 + n = vsnprintf(p, nb, fmt, ap);
132 +static uint64_t rpmtdGetNumber(rpmtd td)
135 + int ix = (td->ix >= 0 ? td->ix : 0);
137 + switch (td->type) {
138 + case RPM_INT64_TYPE:
139 + val = *((uint64_t *) td->data + ix);
141 + case RPM_INT32_TYPE:
142 + val = *((uint32_t *) td->data + ix);
144 + case RPM_INT16_TYPE:
145 + val = *((uint16_t *) td->data + ix);
147 + case RPM_INT8_TYPE:
148 + val = *((uint8_t *) td->data + ix);
156 +static char * headerGetNumericAsString(Header h, int32_t tag)
161 + if (headerGet(h, tag, &td, HEADERGET_EXT)) {
162 + if (rpmtdCount(&td) == 1) {
163 + rasprintf(&res, "%" PRIu64, rpmtdGetNumber(&td));
165 + rpmtdFreeData(&td);
170 +static int headerIsSource(Header h)
172 + return (!headerIsEntry(h, RPMTAG_SOURCERPM));
175 +char *getNEVRA(Header h)
177 + const char *val = NULL;
181 + val = headerGetString(h, RPMTAG_NAME);
182 + if (val) rstrscat(&res, val, "-", NULL);
185 + char *e = headerGetNumericAsString(h, RPMTAG_EPOCH);
186 + if (e) rstrscat(&res, e, ":", NULL);
190 + val = headerGetString(h, RPMTAG_VERSION);
191 + if (val) rstrscat(&res, val, "-", NULL);
194 + val = headerGetString(h, RPMTAG_RELEASE);
195 + if (val) rstrscat(&res, val, NULL);
198 + val = headerGetString(h, RPMTAG_ARCH);
199 + if (headerIsSource(h) && val == NULL) val = "src";
200 + if (val) rstrscat(&res, ".", val, NULL);
207 * Refresh the RPM package names and values in the cache.
208 * This is to be only ever invoked from a single thread.
209 @@ -470,7 +621,8 @@ rpm_update_cache(void *ptr)
210 * since the only (?) thing that can fail is memory allocation, which
211 * rpmlib internally maps to an exit(1).
214 + td = malloc(sizeof(*td));
218 if (rpmReadConfigFiles_p == 0) {
219 @@ -483,8 +635,7 @@ rpm_update_cache(void *ptr)
220 /* Iterate through the entire list of RPMs, extract names and values */
221 mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
222 while ((h = rpmdbNextIterator(mi)) != NULL) {
223 - headerGet(h, RPMTAG_NEVRA, td, HEADERGET_EXT | HEADERGET_MINMEM);
224 - const char *name = rpmtdGetString(td);
225 + char *name = getNEVRA(h);
229 @@ -522,10 +673,13 @@ rpm_update_cache(void *ptr)
232 pthread_mutex_unlock(&indom_mutex);
236 rpmdbFreeIterator(mi);
241 pthread_mutex_lock(&indom_mutex);