RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: jbj@rpm5.org
Module: rpm Date: 29-Nov-2007 20:15:19
Branch: HEAD Handle: 2007112919151800
Modified files:
rpm CHANGES
rpm/rpmdb rpmtag.h tagname.c
Log:
- jbj: stub in arbitrary tag methods.
Summary:
Revision Changes Path
1.1897 +1 -0 rpm/CHANGES
1.19 +33 -9 rpm/rpmdb/rpmtag.h
1.17 +51 -5 rpm/rpmdb/tagname.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1896 -r1.1897 CHANGES
--- rpm/CHANGES 28 Nov 2007 00:19:44 -0000 1.1896
+++ rpm/CHANGES 29 Nov 2007 19:15:18 -0000 1.1897
@@ -1,4 +1,5 @@
5.0a2 -> 5.0a3:
+ - jbj: stub in arbitrary tag methods.
- jbj: fix: ditto, for *.src.rpm as well.
- jbj: fix: RPMTAG_BUILDTIME is type RPM_UINT32_TYPE, not RPM_STRING_TYPE.
- jbj: fix: getBuildTime returns uint32_t *, not uint32_t.
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/rpmtag.h
============================================================================
$ cvs diff -u -r1.18 -r1.19 rpmtag.h
--- rpm/rpmdb/rpmtag.h 26 Nov 2007 21:05:57 -0000 1.18
+++ rpm/rpmdb/rpmtag.h 29 Nov 2007 19:15:18 -0000 1.19
@@ -501,23 +501,30 @@
struct headerTagIndices_s {
int (*loadIndex) (headerTagTableEntry ** ipp, int * np,
int (*cmp) (const void * avp, const void * bvp))
- /*@ modifies *ipp, *np */; /*!< load sorted tag index. */
+ /*@ modifies *ipp, *np */; /*!< Load sorted tag index. */
/*@relnull@*/
- headerTagTableEntry * byName; /*!< header tags sorted by name. */
- int byNameSize; /*!< no. of entries. */
+ headerTagTableEntry * byName; /*!< rpmTag's sorted by name. */
+ int byNameSize; /*!< No. of entries. */
int (*byNameCmp) (const void * avp, const void * bvp)
- /*@*/; /*!< compare entries by name. */
+ /*@*/; /*!< Compare entries by name. */
rpmTag (*tagValue) (const char * name)
- /*@*/; /* return value from name. */
+ /*@*/; /* Return value from name. */
/*@relnull@*/
- headerTagTableEntry * byValue; /*!< header tags sorted by value. */
- int byValueSize; /*!< no. of entries. */
+ headerTagTableEntry * byValue; /*!< rpmTag's sorted by value. */
+ int byValueSize; /*!< No. of entries. */
int (*byValueCmp) (const void * avp, const void * bvp)
- /*@*/; /*!< compare entries by value. */
+ /*@*/; /*!< Compare entries by value. */
const char * (*tagName) (rpmTag value)
/*@*/; /* Return name from value. */
rpmTag (*tagType) (rpmTag value)
/*@*/; /* Return type from value. */
+/*@owned@*/ /*@relnull@*/
+ char * nameBuf; /* Name buffer. */
+/*@only@*/
+ char * (*tagCanonicalize) (const char * s)
+ /*@*/; /* Canonicalize an arbitrary string. */
+ rpmTag (*tagGenerate) (const char * s)
+ /*@*/; /* Generate value from name. */
};
#endif
#endif /* _RPMTAG_INTERNAL */
@@ -543,12 +550,29 @@
/**
* Return tag value from name.
* @param tagstr name of tag
- * @return tag value, -1 on not found
+ * @return tag value, 0xffffffff on not found
*/
rpmTag tagValue(const char * tagstr)
/*@*/;
/**
+ * Canonicalize a rpmTag string.
+ * @param s string
+ * @return canonicalized string
+ */
+/*@only@*/
+char * tagCanonicalize(const char * s)
+ /*@*/;
+
+/**
+ * Generate a tag from arbitrary string.
+ * @param s string
+ * @return generated tag value
+ */
+rpmTag tagGenerate(const char * s)
+ /*@*/;
+
+/**
* Free memory in header tag indices.
* @param _rpmTags header tag indices (NULL uses rpmTags)
*/
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/tagname.c
============================================================================
$ cvs diff -u -r1.16 -r1.17 tagname.c
--- rpm/rpmdb/tagname.c 24 Nov 2007 18:48:16 -0000 1.16
+++ rpm/rpmdb/tagname.c 29 Nov 2007 19:15:18 -0000 1.17
@@ -4,7 +4,7 @@
#include "system.h"
-#include <rpmio.h> /* XXX xtolower, xstrcasecmp */
+#include <rpmio_internal.h> /* XXX DIGEST_CTX, xtolower, xstrcasecmp */
#define _RPMTAG_INTERNAL
#include <rpmtag.h>
#include "debug.h"
@@ -75,6 +75,31 @@
return 0;
}
+static char * _tagCanonicalize(const char * s)
+ /*@*/
+{
+ return xstrdup(s);
+}
+
+static rpmTag _tagGenerate(const char *s)
+ /*@*/
+{
+ DIGEST_CTX ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
+ const char * digest = NULL;
+ size_t digestlen = 0;
+ size_t nb = strlen(s);
+ rpmTag tag = 0;
+
+ rpmDigestUpdate(ctx, s, nb);
+ rpmDigestFinal(ctx, &digest, &digestlen, 0);
+ if (digest && digestlen > 4) {
+ memcpy(&tag, digest + (digestlen - 4), 4);
+ tag &= 0x3fffffff;
+ tag |= 0x40000000;
+ }
+ digest = _free(digest);
+ return tag;
+}
/* forward refs */
static const char * _tagName(rpmTag tag)
@@ -89,6 +114,7 @@
tagLoadIndex,
NULL, 0, tagCmpName, _tagValue,
NULL, 0, tagCmpValue, _tagName, _tagType,
+ NULL, _tagCanonicalize, _tagGenerate
};
/*@-compmempass@*/
@@ -230,7 +256,10 @@
static rpmTag _tagValue(const char * tagstr)
{
headerTagTableEntry t;
- int comparison, i, l, u;
+ int comparison;
+ size_t i, l, u;
+ const char * s;
+ rpmTag tag;
int xx;
if (!xstrcasecmp(tagstr, "Packages"))
@@ -253,7 +282,7 @@
if (_rpmTags.byName == NULL)
xx = tagLoadIndex(&_rpmTags.byName, &_rpmTags.byNameSize, tagCmpName);
if (_rpmTags.byName == NULL)
- return 0xffffffff; /* XXX arbitrary tags */
+ goto exit;
l = 0;
u = _rpmTags.byNameSize;
@@ -268,9 +297,15 @@
else if (comparison > 0)
l = i + 1;
else
- return (unsigned int)t->val;
+ return t->val;
}
- return 0xffffffff; /* XXX arbitrary tags */
+
+exit:
+ /* Generate an arbitrary tag string. */
+ s = _tagCanonicalize(tagstr);
+ tag = _tagGenerate(s);
+ s = _free(s);
+ return tag;
}
const char * tagName(rpmTag tag)
@@ -288,11 +323,22 @@
return ((*rpmTags->tagValue)(tagstr));
}
+char * tagCanoincalize(const char * s)
+{
+ return ((*rpmTags->tagCanonicalize)(s));
+}
+
+rpmTag tagGenerate(const char * s)
+{
+ return ((*rpmTags->tagGenerate)(s));
+}
+
void tagClean(headerTagIndices _rpmTags)
{
if (_rpmTags == NULL)
_rpmTags = rpmTags;
if (_rpmTags) {
+ _rpmTags->nameBuf = _free(_rpmTags->nameBuf);
_rpmTags->byName = _free(_rpmTags->byName);
_rpmTags->byValue = _free(_rpmTags->byValue);
}
@@ .
Received on Thu Nov 29 20:15:19 2007