RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmdb/ rpmtag.h tagname.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Thu 29 Nov 2007 - 20:15:19 CET
Message-Id: <20071129191519.17EFB34845E@rpm5.org>
  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
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.