RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: [EMAIL PROTECTED]
Module: rpm Date: 22-Oct-2007 04:45:38
Branch: HEAD Handle: 2007102203453800
Modified files:
rpm CHANGES
rpm/rpmdb header.c
Log:
- jbj: header.c: insturment headerGet{Entry,Extension} switch, debug
goop.
Summary:
Revision Changes Path
1.1753 +1 -0 rpm/CHANGES
1.110 +174 -94 rpm/rpmdb/header.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1752 -r1.1753 CHANGES
--- rpm/CHANGES 22 Oct 2007 01:59:30 -0000 1.1752
+++ rpm/CHANGES 22 Oct 2007 02:45:38 -0000 1.1753
@@ -1,4 +1,5 @@
4.5 -> 5.0:
+ - jbj: header.c: insturment headerGet{Entry,Extension} switch, debug
goop.
- jbj: rpmchecksig.c: wrap headerAddEntry. headerAddOrAppend next ...
- jbj: rpmfc.c: wrap headerAddEntry.
- jbj: psm.c: wrap headerAddEntry.
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.c
============================================================================
$ cvs diff -u -r1.109 -r1.110 header.c
--- rpm/rpmdb/header.c 21 Oct 2007 23:22:56 -0000 1.109
+++ rpm/rpmdb/header.c 22 Oct 2007 02:45:38 -0000 1.110
@@ -12,8 +12,6 @@
#define SUPPORT_SPRINTF_EXTTABLE 1
#endif
-static int _jbj = 0; /* XXX private debugging */
-
/* RPM - Copyright (C) 1995-2002 Red Hat Software */
/* Data written to file descriptors is in network byte order. */
@@ -33,10 +31,13 @@
int _hdr_debug = 0;
/[EMAIL PROTECTED]@*/
-int _newmagic = 0;
-
+int _newmagic = 0; /* XXX Change header magic? */
+/[EMAIL PROTECTED]@*/
+static int _jbj = 0; /* XXX private debugging */
/[EMAIL PROTECTED]@*/
-int _tagcache = 1;
+static int _usehge = 1; /* XXX Use headerGetExtension? */
+/[EMAIL PROTECTED]@*/
+int _tagcache = 1; /* XXX Cache tag data persistently? */
/[EMAIL PROTECTED] entryInfo @*/
/[EMAIL PROTECTED] indexEntry @*/
@@ -100,6 +101,109 @@
HV_t hdrVec; /* forward reference */
/**
+ * Automatically generated table of tag name/value pairs.
+ * @todo This should come from #include <rpmtag.h>.
+ */
+/[EMAIL PROTECTED]@*/
+/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/
+extern const struct headerTagTableEntry_s * rpmTagTable;
+/[EMAIL PROTECTED]@*/
+
+/**
+ * Number of entries in rpmTagTable.
+ * @todo This should come from #include <rpmtag.h>.
+ */
+/[EMAIL PROTECTED]@*/
+/[EMAIL PROTECTED]@*/
+extern const int rpmTagTableSize;
+
+/**
+ * @todo This should come from #include <rpmtag.h>.
+ */
+/[EMAIL PROTECTED]@*/
+/[EMAIL PROTECTED]@*/
+extern headerTagIndices rpmTags;
+/[EMAIL PROTECTED]@*/
+
+#if 0
+static void _valid(const void *ptr, size_t cnt)
+{
+ unsigned char * p = ptr;
+ unsigned xx;
+ int i;
+ for (i = 0; i < cnt; i++)
+ xx = p[i];
+}
+
+static void * _memset(void * s, int c, size_t n)
+{
+ _valid(s, n);
+ return memset(s, c, n);
+}
+
+static void * _memcpy(void * dest, void *src, size_t n)
+{
+ _valid(src, n);
+ _valid(dest, n);
+ return memcpy(dest, src, n);
+}
+
+static void * _memmove(void * dest, void *src, size_t n)
+{
+ _valid(src, n);
+ _valid(dest, n);
+ return memmove(dest, src, n);
+}
+#endif
+
+/**
+ * Return tag name from value.
+ * @todo This should come from #include <rpmtag.h>.
+ * @param tag tag value
+ * @return tag name, "(unknown)" on not found
+ */
+/[EMAIL PROTECTED]@*/
+/[EMAIL PROTECTED]@*/ static inline /[EMAIL PROTECTED]@*/
+const char * tagName(int tag)
+ /[EMAIL PROTECTED]/
+{
+/[EMAIL PROTECTED]@*/
+ return ((*rpmTags->tagName)(tag));
+/[EMAIL PROTECTED]@*/
+}
+
+/**
+ * Return tag data type from value.
+ * @todo This should come from #include <rpmtag.h>.
+ * @param tag tag value
+ * @return tag data type, RPM_NULL_TYPE on not found.
+ */
+/[EMAIL PROTECTED]@*/ static inline
+int tagType(int tag)
+ /[EMAIL PROTECTED]/
+{
+/[EMAIL PROTECTED]@*/
+ return ((*rpmTags->tagType)(tag));
+/[EMAIL PROTECTED]@*/
+}
+
+/**
+ * Return tag value from name.
+ * @todo This should come from #include <rpmtag.h>.
+ * @param tagstr name of tag
+ * @return tag value, -1 on not found
+ */
+/[EMAIL PROTECTED]@*/ static inline
+int tagValue(const char * tagstr)
+ /[EMAIL PROTECTED]/
+{
+/[EMAIL PROTECTED]@*/
+ return ((*rpmTags->tagValue)(tagstr));
+/[EMAIL PROTECTED]@*/
+}
+/[EMAIL PROTECTED]@*/
+
+/**
* Global header stats enabler.
*/
/[EMAIL PROTECTED]@*/
@@ -629,6 +733,7 @@
int driplen, ndrips;
int legacy = 0;
+fprintf(stderr, "==> headerUnload(%p, %p)\n", h, lenp);
if ((sw = headerGetStats(h, 18)) != NULL) /* RPMTS_OP_HDRLOAD */
(void) rpmswEnter(sw, 0);
@@ -1266,15 +1371,16 @@
/[EMAIL PROTECTED] h @*/
{
Header nh;
- /[EMAIL PROTECTED]@*/
- void * uh = headerUnload(h, NULL);
- const char * origin;
+ void * uh;
+ const char * origin = (h->origin != NULL ? xstrdup(h->origin) : NULL);
int_32 instance = h->instance;
int xx;
- origin = (h->origin != NULL ? xstrdup(h->origin) : NULL);
+fprintf(stderr, "==> headerReload(%p, %s)\n", h, tagName(tag));
+/[EMAIL PROTECTED]@*/
+ uh = headerUnload(h, NULL);
h = headerFree(h);
- /[EMAIL PROTECTED]@*/
+/[EMAIL PROTECTED]@*/
if (uh == NULL)
return NULL;
nh = headerLoad(uh);
@@ -1488,6 +1594,8 @@
rpmTagCount count = entry->info.count;
int rc = 1; /* XXX 1 on success. */
+if (_jbj)
+fprintf(stderr, "--> cpe(%p, %p, %p, %p)\n", entry, type, p, c);
if (p)
switch (entry->info.type) {
case RPM_BIN_TYPE:
@@ -1737,6 +1845,8 @@
indexEntry entry;
int rc;
+if (_jbj)
+fprintf(stderr, "--> ige(%p, %s, %p, %p, %p)\n", h, tagName(tag), type, p,
c);
/* First find the tag */
/[EMAIL PROTECTED]@*/ /*@ FIX: h modified by sort. */
entry = findEntry(h, tag, RPM_NULL_TYPE);
@@ -1789,78 +1899,6 @@
return NULL;
}
-/**
- * Automatically generated table of tag name/value pairs.
- * @todo This should come from #include <rpmtag.h>.
- */
-/[EMAIL PROTECTED]@*/
-/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/
-extern const struct headerTagTableEntry_s * rpmTagTable;
-/[EMAIL PROTECTED]@*/
-
-/**
- * Number of entries in rpmTagTable.
- * @todo This should come from #include <rpmtag.h>.
- */
-/[EMAIL PROTECTED]@*/
-/[EMAIL PROTECTED]@*/
-extern const int rpmTagTableSize;
-
-/**
- * @todo This should come from #include <rpmtag.h>.
- */
-/[EMAIL PROTECTED]@*/
-/[EMAIL PROTECTED]@*/
-extern headerTagIndices rpmTags;
-/[EMAIL PROTECTED]@*/
-
-/**
- * Return tag name from value.
- * @todo This should come from #include <rpmtag.h>.
- * @param tag tag value
- * @return tag name, "(unknown)" on not found
- */
-/[EMAIL PROTECTED]@*/
-/[EMAIL PROTECTED]@*/ static inline /[EMAIL PROTECTED]@*/
-const char * tagName(int tag)
- /[EMAIL PROTECTED]/
-{
-/[EMAIL PROTECTED]@*/
- return ((*rpmTags->tagName)(tag));
-/[EMAIL PROTECTED]@*/
-}
-
-/**
- * Return tag data type from value.
- * @todo This should come from #include <rpmtag.h>.
- * @param tag tag value
- * @return tag data type, RPM_NULL_TYPE on not found.
- */
-/[EMAIL PROTECTED]@*/ static inline
-int tagType(int tag)
- /[EMAIL PROTECTED]/
-{
-/[EMAIL PROTECTED]@*/
- return ((*rpmTags->tagType)(tag));
-/[EMAIL PROTECTED]@*/
-}
-
-/**
- * Return tag value from name.
- * @todo This should come from #include <rpmtag.h>.
- * @param tagstr name of tag
- * @return tag value, -1 on not found
- */
-/[EMAIL PROTECTED]@*/ static inline
-int tagValue(const char * tagstr)
- /[EMAIL PROTECTED]/
-{
-/[EMAIL PROTECTED]@*/
- return ((*rpmTags->tagValue)(tagstr));
-/[EMAIL PROTECTED]@*/
-}
-/[EMAIL PROTECTED]@*/
-
/** \ingroup header
* Retrieve extension or tag value.
*
@@ -1889,6 +1927,8 @@
int extNum;
int rc;
+if (_jbj)
+fprintf(stderr, "--> HGE(%p, %s, %p, %p, %p)\n", h, tagName(tag), type, p,
c);
if ((sw = headerGetStats(h, 19)) != NULL) /* RPMTS_OP_HDRGET */
(void) rpmswEnter(sw, 0);
@@ -1989,6 +2029,8 @@
void * sw;
int rc;
+if (_jbj)
+fprintf(stderr, "--> hge(%p, %s, %p, %p, %p)\n", h, tagName(tag), type, p,
c);
if ((sw = headerGetStats(h, 19)) != NULL) /* RPMTS_OP_HDRGET */
(void) rpmswEnter(sw, 0);
rc = intGetEntry(h, tag, type, p, c, 0);
@@ -2639,6 +2681,8 @@
indexEntry entry = NULL;
int rc;
+if (_jbj)
+fprintf(stderr, "--> hni(%p, %p, %p, %p, %p)\n", h, tag, type, p, c);
for (slot = hi->next_index; slot < h->indexUsed; slot++) {
entry = h->index + slot;
if (!ENTRY_IS_REGION(entry))
@@ -3189,6 +3233,20 @@
/[EMAIL PROTECTED] hsa, str, token, *endPtr @*/
/[EMAIL PROTECTED] maxSet(endPtr) >= 0 @*/;
+static void dumpSprintfTag(const char * msg, sprintfTag tag)
+{
+ if (msg)
+ fprintf(stderr, "%s", msg);
+ fprintf(stderr, " he %p %s", &tag->he, tagName(tag->tagno));
+ if (tag->fmt)
+ fprintf(stderr, " fmt %p", tag->fmt);
+ if (tag->ext)
+ fprintf(stderr, " ext %p[%d]", tag->ext, tag->extNum);
+ if (tag->format)
+ fprintf(stderr, " format \"%s\" pad %d", tag->format, tag->pad);
+}
+
+
/**
* Parse a headerSprintf term.
* @param hsa headerSprintf args
@@ -3435,12 +3493,16 @@
fprintf(stderr, " none(%d)", token->type);
break;
case PTOK_TAG:
-if (_jbj)
-fprintf(stderr, " tag(%d) %s format \"%s\" pad %d", token->type,
tagName(token->u.tag.tagno), token->u.tag.format, token->u.tag.pad);
+if (_jbj) {
+fprintf(stderr, " tag(%d)", token->type);
+dumpSprintfTag(" ", &token->u.tag);
+}
break;
case PTOK_ARRAY:
-if (_jbj)
+if (_jbj) {
fprintf(stderr, " array(%d)", token->type);
+dumpSprintfTag(" ", &token->u.array.format->u.tag);
+}
break;
case PTOK_STRING:
token->u.string.len = strlen(token->u.string.string);
@@ -3620,11 +3682,21 @@
} else
#endif /* SUPPORT_SPRINTF_EXTTABLE */
if (!he->avail || he->tag != tag->tagno) {
+if (_jbj)
+fprintf(stderr, " ---: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he,
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData,
he->avail);
he = rpmheClean(he);
he->tag = tag->tagno; /* XXX necessary? */
- xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, &he->c);
- if (xx && he->p.ptr != NULL)
- he->freeData = 1;
+if (_jbj)
+fprintf(stderr, " --+: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he,
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData,
he->avail);
+ if (_usehge) {
+ xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, &he->c);
+ if (xx && he->p.ptr != NULL)
+ he->freeData = 1;
+ } else {
+ xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c);
+ if (xx)
+ he = rpmheMark(he);
+ }
if (!xx) {
he->c = 1;
he->t = RPM_STRING_TYPE;
@@ -3757,8 +3829,8 @@
int i, j;
int numElements;
sprintfToken spft;
- sprintfTag tag;
- HE_t he;
+ sprintfTag tag = NULL;
+ HE_t he = NULL;
int condNumFormats;
size_t need;
int xx;
@@ -3827,9 +3899,15 @@
if (!he->avail || he->tag != tag->tagno) {
he = rpmheClean(he);
he->tag = tag->tagno;
- xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p,
&he->c);
- if (xx && he->p.ptr != NULL)
- he->freeData = 1;
+ if (_usehge) {
+ xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p,
&he->c);
+ if (xx && he->p.ptr != NULL)
+ he->freeData = 1;
+ } else {
+ xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p,
&he->c);
+ if (xx)
+ he = rpmheMark(he);
+ }
if (!xx)
continue;
if (_jbj)
@@ -3858,7 +3936,10 @@
numElements = 1;
/[EMAIL PROTECTED]@*/ break;
}
+ if (!_tagcache)
+ he = rpmheClean(he);
}
+ spft = token->u.array.format;
if (numElements == -1) {
#ifdef DYING /* XXX lots of pugly "(none)" lines with --conflicts. */
@@ -3874,7 +3955,6 @@
need = numElements * token->u.array.numTokens;
if (need == 0) break;
- spft = token->u.array.format;
tag = &spft->u.tag;
isxml = (spft->type == PTOK_TAG && tag->type != NULL &&
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository [email protected]